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.
Files changed (83) hide show
  1. package/dist/engine.d.ts.map +1 -1
  2. package/dist/engine.js +5 -0
  3. package/dist/engine.js.map +1 -1
  4. package/dist/investigation-tools/advanced-analytics.d.ts +130 -0
  5. package/dist/investigation-tools/advanced-analytics.d.ts.map +1 -0
  6. package/dist/investigation-tools/advanced-analytics.js +340 -0
  7. package/dist/investigation-tools/advanced-analytics.js.map +1 -0
  8. package/dist/investigation-tools/blockchain-scanner.d.ts +83 -0
  9. package/dist/investigation-tools/blockchain-scanner.d.ts.map +1 -0
  10. package/dist/investigation-tools/blockchain-scanner.js +194 -0
  11. package/dist/investigation-tools/blockchain-scanner.js.map +1 -0
  12. package/dist/investigation-tools/crypto-ecosystem.d.ts +83 -0
  13. package/dist/investigation-tools/crypto-ecosystem.d.ts.map +1 -0
  14. package/dist/investigation-tools/crypto-ecosystem.js +124 -0
  15. package/dist/investigation-tools/crypto-ecosystem.js.map +1 -0
  16. package/dist/investigation-tools/dexscreener-pairs.d.ts +41 -0
  17. package/dist/investigation-tools/dexscreener-pairs.d.ts.map +1 -0
  18. package/dist/investigation-tools/dexscreener-pairs.js +60 -0
  19. package/dist/investigation-tools/dexscreener-pairs.js.map +1 -0
  20. package/dist/investigation-tools/document-processing.d.ts +78 -0
  21. package/dist/investigation-tools/document-processing.d.ts.map +1 -0
  22. package/dist/investigation-tools/document-processing.js +252 -0
  23. package/dist/investigation-tools/document-processing.js.map +1 -0
  24. package/dist/investigation-tools/dune-analytics.d.ts +47 -0
  25. package/dist/investigation-tools/dune-analytics.d.ts.map +1 -0
  26. package/dist/investigation-tools/dune-analytics.js +160 -0
  27. package/dist/investigation-tools/dune-analytics.js.map +1 -0
  28. package/dist/investigation-tools/global-registries.d.ts +86 -0
  29. package/dist/investigation-tools/global-registries.d.ts.map +1 -0
  30. package/dist/investigation-tools/global-registries.js +212 -0
  31. package/dist/investigation-tools/global-registries.js.map +1 -0
  32. package/dist/investigation-tools/government-records.d.ts +85 -0
  33. package/dist/investigation-tools/government-records.d.ts.map +1 -0
  34. package/dist/investigation-tools/government-records.js +170 -0
  35. package/dist/investigation-tools/government-records.js.map +1 -0
  36. package/dist/investigation-tools/index.d.ts +18 -0
  37. package/dist/investigation-tools/index.d.ts.map +1 -1
  38. package/dist/investigation-tools/index.js +19 -0
  39. package/dist/investigation-tools/index.js.map +1 -1
  40. package/dist/investigation-tools/investigation-automation.d.ts +144 -0
  41. package/dist/investigation-tools/investigation-automation.d.ts.map +1 -0
  42. package/dist/investigation-tools/investigation-automation.js +345 -0
  43. package/dist/investigation-tools/investigation-automation.js.map +1 -0
  44. package/dist/investigation-tools/monitoring-tools.d.ts +102 -0
  45. package/dist/investigation-tools/monitoring-tools.d.ts.map +1 -0
  46. package/dist/investigation-tools/monitoring-tools.js +214 -0
  47. package/dist/investigation-tools/monitoring-tools.js.map +1 -0
  48. package/dist/investigation-tools/political-finance.d.ts +114 -0
  49. package/dist/investigation-tools/political-finance.d.ts.map +1 -0
  50. package/dist/investigation-tools/political-finance.js +205 -0
  51. package/dist/investigation-tools/political-finance.js.map +1 -0
  52. package/dist/investigation-tools/polymarket-markets.d.ts +137 -0
  53. package/dist/investigation-tools/polymarket-markets.d.ts.map +1 -0
  54. package/dist/investigation-tools/polymarket-markets.js +303 -0
  55. package/dist/investigation-tools/polymarket-markets.js.map +1 -0
  56. package/dist/investigation-tools/prediction-markets.d.ts +52 -0
  57. package/dist/investigation-tools/prediction-markets.d.ts.map +1 -0
  58. package/dist/investigation-tools/prediction-markets.js +116 -0
  59. package/dist/investigation-tools/prediction-markets.js.map +1 -0
  60. package/dist/investigation-tools/sec-tools.d.ts +75 -0
  61. package/dist/investigation-tools/sec-tools.d.ts.map +1 -0
  62. package/dist/investigation-tools/sec-tools.js +192 -0
  63. package/dist/investigation-tools/sec-tools.js.map +1 -0
  64. package/dist/investigation-tools/shared-crypto.d.ts +50 -0
  65. package/dist/investigation-tools/shared-crypto.d.ts.map +1 -0
  66. package/dist/investigation-tools/shared-crypto.js +122 -0
  67. package/dist/investigation-tools/shared-crypto.js.map +1 -0
  68. package/dist/investigation-tools/social-intelligence.d.ts +91 -0
  69. package/dist/investigation-tools/social-intelligence.d.ts.map +1 -0
  70. package/dist/investigation-tools/social-intelligence.js +302 -0
  71. package/dist/investigation-tools/social-intelligence.js.map +1 -0
  72. package/dist/investigation-tools/tool-registry.d.ts +12 -0
  73. package/dist/investigation-tools/tool-registry.d.ts.map +1 -0
  74. package/dist/investigation-tools/tool-registry.js +399 -0
  75. package/dist/investigation-tools/tool-registry.js.map +1 -0
  76. package/dist/investigation-tools/wallet-clusterer.d.ts +28 -0
  77. package/dist/investigation-tools/wallet-clusterer.d.ts.map +1 -0
  78. package/dist/investigation-tools/wallet-clusterer.js +179 -0
  79. package/dist/investigation-tools/wallet-clusterer.js.map +1 -0
  80. package/dist/tool-defs.d.ts.map +1 -1
  81. package/dist/tool-defs.js +301 -0
  82. package/dist/tool-defs.js.map +1 -1
  83. 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":"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"}
@@ -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