openplanter 0.1.3 → 0.2.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.
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +5 -0
- package/dist/engine.js.map +1 -1
- package/dist/investigation-tools/advanced-analytics.d.ts +130 -0
- package/dist/investigation-tools/advanced-analytics.d.ts.map +1 -0
- package/dist/investigation-tools/advanced-analytics.js +340 -0
- package/dist/investigation-tools/advanced-analytics.js.map +1 -0
- package/dist/investigation-tools/blockchain-scanner.d.ts +83 -0
- package/dist/investigation-tools/blockchain-scanner.d.ts.map +1 -0
- package/dist/investigation-tools/blockchain-scanner.js +194 -0
- package/dist/investigation-tools/blockchain-scanner.js.map +1 -0
- package/dist/investigation-tools/crypto-ecosystem.d.ts +83 -0
- package/dist/investigation-tools/crypto-ecosystem.d.ts.map +1 -0
- package/dist/investigation-tools/crypto-ecosystem.js +124 -0
- package/dist/investigation-tools/crypto-ecosystem.js.map +1 -0
- package/dist/investigation-tools/dexscreener-pairs.d.ts +41 -0
- package/dist/investigation-tools/dexscreener-pairs.d.ts.map +1 -0
- package/dist/investigation-tools/dexscreener-pairs.js +60 -0
- package/dist/investigation-tools/dexscreener-pairs.js.map +1 -0
- package/dist/investigation-tools/document-processing.d.ts +78 -0
- package/dist/investigation-tools/document-processing.d.ts.map +1 -0
- package/dist/investigation-tools/document-processing.js +252 -0
- package/dist/investigation-tools/document-processing.js.map +1 -0
- package/dist/investigation-tools/dune-analytics.d.ts +47 -0
- package/dist/investigation-tools/dune-analytics.d.ts.map +1 -0
- package/dist/investigation-tools/dune-analytics.js +160 -0
- package/dist/investigation-tools/dune-analytics.js.map +1 -0
- package/dist/investigation-tools/global-registries.d.ts +86 -0
- package/dist/investigation-tools/global-registries.d.ts.map +1 -0
- package/dist/investigation-tools/global-registries.js +212 -0
- package/dist/investigation-tools/global-registries.js.map +1 -0
- package/dist/investigation-tools/government-records.d.ts +85 -0
- package/dist/investigation-tools/government-records.d.ts.map +1 -0
- package/dist/investigation-tools/government-records.js +170 -0
- package/dist/investigation-tools/government-records.js.map +1 -0
- package/dist/investigation-tools/index.d.ts +18 -0
- package/dist/investigation-tools/index.d.ts.map +1 -1
- package/dist/investigation-tools/index.js +19 -0
- package/dist/investigation-tools/index.js.map +1 -1
- package/dist/investigation-tools/investigation-automation.d.ts +144 -0
- package/dist/investigation-tools/investigation-automation.d.ts.map +1 -0
- package/dist/investigation-tools/investigation-automation.js +345 -0
- package/dist/investigation-tools/investigation-automation.js.map +1 -0
- package/dist/investigation-tools/monitoring-tools.d.ts +102 -0
- package/dist/investigation-tools/monitoring-tools.d.ts.map +1 -0
- package/dist/investigation-tools/monitoring-tools.js +214 -0
- package/dist/investigation-tools/monitoring-tools.js.map +1 -0
- package/dist/investigation-tools/political-finance.d.ts +114 -0
- package/dist/investigation-tools/political-finance.d.ts.map +1 -0
- package/dist/investigation-tools/political-finance.js +205 -0
- package/dist/investigation-tools/political-finance.js.map +1 -0
- package/dist/investigation-tools/polymarket-markets.d.ts +137 -0
- package/dist/investigation-tools/polymarket-markets.d.ts.map +1 -0
- package/dist/investigation-tools/polymarket-markets.js +303 -0
- package/dist/investigation-tools/polymarket-markets.js.map +1 -0
- package/dist/investigation-tools/prediction-markets.d.ts +52 -0
- package/dist/investigation-tools/prediction-markets.d.ts.map +1 -0
- package/dist/investigation-tools/prediction-markets.js +116 -0
- package/dist/investigation-tools/prediction-markets.js.map +1 -0
- package/dist/investigation-tools/sec-tools.d.ts +75 -0
- package/dist/investigation-tools/sec-tools.d.ts.map +1 -0
- package/dist/investigation-tools/sec-tools.js +192 -0
- package/dist/investigation-tools/sec-tools.js.map +1 -0
- package/dist/investigation-tools/shared-crypto.d.ts +50 -0
- package/dist/investigation-tools/shared-crypto.d.ts.map +1 -0
- package/dist/investigation-tools/shared-crypto.js +122 -0
- package/dist/investigation-tools/shared-crypto.js.map +1 -0
- package/dist/investigation-tools/social-intelligence.d.ts +91 -0
- package/dist/investigation-tools/social-intelligence.d.ts.map +1 -0
- package/dist/investigation-tools/social-intelligence.js +302 -0
- package/dist/investigation-tools/social-intelligence.js.map +1 -0
- package/dist/investigation-tools/tool-registry.d.ts +12 -0
- package/dist/investigation-tools/tool-registry.d.ts.map +1 -0
- package/dist/investigation-tools/tool-registry.js +399 -0
- package/dist/investigation-tools/tool-registry.js.map +1 -0
- package/dist/investigation-tools/wallet-clusterer.d.ts +28 -0
- package/dist/investigation-tools/wallet-clusterer.d.ts.map +1 -0
- package/dist/investigation-tools/wallet-clusterer.js +179 -0
- package/dist/investigation-tools/wallet-clusterer.js.map +1 -0
- package/dist/tool-defs.d.ts.map +1 -1
- package/dist/tool-defs.js +301 -0
- package/dist/tool-defs.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tool-registry.ts — TypeScript-native tool dispatch registry.
|
|
3
|
+
*
|
|
4
|
+
* Maps tool names to async handler functions for the 55 new investigation tools.
|
|
5
|
+
* Called from the engine when the tool name matches a registered TS tool.
|
|
6
|
+
*/
|
|
7
|
+
import * as polymarket from "./polymarket-markets.js";
|
|
8
|
+
import * as predictionMarkets from "./prediction-markets.js";
|
|
9
|
+
import * as dune from "./dune-analytics.js";
|
|
10
|
+
import * as blockchain from "./blockchain-scanner.js";
|
|
11
|
+
import * as dex from "./dexscreener-pairs.js";
|
|
12
|
+
import * as walletCluster from "./wallet-clusterer.js";
|
|
13
|
+
import * as sec from "./sec-tools.js";
|
|
14
|
+
import * as political from "./political-finance.js";
|
|
15
|
+
import * as registries from "./global-registries.js";
|
|
16
|
+
import * as government from "./government-records.js";
|
|
17
|
+
import * as social from "./social-intelligence.js";
|
|
18
|
+
import * as analytics from "./advanced-analytics.js";
|
|
19
|
+
import * as docProcessing from "./document-processing.js";
|
|
20
|
+
import * as automation from "./investigation-automation.js";
|
|
21
|
+
import * as monitoring from "./monitoring-tools.js";
|
|
22
|
+
import * as crypto from "./crypto-ecosystem.js";
|
|
23
|
+
function jsonResult(result) {
|
|
24
|
+
return JSON.stringify(result, null, 2);
|
|
25
|
+
}
|
|
26
|
+
export const TS_TOOL_REGISTRY = {
|
|
27
|
+
// ── Polymarket & Prediction Markets ────────────────────────────
|
|
28
|
+
polymarket_markets_fetcher: async (args) => jsonResult(await polymarket.fetchMarkets({
|
|
29
|
+
category: args.category,
|
|
30
|
+
minVolume: args.min_volume != null ? Number(args.min_volume) : undefined,
|
|
31
|
+
active: args.active !== false,
|
|
32
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
33
|
+
test: Boolean(args.test),
|
|
34
|
+
})),
|
|
35
|
+
polymarket_leaderboard: async (args) => jsonResult(await polymarket.fetchLeaderboard({
|
|
36
|
+
period: args.period,
|
|
37
|
+
topN: args.top_n != null ? Number(args.top_n) : undefined,
|
|
38
|
+
test: Boolean(args.test),
|
|
39
|
+
})),
|
|
40
|
+
polymarket_whales: async (args) => jsonResult(await polymarket.fetchWhales({
|
|
41
|
+
minUsd: args.min_usd != null ? Number(args.min_usd) : undefined,
|
|
42
|
+
daysBack: args.days_back != null ? Number(args.days_back) : undefined,
|
|
43
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
44
|
+
test: Boolean(args.test),
|
|
45
|
+
})),
|
|
46
|
+
polymarket_trades_history: async (args) => jsonResult(await polymarket.fetchTradesHistory({
|
|
47
|
+
marketId: args.market_id,
|
|
48
|
+
wallet: args.wallet,
|
|
49
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
50
|
+
test: Boolean(args.test),
|
|
51
|
+
})),
|
|
52
|
+
polymarket_resolutions: async (args) => jsonResult(await polymarket.fetchResolutions({
|
|
53
|
+
dateFrom: args.date_from,
|
|
54
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
55
|
+
test: Boolean(args.test),
|
|
56
|
+
})),
|
|
57
|
+
polymarket_anomaly_scanner: async (args) => jsonResult(await polymarket.scanAnomalies({
|
|
58
|
+
category: args.category,
|
|
59
|
+
hoursBack: args.hours_back != null ? Number(args.hours_back) : undefined,
|
|
60
|
+
minSeverity: args.min_severity,
|
|
61
|
+
test: Boolean(args.test),
|
|
62
|
+
})),
|
|
63
|
+
kalshi_markets: async (args) => jsonResult(await predictionMarkets.fetchKalshiMarkets({
|
|
64
|
+
category: args.category,
|
|
65
|
+
status: args.status,
|
|
66
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
67
|
+
test: Boolean(args.test),
|
|
68
|
+
})),
|
|
69
|
+
predictit_markets: async (args) => jsonResult(await predictionMarkets.fetchPredictItMarkets({
|
|
70
|
+
category: args.category,
|
|
71
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
72
|
+
test: Boolean(args.test),
|
|
73
|
+
})),
|
|
74
|
+
manifold_markets: async (args) => jsonResult(await predictionMarkets.fetchManifoldMarkets({
|
|
75
|
+
term: args.term,
|
|
76
|
+
sort: args.sort,
|
|
77
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
78
|
+
test: Boolean(args.test),
|
|
79
|
+
})),
|
|
80
|
+
// ── Blockchain / Crypto ────────────────────────────────────────
|
|
81
|
+
dune_query_executor: async (args) => jsonResult(await dune.executeDuneQuery({
|
|
82
|
+
queryId: args.query_id != null ? Number(args.query_id) : undefined,
|
|
83
|
+
sql: args.sql,
|
|
84
|
+
parameters: args.parameters,
|
|
85
|
+
apiKey: args.api_key,
|
|
86
|
+
test: Boolean(args.test),
|
|
87
|
+
})),
|
|
88
|
+
dune_polymarket: async (args) => jsonResult(await dune.dunePolymarket({
|
|
89
|
+
metric: args.metric,
|
|
90
|
+
daysBack: args.days_back != null ? Number(args.days_back) : undefined,
|
|
91
|
+
apiKey: args.api_key,
|
|
92
|
+
test: Boolean(args.test),
|
|
93
|
+
})),
|
|
94
|
+
polygonscan_wallet: async (args) => jsonResult(await blockchain.scanPolygonWallet({
|
|
95
|
+
address: String(args.address ?? ""),
|
|
96
|
+
apiKey: args.api_key,
|
|
97
|
+
test: Boolean(args.test),
|
|
98
|
+
})),
|
|
99
|
+
etherscan_wallet: async (args) => jsonResult(await blockchain.scanEtherscanWallet({
|
|
100
|
+
address: String(args.address ?? ""),
|
|
101
|
+
resolveEns: args.resolve_ens !== false,
|
|
102
|
+
apiKey: args.api_key,
|
|
103
|
+
test: Boolean(args.test),
|
|
104
|
+
})),
|
|
105
|
+
blockchain_tx_tracer: async (args) => jsonResult(await blockchain.traceTransactions({
|
|
106
|
+
address: String(args.address ?? ""),
|
|
107
|
+
direction: args.direction,
|
|
108
|
+
maxDepth: args.max_depth != null ? Number(args.max_depth) : undefined,
|
|
109
|
+
chain: args.chain,
|
|
110
|
+
apiKey: args.api_key,
|
|
111
|
+
test: Boolean(args.test),
|
|
112
|
+
})),
|
|
113
|
+
dexscreener_pairs: async (args) => jsonResult(await dex.fetchDexPairs({
|
|
114
|
+
query: args.query,
|
|
115
|
+
chain: args.chain,
|
|
116
|
+
tokenAddress: args.token_address,
|
|
117
|
+
pairAddress: args.pair_address,
|
|
118
|
+
test: Boolean(args.test),
|
|
119
|
+
})),
|
|
120
|
+
wallet_clusterer: async (args) => jsonResult(await walletCluster.clusterWallets({
|
|
121
|
+
wallets: Array.isArray(args.wallets) ? args.wallets.map(String) : [],
|
|
122
|
+
chain: args.chain,
|
|
123
|
+
apiKey: args.api_key,
|
|
124
|
+
minConfidence: args.min_confidence != null ? Number(args.min_confidence) : undefined,
|
|
125
|
+
test: Boolean(args.test),
|
|
126
|
+
})),
|
|
127
|
+
// ── SEC / US Financial ─────────────────────────────────────────
|
|
128
|
+
sec_form4_parser: async (args) => jsonResult(await sec.parseForm4({
|
|
129
|
+
ticker: args.ticker,
|
|
130
|
+
cik: args.cik,
|
|
131
|
+
filerName: args.filer_name,
|
|
132
|
+
daysBack: args.days_back != null ? Number(args.days_back) : undefined,
|
|
133
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
134
|
+
test: Boolean(args.test),
|
|
135
|
+
})),
|
|
136
|
+
sec_edgar_filer: async (args) => jsonResult(await sec.searchEdgarFilings({
|
|
137
|
+
query: String(args.query ?? ""),
|
|
138
|
+
formType: args.form_type,
|
|
139
|
+
dateFrom: args.date_from,
|
|
140
|
+
dateTo: args.date_to,
|
|
141
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
142
|
+
test: Boolean(args.test),
|
|
143
|
+
})),
|
|
144
|
+
sec_whistleblower_awards: async (args) => jsonResult(await sec.fetchWhistleblowerAwards({
|
|
145
|
+
year: args.year != null ? Number(args.year) : undefined,
|
|
146
|
+
test: Boolean(args.test),
|
|
147
|
+
})),
|
|
148
|
+
// ── Political Finance ──────────────────────────────────────────
|
|
149
|
+
fec_contributions: async (args) => jsonResult(await political.fetchFecContributions({
|
|
150
|
+
contributorName: args.contributor_name,
|
|
151
|
+
employerName: args.employer_name,
|
|
152
|
+
committeeName: args.committee_name,
|
|
153
|
+
candidateId: args.candidate_id,
|
|
154
|
+
minAmount: args.min_amount != null ? Number(args.min_amount) : undefined,
|
|
155
|
+
state: args.state,
|
|
156
|
+
apiKey: args.api_key,
|
|
157
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
158
|
+
test: Boolean(args.test),
|
|
159
|
+
})),
|
|
160
|
+
opensecrets_lobbying: async (args) => jsonResult(await political.fetchLobbyingRecords({
|
|
161
|
+
clientName: args.client_name,
|
|
162
|
+
registrantName: args.registrant_name,
|
|
163
|
+
issue: args.issue,
|
|
164
|
+
year: args.year != null ? Number(args.year) : undefined,
|
|
165
|
+
apiKey: args.api_key,
|
|
166
|
+
test: Boolean(args.test),
|
|
167
|
+
})),
|
|
168
|
+
congress_disclosures: async (args) => jsonResult(await political.fetchCongressDisclosures({
|
|
169
|
+
memberName: args.member_name,
|
|
170
|
+
ticker: args.ticker,
|
|
171
|
+
chamber: args.chamber,
|
|
172
|
+
party: args.party,
|
|
173
|
+
daysBack: args.days_back != null ? Number(args.days_back) : undefined,
|
|
174
|
+
test: Boolean(args.test),
|
|
175
|
+
})),
|
|
176
|
+
political_donation_tracker: async (args) => jsonResult(await political.trackPoliticalDonations({
|
|
177
|
+
donorName: args.donor_name,
|
|
178
|
+
recipientName: args.recipient_name,
|
|
179
|
+
country: args.country,
|
|
180
|
+
minAmount: args.min_amount != null ? Number(args.min_amount) : undefined,
|
|
181
|
+
apiKey: args.api_key,
|
|
182
|
+
test: Boolean(args.test),
|
|
183
|
+
})),
|
|
184
|
+
// ── Global Registries ──────────────────────────────────────────
|
|
185
|
+
opencorporates_lookup: async (args) => jsonResult(await registries.lookupCorporate({
|
|
186
|
+
query: String(args.query ?? ""),
|
|
187
|
+
jurisdiction: args.jurisdiction,
|
|
188
|
+
companyNumber: args.company_number,
|
|
189
|
+
apiKey: args.api_key,
|
|
190
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
191
|
+
test: Boolean(args.test),
|
|
192
|
+
})),
|
|
193
|
+
ofac_sanctions_checker: async (args) => jsonResult(await registries.checkSanctions({
|
|
194
|
+
name: String(args.name ?? ""),
|
|
195
|
+
entityType: args.entity_type,
|
|
196
|
+
country: args.country,
|
|
197
|
+
threshold: args.threshold != null ? Number(args.threshold) : undefined,
|
|
198
|
+
test: Boolean(args.test),
|
|
199
|
+
})),
|
|
200
|
+
beneficial_ownership_tracer: async (args) => jsonResult(await registries.traceBeneficialOwnership({
|
|
201
|
+
companyName: String(args.company_name ?? ""),
|
|
202
|
+
jurisdiction: args.jurisdiction,
|
|
203
|
+
apiKey: args.api_key,
|
|
204
|
+
test: Boolean(args.test),
|
|
205
|
+
})),
|
|
206
|
+
// ── Government Records ─────────────────────────────────────────
|
|
207
|
+
us_court_docket: async (args) => jsonResult(await government.searchCourtDockets({
|
|
208
|
+
query: String(args.query ?? ""),
|
|
209
|
+
court: args.court,
|
|
210
|
+
dateFiled: args.date_filed,
|
|
211
|
+
natureOfSuit: args.nature_of_suit,
|
|
212
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
213
|
+
test: Boolean(args.test),
|
|
214
|
+
})),
|
|
215
|
+
federal_contracts: async (args) => jsonResult(await government.searchFederalContracts({
|
|
216
|
+
recipientName: args.recipient_name,
|
|
217
|
+
awardingAgency: args.awarding_agency,
|
|
218
|
+
keyword: args.keyword,
|
|
219
|
+
minAmount: args.min_amount != null ? Number(args.min_amount) : undefined,
|
|
220
|
+
fiscalYear: args.fiscal_year != null ? Number(args.fiscal_year) : undefined,
|
|
221
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
222
|
+
test: Boolean(args.test),
|
|
223
|
+
})),
|
|
224
|
+
foia_request_builder: (args) => jsonResult(government.buildFoiaRequest({
|
|
225
|
+
agency: String(args.agency ?? ""),
|
|
226
|
+
subject: String(args.subject ?? ""),
|
|
227
|
+
keywords: Array.isArray(args.keywords) ? args.keywords.map(String) : [],
|
|
228
|
+
dateFrom: args.date_from,
|
|
229
|
+
dateTo: args.date_to,
|
|
230
|
+
requestType: args.request_type,
|
|
231
|
+
test: Boolean(args.test),
|
|
232
|
+
})),
|
|
233
|
+
// ── Social Intelligence ────────────────────────────────────────
|
|
234
|
+
twitter_market_mentions: async (args) => jsonResult(await social.searchTwitterMentions({
|
|
235
|
+
query: String(args.query ?? ""),
|
|
236
|
+
ticker: args.ticker,
|
|
237
|
+
daysBack: args.days_back != null ? Number(args.days_back) : undefined,
|
|
238
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
239
|
+
test: Boolean(args.test),
|
|
240
|
+
})),
|
|
241
|
+
reddit_wsb_scanner: async (args) => jsonResult(await social.scanRedditWsb({
|
|
242
|
+
ticker: args.ticker,
|
|
243
|
+
subreddit: args.subreddit,
|
|
244
|
+
sort: args.sort,
|
|
245
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
246
|
+
test: Boolean(args.test),
|
|
247
|
+
})),
|
|
248
|
+
discord_channel_scraper: async (args) => jsonResult(await social.scrapeDiscord({
|
|
249
|
+
serverId: args.server_id,
|
|
250
|
+
channelId: args.channel_id,
|
|
251
|
+
webhookUrl: args.webhook_url,
|
|
252
|
+
keyword: args.keyword,
|
|
253
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
254
|
+
test: Boolean(args.test),
|
|
255
|
+
})),
|
|
256
|
+
telegram_channel_monitor: async (args) => jsonResult(await social.monitorTelegram({
|
|
257
|
+
channelName: String(args.channel_name ?? ""),
|
|
258
|
+
keyword: args.keyword,
|
|
259
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
260
|
+
test: Boolean(args.test),
|
|
261
|
+
})),
|
|
262
|
+
news_sentiment_fetcher: async (args) => jsonResult(await social.fetchNewsSentiment({
|
|
263
|
+
query: String(args.query ?? ""),
|
|
264
|
+
ticker: args.ticker,
|
|
265
|
+
daysBack: args.days_back != null ? Number(args.days_back) : undefined,
|
|
266
|
+
sources: Array.isArray(args.sources) ? args.sources.map(String) : undefined,
|
|
267
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
268
|
+
test: Boolean(args.test),
|
|
269
|
+
})),
|
|
270
|
+
substack_scraper: async (args) => jsonResult(await social.scrapeSubstack({
|
|
271
|
+
publication: String(args.publication ?? ""),
|
|
272
|
+
keyword: args.keyword,
|
|
273
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
274
|
+
test: Boolean(args.test),
|
|
275
|
+
})),
|
|
276
|
+
// ── Advanced Analytics ─────────────────────────────────────────
|
|
277
|
+
anomaly_detector_ts: (args) => jsonResult(analytics.detectTimeSeriesAnomalies({
|
|
278
|
+
values: Array.isArray(args.values) ? args.values.map(Number) : [],
|
|
279
|
+
timestamps: Array.isArray(args.timestamps) ? args.timestamps.map(String) : undefined,
|
|
280
|
+
window: args.window != null ? Number(args.window) : undefined,
|
|
281
|
+
threshold: args.threshold != null ? Number(args.threshold) : undefined,
|
|
282
|
+
test: Boolean(args.test),
|
|
283
|
+
})),
|
|
284
|
+
timeline_correlator: (args) => jsonResult(analytics.correlateTimelines({
|
|
285
|
+
sourceEvents: args.source_events ?? [],
|
|
286
|
+
targetEvents: args.target_events ?? [],
|
|
287
|
+
windowDays: args.window_days != null ? Number(args.window_days) : undefined,
|
|
288
|
+
minScore: args.min_score != null ? Number(args.min_score) : undefined,
|
|
289
|
+
test: Boolean(args.test),
|
|
290
|
+
})),
|
|
291
|
+
network_centrality_analyzer: (args) => jsonResult(analytics.analyzeNetworkCentrality({
|
|
292
|
+
graph: args.graph ?? { nodes: [], edges: [] },
|
|
293
|
+
topN: args.top_n != null ? Number(args.top_n) : undefined,
|
|
294
|
+
test: Boolean(args.test),
|
|
295
|
+
})),
|
|
296
|
+
prediction_market_arbitrage: (args) => jsonResult(analytics.detectArbitrage({
|
|
297
|
+
markets: args.markets ?? [],
|
|
298
|
+
minSpread: args.min_spread != null ? Number(args.min_spread) : undefined,
|
|
299
|
+
test: Boolean(args.test),
|
|
300
|
+
})),
|
|
301
|
+
// ── Document Processing ────────────────────────────────────────
|
|
302
|
+
pdf_filings_extractor: async (args) => jsonResult(await docProcessing.extractPdfFilings({
|
|
303
|
+
text: String(args.text ?? ""),
|
|
304
|
+
source: args.source,
|
|
305
|
+
extractTables: args.extract_tables !== false,
|
|
306
|
+
test: Boolean(args.test),
|
|
307
|
+
})),
|
|
308
|
+
document_similarity_scorer: (args) => jsonResult(docProcessing.scoreDocumentSimilarity({
|
|
309
|
+
documents: args.documents ?? [],
|
|
310
|
+
test: Boolean(args.test),
|
|
311
|
+
})),
|
|
312
|
+
sentiment_analyzer: (args) => jsonResult(docProcessing.analyzeSentiment({
|
|
313
|
+
text: String(args.text ?? ""),
|
|
314
|
+
extractEntities: args.extract_entities !== false,
|
|
315
|
+
test: Boolean(args.test),
|
|
316
|
+
})),
|
|
317
|
+
// ── Investigation Automation ───────────────────────────────────
|
|
318
|
+
cross_reference_engine: (args) => jsonResult(automation.crossReferenceEntities({
|
|
319
|
+
entitiesA: args.entities_a ?? [],
|
|
320
|
+
entitiesB: args.entities_b ?? [],
|
|
321
|
+
threshold: args.threshold != null ? Number(args.threshold) : undefined,
|
|
322
|
+
test: Boolean(args.test),
|
|
323
|
+
})),
|
|
324
|
+
insider_network_expander: (args) => jsonResult(automation.expandInsiderNetwork({
|
|
325
|
+
entities: args.entities ?? [],
|
|
326
|
+
knownConnections: args.known_connections ?? [],
|
|
327
|
+
maxDepth: args.max_depth != null ? Number(args.max_depth) : undefined,
|
|
328
|
+
test: Boolean(args.test),
|
|
329
|
+
})),
|
|
330
|
+
compliance_risk_report: (args) => jsonResult(automation.generateComplianceReport({
|
|
331
|
+
subject: String(args.subject ?? ""),
|
|
332
|
+
findings: args.findings ?? [],
|
|
333
|
+
test: Boolean(args.test),
|
|
334
|
+
})),
|
|
335
|
+
global_entity_resolver: (args) => jsonResult(automation.resolveGlobalEntities({
|
|
336
|
+
entities: args.entities ?? [],
|
|
337
|
+
threshold: args.threshold != null ? Number(args.threshold) : undefined,
|
|
338
|
+
test: Boolean(args.test),
|
|
339
|
+
})),
|
|
340
|
+
jurisdiction_risk_scorer: (args) => jsonResult(automation.scoreJurisdictionRisk({
|
|
341
|
+
jurisdictions: Array.isArray(args.jurisdictions) ? args.jurisdictions.map(String) : [],
|
|
342
|
+
test: Boolean(args.test),
|
|
343
|
+
})),
|
|
344
|
+
// ── Monitoring & Market Structure ──────────────────────────────
|
|
345
|
+
whale_alert_monitor: async (args) => jsonResult(await monitoring.monitorWhaleAlerts({
|
|
346
|
+
minUsd: args.min_usd != null ? Number(args.min_usd) : undefined,
|
|
347
|
+
blockchain: args.blockchain,
|
|
348
|
+
symbol: args.symbol,
|
|
349
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
350
|
+
apiKey: args.api_key,
|
|
351
|
+
test: Boolean(args.test),
|
|
352
|
+
})),
|
|
353
|
+
dark_pool_activity: async (args) => jsonResult(await monitoring.fetchDarkPoolActivity({
|
|
354
|
+
ticker: String(args.ticker ?? ""),
|
|
355
|
+
daysBack: args.days_back != null ? Number(args.days_back) : undefined,
|
|
356
|
+
test: Boolean(args.test),
|
|
357
|
+
})),
|
|
358
|
+
corporate_filings_monitor: async (args) => jsonResult(await monitoring.monitorCorporateFilings({
|
|
359
|
+
tickers: Array.isArray(args.tickers) ? args.tickers.map(String) : [String(args.tickers ?? "")],
|
|
360
|
+
formTypes: Array.isArray(args.form_types) ? args.form_types.map(String) : undefined,
|
|
361
|
+
daysBack: args.days_back != null ? Number(args.days_back) : undefined,
|
|
362
|
+
test: Boolean(args.test),
|
|
363
|
+
})),
|
|
364
|
+
real_estate_records: async (args) => jsonResult(await monitoring.searchPropertyRecords({
|
|
365
|
+
ownerName: args.owner_name,
|
|
366
|
+
address: args.address,
|
|
367
|
+
state: args.state,
|
|
368
|
+
test: Boolean(args.test),
|
|
369
|
+
})),
|
|
370
|
+
// ── Crypto Ecosystem ───────────────────────────────────────────
|
|
371
|
+
gitcoin_grants_parser: async (args) => jsonResult(await crypto.parseGitcoinGrants({
|
|
372
|
+
query: args.query,
|
|
373
|
+
roundId: args.round_id,
|
|
374
|
+
category: args.category,
|
|
375
|
+
limit: args.limit != null ? Number(args.limit) : undefined,
|
|
376
|
+
test: Boolean(args.test),
|
|
377
|
+
})),
|
|
378
|
+
evidence_graph_builder: (args) => jsonResult(crypto.buildEvidenceGraph({
|
|
379
|
+
investigation: String(args.investigation ?? ""),
|
|
380
|
+
nodes: args.nodes ?? [],
|
|
381
|
+
edges: args.edges ?? [],
|
|
382
|
+
generateCypher: Boolean(args.generate_cypher),
|
|
383
|
+
test: Boolean(args.test),
|
|
384
|
+
})),
|
|
385
|
+
};
|
|
386
|
+
export const TS_TOOL_NAMES = new Set(Object.keys(TS_TOOL_REGISTRY));
|
|
387
|
+
export async function runTsTool(name, args) {
|
|
388
|
+
const handler = TS_TOOL_REGISTRY[name];
|
|
389
|
+
if (!handler)
|
|
390
|
+
return `Unknown TypeScript tool: ${name}`;
|
|
391
|
+
try {
|
|
392
|
+
const result = await handler(args);
|
|
393
|
+
return typeof result === "string" ? result : JSON.stringify(result, null, 2);
|
|
394
|
+
}
|
|
395
|
+
catch (err) {
|
|
396
|
+
return `[${name}] error: ${err}`;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/investigation-tools/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,IAAI,MAAM,qBAAqB,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,GAAG,MAAM,wBAAwB,CAAC;AAC9C,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,SAAS,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,UAAU,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAIhD,SAAS,UAAU,CAAC,MAAe;IACjC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC3D,kEAAkE;IAClE,0BAA0B,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACpD,MAAM,UAAU,CAAC,YAAY,CAAC;QAC5B,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QACxE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAChD,MAAM,UAAU,CAAC,gBAAgB,CAAC;QAChC,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QACzD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC3C,MAAM,UAAU,CAAC,WAAW,CAAC;QAC3B,MAAM,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/D,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,yBAAyB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACnD,MAAM,UAAU,CAAC,kBAAkB,CAAC;QAClC,QAAQ,EAAE,IAAI,CAAC,SAA+B;QAC9C,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAChD,MAAM,UAAU,CAAC,gBAAgB,CAAC;QAChC,QAAQ,EAAE,IAAI,CAAC,SAA+B;QAC9C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,0BAA0B,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACpD,MAAM,UAAU,CAAC,aAAa,CAAC;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QACxE,WAAW,EAAE,IAAI,CAAC,YAAkC;QACpD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACxC,MAAM,iBAAiB,CAAC,kBAAkB,CAAC;QACzC,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC3C,MAAM,iBAAiB,CAAC,qBAAqB,CAAC;QAC5C,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC1C,MAAM,iBAAiB,CAAC,oBAAoB,CAAC;QAC3C,IAAI,EAAE,IAAI,CAAC,IAA0B;QACrC,IAAI,EAAE,IAAI,CAAC,IAA0B;QACrC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC7C,MAAM,IAAI,CAAC,gBAAgB,CAAC;QAC1B,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QAClE,GAAG,EAAE,IAAI,CAAC,GAAyB;QACnC,UAAU,EAAE,IAAI,CAAC,UAAgD;QACjE,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACzC,MAAM,IAAI,CAAC,cAAc,CAAC;QACxB,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC5C,MAAM,UAAU,CAAC,iBAAiB,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnC,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC1C,MAAM,UAAU,CAAC,mBAAmB,CAAC;QACnC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnC,UAAU,EAAE,IAAI,CAAC,WAAW,KAAK,KAAK;QACtC,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC9C,MAAM,UAAU,CAAC,iBAAiB,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnC,SAAS,EAAE,IAAI,CAAC,SAAyD;QACzE,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC3C,MAAM,GAAG,CAAC,aAAa,CAAC;QACtB,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,YAAY,EAAE,IAAI,CAAC,aAAmC;QACtD,WAAW,EAAE,IAAI,CAAC,YAAkC;QACpD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC1C,MAAM,aAAa,CAAC,cAAc,CAAC;QACjC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACpE,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,aAAa,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;QACpF,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC1C,MAAM,GAAG,CAAC,UAAU,CAAC;QACnB,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,GAAG,EAAE,IAAI,CAAC,GAAyB;QACnC,SAAS,EAAE,IAAI,CAAC,UAAgC;QAChD,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACzC,MAAM,GAAG,CAAC,kBAAkB,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,QAAQ,EAAE,IAAI,CAAC,SAA+B;QAC9C,QAAQ,EAAE,IAAI,CAAC,SAA+B;QAC9C,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,wBAAwB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAClD,MAAM,GAAG,CAAC,wBAAwB,CAAC;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QACvD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC3C,MAAM,SAAS,CAAC,qBAAqB,CAAC;QACpC,eAAe,EAAE,IAAI,CAAC,gBAAsC;QAC5D,YAAY,EAAE,IAAI,CAAC,aAAmC;QACtD,aAAa,EAAE,IAAI,CAAC,cAAoC;QACxD,WAAW,EAAE,IAAI,CAAC,YAAkC;QACpD,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QACxE,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC9C,MAAM,SAAS,CAAC,oBAAoB,CAAC;QACnC,UAAU,EAAE,IAAI,CAAC,WAAiC;QAClD,cAAc,EAAE,IAAI,CAAC,eAAqC;QAC1D,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QACvD,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC9C,MAAM,SAAS,CAAC,wBAAwB,CAAC;QACvC,UAAU,EAAE,IAAI,CAAC,WAAiC;QAClD,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,OAAO,EAAE,IAAI,CAAC,OAA6B;QAC3C,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,0BAA0B,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACpD,MAAM,SAAS,CAAC,uBAAuB,CAAC;QACtC,SAAS,EAAE,IAAI,CAAC,UAAgC;QAChD,aAAa,EAAE,IAAI,CAAC,cAAoC;QACxD,OAAO,EAAE,IAAI,CAAC,OAA6B;QAC3C,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QACxE,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC/C,MAAM,UAAU,CAAC,eAAe,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAkC;QACrD,aAAa,EAAE,IAAI,CAAC,cAAoC;QACxD,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAChD,MAAM,UAAU,CAAC,cAAc,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,UAAU,EAAE,IAAI,CAAC,WAAiC;QAClD,OAAO,EAAE,IAAI,CAAC,OAA6B;QAC3C,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACtE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,2BAA2B,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACrD,MAAM,UAAU,CAAC,wBAAwB,CAAC;QACxC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QAC5C,YAAY,EAAE,IAAI,CAAC,YAAkC;QACrD,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACzC,MAAM,UAAU,CAAC,kBAAkB,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,SAAS,EAAE,IAAI,CAAC,UAAgC;QAChD,YAAY,EAAE,IAAI,CAAC,cAAoC;QACvD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC3C,MAAM,UAAU,CAAC,sBAAsB,CAAC;QACtC,aAAa,EAAE,IAAI,CAAC,cAAoC;QACxD,cAAc,EAAE,IAAI,CAAC,eAAqC;QAC1D,OAAO,EAAE,IAAI,CAAC,OAA6B;QAC3C,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QACxE,UAAU,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3E,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CACxC,UAAU,CAAC,gBAAgB,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACvE,QAAQ,EAAE,IAAI,CAAC,SAA+B;QAC9C,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,WAAW,EAAE,IAAI,CAAC,YAAkC;QACpD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,uBAAuB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACjD,MAAM,MAAM,CAAC,qBAAqB,CAAC;QACjC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC5C,MAAM,MAAM,CAAC,aAAa,CAAC;QACzB,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,SAAS,EAAE,IAAI,CAAC,SAA+B;QAC/C,IAAI,EAAE,IAAI,CAAC,IAA0B;QACrC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,uBAAuB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACjD,MAAM,MAAM,CAAC,aAAa,CAAC;QACzB,QAAQ,EAAE,IAAI,CAAC,SAA+B;QAC9C,SAAS,EAAE,IAAI,CAAC,UAAgC;QAChD,UAAU,EAAE,IAAI,CAAC,WAAiC;QAClD,OAAO,EAAE,IAAI,CAAC,OAA6B;QAC3C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,wBAAwB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAClD,MAAM,MAAM,CAAC,eAAe,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QAC5C,OAAO,EAAE,IAAI,CAAC,OAA6B;QAC3C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAChD,MAAM,MAAM,CAAC,kBAAkB,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3E,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC1C,MAAM,MAAM,CAAC,cAAc,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAC3C,OAAO,EAAE,IAAI,CAAC,OAA6B;QAC3C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CACvC,SAAS,CAAC,yBAAyB,CAAC;QAClC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACjE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QACpF,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7D,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACtE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CACvC,SAAS,CAAC,kBAAkB,CAAC;QAC3B,YAAY,EAAE,IAAI,CAAC,aAAuC,IAAI,EAAE;QAChE,YAAY,EAAE,IAAI,CAAC,aAAuC,IAAI,EAAE;QAChE,UAAU,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3E,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,2BAA2B,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAC/C,SAAS,CAAC,wBAAwB,CAAC;QACjC,KAAK,EAAE,IAAI,CAAC,KAA6B,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACrE,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QACzD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,2BAA2B,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAC/C,SAAS,CAAC,eAAe,CAAC;QACxB,OAAO,EAAE,IAAI,CAAC,OAGZ,IAAI,EAAE;QACR,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QACxE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC/C,MAAM,aAAa,CAAC,iBAAiB,CAAC;QACpC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,aAAa,EAAE,IAAI,CAAC,cAAc,KAAK,KAAK;QAC5C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,0BAA0B,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAC9C,aAAa,CAAC,uBAAuB,CAAC;QACpC,SAAS,EAAE,IAAI,CAAC,SAAkD,IAAI,EAAE;QACxE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CACtC,aAAa,CAAC,gBAAgB,CAAC;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,eAAe,EAAE,IAAI,CAAC,gBAAgB,KAAK,KAAK;QAChD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,sBAAsB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAC1C,UAAU,CAAC,sBAAsB,CAAC;QAChC,SAAS,EAAE,IAAI,CAAC,UAAsC,IAAI,EAAE;QAC5D,SAAS,EAAE,IAAI,CAAC,UAAsC,IAAI,EAAE;QAC5D,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACtE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,wBAAwB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAC5C,UAAU,CAAC,oBAAoB,CAAC;QAC9B,QAAQ,EAAE,IAAI,CAAC,QAAyE,IAAI,EAAE;QAC9F,gBAAgB,EAAE,IAAI,CAAC,iBAAsE,IAAI,EAAE;QACnG,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,sBAAsB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAC1C,UAAU,CAAC,wBAAwB,CAAC;QAClC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnC,QAAQ,EAAE,IAAI,CAAC,QAAgI,IAAI,EAAE;QACrJ,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,sBAAsB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAC1C,UAAU,CAAC,qBAAqB,CAAC;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAA8H,IAAI,EAAE;QACnJ,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACtE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,wBAAwB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAC5C,UAAU,CAAC,qBAAqB,CAAC;QAC/B,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACtF,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC7C,MAAM,UAAU,CAAC,kBAAkB,CAAC;QAClC,MAAM,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/D,UAAU,EAAE,IAAI,CAAC,UAAgC;QACjD,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,MAAM,EAAE,IAAI,CAAC,OAA6B;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC5C,MAAM,UAAU,CAAC,qBAAqB,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,yBAAyB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CACnD,MAAM,UAAU,CAAC,uBAAuB,CAAC;QACvC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC9F,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QACnF,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC7C,MAAM,UAAU,CAAC,qBAAqB,CAAC;QACrC,SAAS,EAAE,IAAI,CAAC,UAAgC;QAChD,OAAO,EAAE,IAAI,CAAC,OAA6B;QAC3C,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,kEAAkE;IAClE,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAC/C,MAAM,MAAM,CAAC,kBAAkB,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,OAAO,EAAE,IAAI,CAAC,QAA8B;QAC5C,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;IAED,sBAAsB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAC1C,MAAM,CAAC,kBAAkB,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;QAC/C,KAAK,EAAE,IAAI,CAAC,KAGV,IAAI,EAAE;QACR,KAAK,EAAE,IAAI,CAAC,KAGV,IAAI,EAAE;QACR,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC;QAC7C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzB,CAAC,CACH;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,IAA6B;IAE7B,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO;QAAE,OAAO,4BAA4B,IAAI,EAAE,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,IAAI,YAAY,GAAG,EAAE,CAAC;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wallet-clusterer.ts — Cluster related blockchain wallets by transaction patterns.
|
|
3
|
+
*
|
|
4
|
+
* Tool: wallet_clusterer
|
|
5
|
+
*/
|
|
6
|
+
import { type Provenance, type ConfidenceScore } from "./shared-crypto.js";
|
|
7
|
+
export interface WalletCluster {
|
|
8
|
+
clusterId: number;
|
|
9
|
+
wallets: string[];
|
|
10
|
+
confidence: ConfidenceScore;
|
|
11
|
+
linkReasons: string[];
|
|
12
|
+
totalInteractions: number;
|
|
13
|
+
sharedCounterparties: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface ClusterResult {
|
|
16
|
+
clusters: WalletCluster[];
|
|
17
|
+
totalWallets: number;
|
|
18
|
+
totalClusters: number;
|
|
19
|
+
provenance: Provenance;
|
|
20
|
+
}
|
|
21
|
+
export declare function clusterWallets(opts: {
|
|
22
|
+
wallets: string[];
|
|
23
|
+
chain?: string;
|
|
24
|
+
apiKey?: string;
|
|
25
|
+
minConfidence?: number;
|
|
26
|
+
test?: boolean;
|
|
27
|
+
}): Promise<ClusterResult>;
|
|
28
|
+
//# sourceMappingURL=wallet-clusterer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-clusterer.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/wallet-clusterer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,eAAe,EAErB,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB;AAyCD,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,aAAa,CAAC,CA0JzB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wallet-clusterer.ts — Cluster related blockchain wallets by transaction patterns.
|
|
3
|
+
*
|
|
4
|
+
* Tool: wallet_clusterer
|
|
5
|
+
*/
|
|
6
|
+
import { fetchJson } from "./shared.js";
|
|
7
|
+
import { makeProvenance, normalizeAddress, computeConfidence, } from "./shared-crypto.js";
|
|
8
|
+
// ── Mock Data ────────────────────────────────────────────────────
|
|
9
|
+
const MOCK_CLUSTERS = {
|
|
10
|
+
clusters: [
|
|
11
|
+
{
|
|
12
|
+
clusterId: 1,
|
|
13
|
+
wallets: ["0xabc123", "0xdef456", "0x789abc"],
|
|
14
|
+
confidence: { score: 85, factors: ["shared_counterparties", "temporal_pattern", "similar_amounts"] },
|
|
15
|
+
linkReasons: [
|
|
16
|
+
"3 shared counterparties",
|
|
17
|
+
"Transactions within 5-minute windows",
|
|
18
|
+
"Similar USDC transfer amounts (±2%)",
|
|
19
|
+
],
|
|
20
|
+
totalInteractions: 47,
|
|
21
|
+
sharedCounterparties: ["0xpolymarket_ctf", "0xfunding_source"],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
clusterId: 2,
|
|
25
|
+
wallets: ["0xwallet_a", "0xwallet_b"],
|
|
26
|
+
confidence: { score: 72, factors: ["funding_source", "temporal_pattern"] },
|
|
27
|
+
linkReasons: ["Common funding source", "Sequential betting pattern"],
|
|
28
|
+
totalInteractions: 12,
|
|
29
|
+
sharedCounterparties: ["0xfunding_source"],
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
totalWallets: 5,
|
|
33
|
+
totalClusters: 2,
|
|
34
|
+
provenance: makeProvenance("wallet_clusterer", "test://mock", ["test_mode"]),
|
|
35
|
+
};
|
|
36
|
+
export async function clusterWallets(opts) {
|
|
37
|
+
if (opts.test)
|
|
38
|
+
return MOCK_CLUSTERS;
|
|
39
|
+
const chain = opts.chain ?? "polygon";
|
|
40
|
+
const minConf = opts.minConfidence ?? 60;
|
|
41
|
+
const baseUrl = chain === "ethereum"
|
|
42
|
+
? "https://api.etherscan.io/api"
|
|
43
|
+
: "https://api.polygonscan.com/api";
|
|
44
|
+
const apiKey = opts.apiKey ?? (chain === "ethereum" ? process.env.ETHERSCAN_API_KEY : process.env.POLYGONSCAN_API_KEY);
|
|
45
|
+
const walletTxs = new Map();
|
|
46
|
+
const walletCounterparties = new Map();
|
|
47
|
+
for (const wallet of opts.wallets) {
|
|
48
|
+
const addr = normalizeAddress(wallet);
|
|
49
|
+
const keyParam = apiKey ? `&apikey=${apiKey}` : "";
|
|
50
|
+
const url = `${baseUrl}?module=account&action=tokentx&address=${addr}&sort=desc&page=1&offset=200${keyParam}`;
|
|
51
|
+
try {
|
|
52
|
+
const data = await fetchJson(url, { delay: 0.5 });
|
|
53
|
+
const txList = Array.isArray(data.result) ? data.result : [];
|
|
54
|
+
const records = txList.map((t) => ({
|
|
55
|
+
from: normalizeAddress(String(t.from ?? "")),
|
|
56
|
+
to: normalizeAddress(String(t.to ?? "")),
|
|
57
|
+
timestamp: Number(t.timeStamp ?? 0),
|
|
58
|
+
value: Number(t.value ?? 0) / 10 ** Number(t.tokenDecimal ?? 18),
|
|
59
|
+
}));
|
|
60
|
+
walletTxs.set(addr, records);
|
|
61
|
+
const counterparties = new Set();
|
|
62
|
+
for (const tx of records) {
|
|
63
|
+
if (tx.from !== addr)
|
|
64
|
+
counterparties.add(tx.from);
|
|
65
|
+
if (tx.to !== addr)
|
|
66
|
+
counterparties.add(tx.to);
|
|
67
|
+
}
|
|
68
|
+
walletCounterparties.set(addr, counterparties);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
walletTxs.set(addr, []);
|
|
72
|
+
walletCounterparties.set(addr, new Set());
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const addrs = opts.wallets.map(normalizeAddress);
|
|
76
|
+
const parent = new Map();
|
|
77
|
+
for (const a of addrs)
|
|
78
|
+
parent.set(a, a);
|
|
79
|
+
function find(x) {
|
|
80
|
+
while (parent.get(x) !== x) {
|
|
81
|
+
parent.set(x, parent.get(parent.get(x)));
|
|
82
|
+
x = parent.get(x);
|
|
83
|
+
}
|
|
84
|
+
return x;
|
|
85
|
+
}
|
|
86
|
+
function union(a, b) {
|
|
87
|
+
const ra = find(a), rb = find(b);
|
|
88
|
+
if (ra !== rb)
|
|
89
|
+
parent.set(rb, ra);
|
|
90
|
+
}
|
|
91
|
+
const pairScores = new Map();
|
|
92
|
+
for (let i = 0; i < addrs.length; i++) {
|
|
93
|
+
for (let j = i + 1; j < addrs.length; j++) {
|
|
94
|
+
const a = addrs[i], b = addrs[j];
|
|
95
|
+
const cpA = walletCounterparties.get(a) ?? new Set();
|
|
96
|
+
const cpB = walletCounterparties.get(b) ?? new Set();
|
|
97
|
+
const shared = [...cpA].filter((c) => cpB.has(c));
|
|
98
|
+
const factors = [];
|
|
99
|
+
const reasons = [];
|
|
100
|
+
if (shared.length >= 2) {
|
|
101
|
+
factors.push(["shared_counterparties", Math.min(shared.length * 15, 40)]);
|
|
102
|
+
reasons.push(`${shared.length} shared counterparties`);
|
|
103
|
+
}
|
|
104
|
+
const txsA = walletTxs.get(a) ?? [];
|
|
105
|
+
const txsB = walletTxs.get(b) ?? [];
|
|
106
|
+
let temporalLinks = 0;
|
|
107
|
+
for (const ta of txsA) {
|
|
108
|
+
for (const tb of txsB) {
|
|
109
|
+
if (Math.abs(ta.timestamp - tb.timestamp) < 300)
|
|
110
|
+
temporalLinks++;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (temporalLinks > 0) {
|
|
114
|
+
factors.push(["temporal_pattern", Math.min(temporalLinks * 10, 30)]);
|
|
115
|
+
reasons.push(`${temporalLinks} transactions within 5-minute windows`);
|
|
116
|
+
}
|
|
117
|
+
const directLinks = txsA.filter((t) => t.to === b || t.from === b).length
|
|
118
|
+
+ txsB.filter((t) => t.to === a || t.from === a).length;
|
|
119
|
+
if (directLinks > 0) {
|
|
120
|
+
factors.push(["direct_transfers", Math.min(directLinks * 20, 40)]);
|
|
121
|
+
reasons.push(`${directLinks} direct transfers between wallets`);
|
|
122
|
+
}
|
|
123
|
+
if (factors.length > 0) {
|
|
124
|
+
const score = computeConfidence(factors);
|
|
125
|
+
if (score.score >= minConf) {
|
|
126
|
+
union(a, b);
|
|
127
|
+
pairScores.set(`${a}:${b}`, { score, reasons, shared });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const clusterMap = new Map();
|
|
133
|
+
for (const a of addrs) {
|
|
134
|
+
const root = find(a);
|
|
135
|
+
const members = clusterMap.get(root) ?? [];
|
|
136
|
+
members.push(a);
|
|
137
|
+
clusterMap.set(root, members);
|
|
138
|
+
}
|
|
139
|
+
const clusters = [];
|
|
140
|
+
let cid = 1;
|
|
141
|
+
for (const [, members] of clusterMap) {
|
|
142
|
+
if (members.length < 2)
|
|
143
|
+
continue;
|
|
144
|
+
const allReasons = [];
|
|
145
|
+
const allShared = new Set();
|
|
146
|
+
let bestScore = { score: 0, factors: [] };
|
|
147
|
+
let interactions = 0;
|
|
148
|
+
for (let i = 0; i < members.length; i++) {
|
|
149
|
+
for (let j = i + 1; j < members.length; j++) {
|
|
150
|
+
const key = `${members[i]}:${members[j]}`;
|
|
151
|
+
const info = pairScores.get(key) ?? pairScores.get(`${members[j]}:${members[i]}`);
|
|
152
|
+
if (info) {
|
|
153
|
+
allReasons.push(...info.reasons);
|
|
154
|
+
info.shared.forEach((s) => allShared.add(s));
|
|
155
|
+
if (info.score.score > bestScore.score)
|
|
156
|
+
bestScore = info.score;
|
|
157
|
+
}
|
|
158
|
+
const txs = (walletTxs.get(members[i]) ?? []).filter((t) => t.to === members[j] || t.from === members[j]);
|
|
159
|
+
interactions += txs.length;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
clusters.push({
|
|
163
|
+
clusterId: cid++,
|
|
164
|
+
wallets: members,
|
|
165
|
+
confidence: bestScore,
|
|
166
|
+
linkReasons: [...new Set(allReasons)],
|
|
167
|
+
totalInteractions: interactions,
|
|
168
|
+
sharedCounterparties: [...allShared],
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
clusters.sort((a, b) => b.confidence.score - a.confidence.score);
|
|
172
|
+
return {
|
|
173
|
+
clusters,
|
|
174
|
+
totalWallets: addrs.length,
|
|
175
|
+
totalClusters: clusters.length,
|
|
176
|
+
provenance: makeProvenance("wallet_clusterer", baseUrl),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=wallet-clusterer.js.map
|