chain-insights 0.8.19 → 0.8.22
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/bin/install.cjs +1 -2
- package/dist/{app-CDnQ2JzJ.cjs → app-BNrqZ_LR.cjs} +1 -1
- package/dist/{app-qkaa5DYD.mjs → app-CCXmYEV1.mjs} +2 -2
- package/dist/{app-qkaa5DYD.mjs.map → app-CCXmYEV1.mjs.map} +1 -1
- package/dist/{artifact-server-BXA0gdZE.cjs → artifact-server-B4YVpWK2.cjs} +1 -1
- package/dist/{artifact-server-Dw7AI6B1.mjs → artifact-server-DR13HEei.mjs} +2 -2
- package/dist/{artifact-server-Dw7AI6B1.mjs.map → artifact-server-DR13HEei.mjs.map} +1 -1
- package/dist/{capabilities-CKBZbIBf.cjs → capabilities-CjIcF3da.cjs} +2 -2
- package/dist/{capabilities-Bnlnmu6P.mjs → capabilities-GuF58uDa.mjs} +3 -3
- package/dist/{capabilities-Bnlnmu6P.mjs.map → capabilities-GuF58uDa.mjs.map} +1 -1
- package/dist/cli.cjs +33 -62
- package/dist/cli.mjs +33 -62
- package/dist/cli.mjs.map +1 -1
- package/dist/{client-C-A_VCul.mjs → client-C_HEuq0f.mjs} +3 -3
- package/dist/{client-C-A_VCul.mjs.map → client-C_HEuq0f.mjs.map} +1 -1
- package/dist/{client-oJdEMUFE.cjs → client-rVqMG2j9.cjs} +2 -2
- package/dist/{config-Cj4Jwv08.cjs → config-B8Hk-G1y.cjs} +2 -2
- package/dist/{config-BSMWXI4K.mjs → config-BFi5yBMm.mjs} +3 -3
- package/dist/{config-BSMWXI4K.mjs.map → config-BFi5yBMm.mjs.map} +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.d.cts +0 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +0 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/{init-B3sU6b3N.mjs → init-BWFFHDtL.mjs} +2 -2
- package/dist/{init-B3sU6b3N.mjs.map → init-BWFFHDtL.mjs.map} +1 -1
- package/dist/{init-BmyNlJ9M.cjs → init-s0SU97fS.cjs} +1 -1
- package/dist/{mcp-endpoint-CwsaQ8gL.cjs → mcp-endpoint-BIWrUOFG.cjs} +0 -7
- package/dist/{mcp-endpoint-B6QETHQM.mjs → mcp-endpoint-DbWtLcba.mjs} +2 -3
- package/dist/mcp-endpoint-DbWtLcba.mjs.map +1 -0
- package/dist/mcp-proxy.cjs +9 -9
- package/dist/mcp-proxy.mjs +9 -9
- package/dist/{public-tools-H9x9ob-q.cjs → public-tools-CXD65Dfk.cjs} +17 -1
- package/dist/{public-tools-BTxuEFAS.mjs → public-tools-DScJ1mRk.mjs} +18 -2
- package/dist/public-tools-DScJ1mRk.mjs.map +1 -0
- package/dist/{schema-Byt6GeSZ.cjs → schema-Dj2mqv1g.cjs} +1 -5
- package/dist/{schema-BbtE--TF.mjs → schema-zWbVYCQW.mjs} +2 -6
- package/dist/schema-zWbVYCQW.mjs.map +1 -0
- package/dist/{server-B5HlORyO.cjs → server-BkljWFmU.cjs} +1 -1
- package/dist/{server-Dy4d0Td1.mjs → server-CGGSh1TZ.mjs} +2 -2
- package/dist/{server-Dy4d0Td1.mjs.map → server-CGGSh1TZ.mjs.map} +1 -1
- package/docs/architecture.md +0 -2
- package/package.json +1 -1
- package/dist/mcp-endpoint-B6QETHQM.mjs.map +0 -1
- package/dist/public-tools-BTxuEFAS.mjs.map +0 -1
- package/dist/remote-trace-args-BkWtRX_h.cjs +0 -29
- package/dist/remote-trace-args-umlI_GIv.mjs +0 -31
- package/dist/remote-trace-args-umlI_GIv.mjs.map +0 -1
- package/dist/schema-BbtE--TF.mjs.map +0 -1
package/bin/install.cjs
CHANGED
|
@@ -102,8 +102,7 @@ if (!fs.existsSync(dataDir)) {
|
|
|
102
102
|
|
|
103
103
|
if (!fs.existsSync(configPath)) {
|
|
104
104
|
const defaultConfig = {
|
|
105
|
-
|
|
106
|
-
mcpAuthToken: '',
|
|
105
|
+
graphMcpEndpoint: 'http://127.0.0.1:8012/mcp',
|
|
107
106
|
walletAddress: '',
|
|
108
107
|
graphMcpMode: 'paid',
|
|
109
108
|
serverPort: 4321,
|
|
@@ -84,7 +84,7 @@ function createApp() {
|
|
|
84
84
|
ts: Date.now()
|
|
85
85
|
}));
|
|
86
86
|
app.get("/status", async (c) => {
|
|
87
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
87
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
88
88
|
const config = await loadConfig();
|
|
89
89
|
return c.json({
|
|
90
90
|
dataDir: config.dataDir,
|
|
@@ -82,7 +82,7 @@ function createApp() {
|
|
|
82
82
|
ts: Date.now()
|
|
83
83
|
}));
|
|
84
84
|
app.get("/status", async (c) => {
|
|
85
|
-
const { loadConfig } = await import("./config-
|
|
85
|
+
const { loadConfig } = await import("./config-BFi5yBMm.mjs").then((n) => n.t);
|
|
86
86
|
const config = await loadConfig();
|
|
87
87
|
return c.json({
|
|
88
88
|
dataDir: config.dataDir,
|
|
@@ -137,4 +137,4 @@ function createApp() {
|
|
|
137
137
|
//#endregion
|
|
138
138
|
export { createApp as t };
|
|
139
139
|
|
|
140
|
-
//# sourceMappingURL=app-
|
|
140
|
+
//# sourceMappingURL=app-CCXmYEV1.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-
|
|
1
|
+
{"version":3,"file":"app-CCXmYEV1.mjs","names":[],"sources":["../src/server/app.ts"],"sourcesContent":["import { Hono } from 'hono'\nimport { lstat, readFile, readdir, realpath } from 'node:fs/promises'\nimport path from 'node:path'\nimport { workspaceOutputPaths } from '../workspace/output-root.js'\n\nconst WORKSPACE_TREE_ROOTS = ['artifacts', 'entities', 'reports', 'sessions', '.chain-insights/schema']\nconst WORKSPACE_TREE_MAX_DEPTH = 4\n\ninterface WorkspaceTreeEntry {\n path: string\n type: 'file' | 'directory' | 'symlink'\n size?: number\n}\n\nfunction withinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target))\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative))\n}\n\nasync function realPathWithinRoot(root: string, target: string): Promise<boolean> {\n try {\n const [realRoot, realTarget] = await Promise.all([realpath(root), realpath(target)])\n return withinRoot(realRoot, realTarget)\n } catch {\n return false\n }\n}\n\nfunction toWorkspaceRelative(root: string, target: string): string {\n return path.relative(root, target).split(path.sep).join('/')\n}\n\nasync function listWorkspaceEntries(\n workspaceRoot: string,\n roots = WORKSPACE_TREE_ROOTS,\n maxDepth = WORKSPACE_TREE_MAX_DEPTH\n): Promise<WorkspaceTreeEntry[]> {\n const entries: WorkspaceTreeEntry[] = []\n const root = path.resolve(workspaceRoot)\n\n async function visit(target: string, depth: number): Promise<void> {\n const resolved = path.resolve(target)\n if (!withinRoot(root, resolved)) return\n\n let info: Awaited<ReturnType<typeof lstat>>\n try {\n info = await lstat(resolved)\n } catch {\n return\n }\n\n const type = info.isSymbolicLink() ? 'symlink' : info.isDirectory() ? 'directory' : info.isFile() ? 'file' : null\n if (!type) return\n\n const entry: WorkspaceTreeEntry = {\n path: toWorkspaceRelative(root, resolved),\n type,\n }\n if (type === 'file') entry.size = info.size\n entries.push(entry)\n\n if (type !== 'directory' || depth >= maxDepth) return\n if (!await realPathWithinRoot(root, resolved)) return\n\n let children: string[]\n try {\n children = await readdir(resolved)\n } catch {\n return\n }\n\n for (const child of children.sort()) {\n await visit(path.join(resolved, child), depth + 1)\n }\n }\n\n for (const rootName of roots) {\n const target = path.resolve(root, rootName)\n if (withinRoot(root, target)) await visit(target, 0)\n }\n\n return entries\n}\n\nasync function findVizHtml(vizId: string): Promise<string | null> {\n const filename = `${vizId}.html`\n const paths = workspaceOutputPaths()\n const vizPath = path.join(paths.publishedRoot, 'viz', filename)\n try {\n return await readFile(vizPath, 'utf-8')\n } catch {\n return null\n }\n}\n\nfunction isSafeGraphReportFilename(filename: string): boolean {\n return (\n filename.endsWith('.graph.json') &&\n /^[A-Za-z0-9._-]+$/.test(filename) &&\n !filename.includes('..') &&\n !filename.includes('/') &&\n !filename.includes('\\\\')\n )\n}\n\nexport function createApp(): Hono {\n const app = new Hono()\n\n app.get('/health', (c) => c.json({ ok: true, ts: Date.now() }))\n\n app.get('/status', async (c) => {\n const { loadConfig } = await import('../config/index.js')\n const config = await loadConfig()\n return c.json({\n dataDir: config.dataDir,\n graphMcpMode: config.graphMcpMode,\n server: 'running',\n })\n })\n\n app.get('/viz/:id', async (c) => {\n const id = c.req.param('id')\n if (!/^[a-zA-Z0-9_-]+$/.test(id)) {\n return c.json({ error: 'Invalid visualization ID' }, 400)\n }\n const html = await findVizHtml(id)\n if (!html) {\n return c.json({ error: 'Visualization not found' }, 404)\n }\n return c.html(html)\n })\n\n app.get('/graph-reports/:filename', async (c) => {\n const filename = c.req.param('filename')\n if (!isSafeGraphReportFilename(filename)) {\n return c.json({ error: 'Invalid graph report filename' }, 400)\n }\n\n const { workspaceOutputPaths } = await import('../workspace/output-root.js')\n const paths = workspaceOutputPaths()\n const graphPath = path.resolve(paths.reportGraphsRoot, filename)\n if (!withinRoot(paths.reportGraphsRoot, graphPath)) {\n return c.json({ error: 'Invalid graph report filename' }, 400)\n }\n if (!await realPathWithinRoot(paths.reportGraphsRoot, graphPath)) {\n return c.json({ error: 'Graph report not found' }, 404)\n }\n\n try {\n const graph = await readFile(graphPath, 'utf-8')\n return c.body(graph, 200, {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*',\n })\n } catch {\n return c.json({ error: 'Graph report not found' }, 404)\n }\n })\n\n app.get('/graph-reports/*', (c) => {\n return c.json({ error: 'Invalid graph report filename' }, 400)\n })\n\n app.get('/workspace/tree', async (c) => {\n const { workspaceOutputPaths } = await import('../workspace/output-root.js')\n const paths = workspaceOutputPaths()\n const entries = await listWorkspaceEntries(paths.root, WORKSPACE_TREE_ROOTS)\n return c.json({\n schema: 'chain-insights.workspace-tree.v1',\n root: paths.root,\n entries,\n })\n })\n\n app.onError((err, c) => {\n console.error(err)\n return c.json({ error: 'Internal server error' }, 500)\n })\n\n return app\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as createApp } from "./app-
|
|
1
|
+
import { t as createApp } from "./app-CCXmYEV1.mjs";
|
|
2
2
|
import { serve } from "@hono/node-server";
|
|
3
3
|
import { setTimeout as setTimeout$1 } from "node:timers/promises";
|
|
4
4
|
//#region src/mcp/artifact-server.ts
|
|
@@ -45,4 +45,4 @@ async function ensureArtifactServer(port) {
|
|
|
45
45
|
//#endregion
|
|
46
46
|
export { ensureArtifactServer };
|
|
47
47
|
|
|
48
|
-
//# sourceMappingURL=artifact-server-
|
|
48
|
+
//# sourceMappingURL=artifact-server-DR13HEei.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-server-
|
|
1
|
+
{"version":3,"file":"artifact-server-DR13HEei.mjs","names":["delay"],"sources":["../src/mcp/artifact-server.ts"],"sourcesContent":["import { serve } from '@hono/node-server'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { createApp } from '../server/app.js'\n\ntype ArtifactServer = ReturnType<typeof serve>\n\nconst servers = new Map<number, ArtifactServer>()\n\nasync function isHealthy(port: number): Promise<boolean> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 500)\n try {\n const response = await fetch(`http://127.0.0.1:${port}/health`, {\n signal: controller.signal,\n })\n return response.ok\n } catch {\n return false\n } finally {\n clearTimeout(timeout)\n }\n}\n\nasync function waitUntilHealthy(port: number): Promise<void> {\n for (let attempt = 0; attempt < 20; attempt += 1) {\n if (await isHealthy(port)) return\n await delay(50)\n }\n throw new Error(`Graph report server did not become healthy on 127.0.0.1:${port}`)\n}\n\nexport async function ensureArtifactServer(port: number): Promise<void> {\n if (servers.has(port)) return\n if (await isHealthy(port)) return\n\n const app = createApp()\n const server = serve({\n fetch: app.fetch,\n hostname: '127.0.0.1',\n port,\n })\n servers.set(port, server)\n server.on('error', (err) => {\n servers.delete(port)\n process.stderr.write(`Chain Insights graph report server failed on 127.0.0.1:${port}: ${(err as Error).message}\\n`)\n })\n\n try {\n await waitUntilHealthy(port)\n } catch (err) {\n servers.delete(port)\n server.close()\n throw err\n }\n}\n\nexport function closeArtifactServers(): void {\n for (const [port, server] of servers.entries()) {\n server.close()\n servers.delete(port)\n }\n}\n"],"mappings":";;;;AAMA,MAAM,0BAAU,IAAI,IAA4B;AAEhD,eAAe,UAAU,MAAgC;CACvD,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,UAAU,iBAAiB,WAAW,MAAM,GAAG,GAAG;CACxD,IAAI;EAIF,QAAO,MAHgB,MAAM,oBAAoB,KAAK,UAAU,EAC9D,QAAQ,WAAW,OACrB,CAAC,EAAA,CACe;CAClB,QAAQ;EACN,OAAO;CACT,UAAU;EACR,aAAa,OAAO;CACtB;AACF;AAEA,eAAe,iBAAiB,MAA6B;CAC3D,KAAK,IAAI,UAAU,GAAG,UAAU,IAAI,WAAW,GAAG;EAChD,IAAI,MAAM,UAAU,IAAI,GAAG;EAC3B,MAAMA,aAAM,EAAE;CAChB;CACA,MAAM,IAAI,MAAM,2DAA2D,MAAM;AACnF;AAEA,eAAsB,qBAAqB,MAA6B;CACtE,IAAI,QAAQ,IAAI,IAAI,GAAG;CACvB,IAAI,MAAM,UAAU,IAAI,GAAG;CAG3B,MAAM,SAAS,MAAM;EACnB,OAFU,UAED,CAAC,CAAC;EACX,UAAU;EACV;CACF,CAAC;CACD,QAAQ,IAAI,MAAM,MAAM;CACxB,OAAO,GAAG,UAAU,QAAQ;EAC1B,QAAQ,OAAO,IAAI;EACnB,QAAQ,OAAO,MAAM,0DAA0D,KAAK,IAAK,IAAc,QAAQ,GAAG;CACpH,CAAC;CAED,IAAI;EACF,MAAM,iBAAiB,IAAI;CAC7B,SAAS,KAAK;EACZ,QAAQ,OAAO,IAAI;EACnB,OAAO,MAAM;EACb,MAAM;CACR;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_client = require("./client-
|
|
1
|
+
const require_client = require("./client-rVqMG2j9.cjs");
|
|
2
2
|
//#region src/mcp/capabilities.ts
|
|
3
3
|
const BITTENSOR_SEMANTIC_NETWORKS = /* @__PURE__ */ new Set([
|
|
4
4
|
"bittensor",
|
|
@@ -51,7 +51,7 @@ function metadataNetworksUrl(endpoint) {
|
|
|
51
51
|
async function fetchNetworkCapabilities(config) {
|
|
52
52
|
const request = metadataNetworksUrl(require_client.resolveGraphMcpEndpoint(config));
|
|
53
53
|
const headers = new Headers();
|
|
54
|
-
const token = config.graphMcpAuthToken?.trim()
|
|
54
|
+
const token = config.graphMcpAuthToken?.trim();
|
|
55
55
|
if (token) require_client.applyMcpAuthHeaders(headers, token);
|
|
56
56
|
let response;
|
|
57
57
|
try {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as resolveGraphMcpEndpoint, n as applyMcpAuthHeaders } from "./client-
|
|
1
|
+
import { a as resolveGraphMcpEndpoint, n as applyMcpAuthHeaders } from "./client-C_HEuq0f.mjs";
|
|
2
2
|
//#region src/mcp/capabilities.ts
|
|
3
3
|
const BITTENSOR_SEMANTIC_NETWORKS = /* @__PURE__ */ new Set([
|
|
4
4
|
"bittensor",
|
|
@@ -51,7 +51,7 @@ function metadataNetworksUrl(endpoint) {
|
|
|
51
51
|
async function fetchNetworkCapabilities(config) {
|
|
52
52
|
const request = metadataNetworksUrl(resolveGraphMcpEndpoint(config));
|
|
53
53
|
const headers = new Headers();
|
|
54
|
-
const token = config.graphMcpAuthToken?.trim()
|
|
54
|
+
const token = config.graphMcpAuthToken?.trim();
|
|
55
55
|
if (token) applyMcpAuthHeaders(headers, token);
|
|
56
56
|
let response;
|
|
57
57
|
try {
|
|
@@ -134,4 +134,4 @@ function formatNetworkCapabilities(document) {
|
|
|
134
134
|
//#endregion
|
|
135
135
|
export { fetchNetworkCapabilities, formatNetworkCapabilities };
|
|
136
136
|
|
|
137
|
-
//# sourceMappingURL=capabilities-
|
|
137
|
+
//# sourceMappingURL=capabilities-GuF58uDa.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities-Bnlnmu6P.mjs","names":[],"sources":["../src/mcp/capabilities.ts"],"sourcesContent":["import type { InvestigatorConfig } from '../config/schema.js'\nimport { applyMcpAuthHeaders, resolveGraphMcpEndpoint } from './client.js'\n\nexport interface NetworkTopologyLayer {\n enabled: boolean\n coverage?: {\n from_block?: number\n to_block?: number\n from_timestamp?: string\n to_timestamp?: string\n chain_tip_block?: number\n blocks_behind_tip?: number\n }\n}\n\nexport interface NetworkLayerCapability {\n enabled: boolean\n live?: NetworkTopologyLayer\n archive?: NetworkTopologyLayer\n}\n\nexport interface NetworkCapability {\n network: string\n display_name?: string\n status: string\n default?: boolean\n layers: Record<string, NetworkLayerCapability>\n tools: Record<string, string>\n coverage?: {\n from_block?: number\n to_block?: number\n from_timestamp?: string\n to_timestamp?: string\n chain_tip_block?: number\n blocks_behind_tip?: number\n }\n freshness?: {\n last_processed_at?: string\n last_successful_sync_at?: string\n max_data_age_seconds?: number\n last_processing_duration_seconds?: number\n }\n}\n\nexport interface NetworkCapabilitiesDocument {\n schema: 'chain-insights.network-capabilities.v1'\n networks: NetworkCapability[]\n}\n\nconst BITTENSOR_SEMANTIC_NETWORKS = new Set(['bittensor', 'bittensor_evm', 'bittensor_semantic'])\nconst PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS = {\n aml_address_risk: 'available',\n aml_trace_victim_funds: 'available',\n aml_trace_deposit_sources: 'available',\n aml_trace_suspect_funds: 'available',\n graph_query: 'available',\n graph_query_batch: 'available',\n meta_network_capabilities: 'available',\n meta_usage_status: 'available',\n wallet_balance: 'available',\n} as const\nconst AVAILABLE_TOOLS_PER_LINE = 3\n\nfunction publicNetworkCapabilities(document: NetworkCapabilitiesDocument): NetworkCapabilitiesDocument {\n const source = document.networks.find((network) => BITTENSOR_SEMANTIC_NETWORKS.has(network.network))\n return {\n schema: 'chain-insights.network-capabilities.v1',\n networks: source\n ? [{\n network: 'bittensor',\n display_name: 'Bittensor',\n status: source.status || 'live',\n default: source.default !== false,\n layers: {\n facts: { enabled: source.layers.facts?.enabled === true },\n risk: { enabled: source.layers.risk?.enabled === true },\n topology: {\n enabled: source.layers.topology?.enabled === true,\n ...(source.layers.topology?.live ? { live: source.layers.topology.live } : {}),\n ...(source.layers.topology?.archive ? { archive: source.layers.topology.archive } : {}),\n },\n },\n ...(source.coverage ? { coverage: source.coverage } : {}),\n ...(source.freshness ? { freshness: source.freshness } : {}),\n tools: PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,\n }]\n : [],\n }\n}\n\nfunction metadataNetworksUrl(endpoint: string): URL {\n const url = new URL(endpoint)\n url.pathname = '/metadata/networks'\n url.search = ''\n url.hash = ''\n return url\n}\n\nexport async function fetchNetworkCapabilities(\n config: Pick<InvestigatorConfig, 'mcpAuthToken' | 'graphMcpAuthToken' | 'graphMcpMode' | 'graphMcpEndpoint' | 'mcpEndpoint'>,\n): Promise<NetworkCapabilitiesDocument> {\n const endpoint = resolveGraphMcpEndpoint(config)\n const request = metadataNetworksUrl(endpoint)\n const headers = new Headers()\n const token = config.graphMcpAuthToken?.trim() || config.mcpAuthToken?.trim()\n if (token) {\n applyMcpAuthHeaders(headers, token)\n }\n let response: Response\n try {\n response = await fetch(request, { headers })\n } catch (err) {\n throw new Error(`network capabilities unavailable at ${request}: ${(err as Error).message}`)\n }\n if (!response.ok) {\n throw new Error(`network capabilities unavailable at ${request}: HTTP ${response.status}`)\n }\n const parsed = await response.json() as NetworkCapabilitiesDocument\n if (parsed.schema !== 'chain-insights.network-capabilities.v1' || !Array.isArray(parsed.networks)) {\n throw new Error('network capabilities response has unsupported schema')\n }\n return publicNetworkCapabilities(parsed)\n}\n\nfunction layerValue(network: NetworkCapability, layer: string): string {\n const capability = network.layers[layer]\n if (!capability?.enabled) return 'no'\n return 'yes'\n}\n\nfunction availableTools(network: NetworkCapability): string[] {\n const effectiveTools = BITTENSOR_SEMANTIC_NETWORKS.has(network.network) && network.layers.topology?.enabled === true\n ? {\n ...(network.tools ?? {}),\n ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,\n }\n : network.tools ?? {}\n const tools = Object.entries(effectiveTools)\n .filter(([, status]) => status === 'available')\n .map(([name]) => name)\n return tools.sort()\n}\n\nfunction availableToolLines(network: NetworkCapability): string[] {\n const tools = availableTools(network)\n if (tools.length === 0) return ['none']\n const lines: string[] = []\n for (let index = 0; index < tools.length; index += AVAILABLE_TOOLS_PER_LINE) {\n lines.push(tools.slice(index, index + AVAILABLE_TOOLS_PER_LINE).join(', '))\n }\n return lines\n}\n\nfunction shortDate(value?: string): string {\n if (!value) return ''\n return value.slice(0, 10)\n}\n\nfunction datasetLabel(network: NetworkCapability): string {\n const coverage = network.coverage\n if (!coverage) return 'unknown'\n const blockRange = coverage.from_block !== undefined && coverage.to_block !== undefined\n ? `${coverage.from_block}..${coverage.to_block}`\n : 'blocks unknown'\n const dateRange = coverage.from_timestamp && coverage.to_timestamp\n ? `${shortDate(coverage.from_timestamp)}..${shortDate(coverage.to_timestamp)}`\n : ''\n if (blockRange === 'blocks unknown' && dateRange === '') return 'unknown'\n if (blockRange === 'blocks unknown') return dateRange\n if (dateRange === '') return blockRange\n return `${blockRange} / ${dateRange}`\n}\n\nexport function formatNetworkCapabilities(document: NetworkCapabilitiesDocument): string {\n if (document.networks.length === 0) return 'No supported networks advertised.'\n const headers = ['Network', 'Topology', 'Facts', 'Risk', 'Dataset', 'Available tools']\n const widths = [14, 10, 8, 8, 38, 64]\n const row = (values: string[]) => values.map((value, index) => value.padEnd(widths[index]!)).join(' ')\n const networkRows = document.networks.flatMap((network) => {\n const toolLines = availableToolLines(network)\n return toolLines.map((toolLine, index) => row([\n index === 0 ? network.display_name || network.network : '',\n index === 0 ? layerValue(network, 'topology') : '',\n index === 0 ? layerValue(network, 'facts') : '',\n index === 0 ? layerValue(network, 'risk') : '',\n index === 0 ? datasetLabel(network) : '',\n toolLine,\n ]))\n })\n return [\n row(headers),\n widths.map((width) => '-'.repeat(width)).join(' '),\n ...networkRows,\n ].join('\\n')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"capabilities-GuF58uDa.mjs","names":[],"sources":["../src/mcp/capabilities.ts"],"sourcesContent":["import type { InvestigatorConfig } from '../config/schema.js'\nimport { applyMcpAuthHeaders, resolveGraphMcpEndpoint } from './client.js'\n\nexport interface NetworkTopologyLayer {\n enabled: boolean\n coverage?: {\n from_block?: number\n to_block?: number\n from_timestamp?: string\n to_timestamp?: string\n chain_tip_block?: number\n blocks_behind_tip?: number\n }\n}\n\nexport interface NetworkLayerCapability {\n enabled: boolean\n live?: NetworkTopologyLayer\n archive?: NetworkTopologyLayer\n}\n\nexport interface NetworkCapability {\n network: string\n display_name?: string\n status: string\n default?: boolean\n layers: Record<string, NetworkLayerCapability>\n tools: Record<string, string>\n coverage?: {\n from_block?: number\n to_block?: number\n from_timestamp?: string\n to_timestamp?: string\n chain_tip_block?: number\n blocks_behind_tip?: number\n }\n freshness?: {\n last_processed_at?: string\n last_successful_sync_at?: string\n max_data_age_seconds?: number\n last_processing_duration_seconds?: number\n }\n}\n\nexport interface NetworkCapabilitiesDocument {\n schema: 'chain-insights.network-capabilities.v1'\n networks: NetworkCapability[]\n}\n\nconst BITTENSOR_SEMANTIC_NETWORKS = new Set(['bittensor', 'bittensor_evm', 'bittensor_semantic'])\nconst PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS = {\n aml_address_risk: 'available',\n aml_trace_victim_funds: 'available',\n aml_trace_deposit_sources: 'available',\n aml_trace_suspect_funds: 'available',\n graph_query: 'available',\n graph_query_batch: 'available',\n meta_network_capabilities: 'available',\n meta_usage_status: 'available',\n wallet_balance: 'available',\n} as const\nconst AVAILABLE_TOOLS_PER_LINE = 3\n\nfunction publicNetworkCapabilities(document: NetworkCapabilitiesDocument): NetworkCapabilitiesDocument {\n const source = document.networks.find((network) => BITTENSOR_SEMANTIC_NETWORKS.has(network.network))\n return {\n schema: 'chain-insights.network-capabilities.v1',\n networks: source\n ? [{\n network: 'bittensor',\n display_name: 'Bittensor',\n status: source.status || 'live',\n default: source.default !== false,\n layers: {\n facts: { enabled: source.layers.facts?.enabled === true },\n risk: { enabled: source.layers.risk?.enabled === true },\n topology: {\n enabled: source.layers.topology?.enabled === true,\n ...(source.layers.topology?.live ? { live: source.layers.topology.live } : {}),\n ...(source.layers.topology?.archive ? { archive: source.layers.topology.archive } : {}),\n },\n },\n ...(source.coverage ? { coverage: source.coverage } : {}),\n ...(source.freshness ? { freshness: source.freshness } : {}),\n tools: PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,\n }]\n : [],\n }\n}\n\nfunction metadataNetworksUrl(endpoint: string): URL {\n const url = new URL(endpoint)\n url.pathname = '/metadata/networks'\n url.search = ''\n url.hash = ''\n return url\n}\n\nexport async function fetchNetworkCapabilities(\n config: Pick<InvestigatorConfig, 'graphMcpAuthToken' | 'graphMcpMode' | 'graphMcpEndpoint'>,\n): Promise<NetworkCapabilitiesDocument> {\n const endpoint = resolveGraphMcpEndpoint(config)\n const request = metadataNetworksUrl(endpoint)\n const headers = new Headers()\n const token = config.graphMcpAuthToken?.trim()\n if (token) {\n applyMcpAuthHeaders(headers, token)\n }\n let response: Response\n try {\n response = await fetch(request, { headers })\n } catch (err) {\n throw new Error(`network capabilities unavailable at ${request}: ${(err as Error).message}`)\n }\n if (!response.ok) {\n throw new Error(`network capabilities unavailable at ${request}: HTTP ${response.status}`)\n }\n const parsed = await response.json() as NetworkCapabilitiesDocument\n if (parsed.schema !== 'chain-insights.network-capabilities.v1' || !Array.isArray(parsed.networks)) {\n throw new Error('network capabilities response has unsupported schema')\n }\n return publicNetworkCapabilities(parsed)\n}\n\nfunction layerValue(network: NetworkCapability, layer: string): string {\n const capability = network.layers[layer]\n if (!capability?.enabled) return 'no'\n return 'yes'\n}\n\nfunction availableTools(network: NetworkCapability): string[] {\n const effectiveTools = BITTENSOR_SEMANTIC_NETWORKS.has(network.network) && network.layers.topology?.enabled === true\n ? {\n ...(network.tools ?? {}),\n ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,\n }\n : network.tools ?? {}\n const tools = Object.entries(effectiveTools)\n .filter(([, status]) => status === 'available')\n .map(([name]) => name)\n return tools.sort()\n}\n\nfunction availableToolLines(network: NetworkCapability): string[] {\n const tools = availableTools(network)\n if (tools.length === 0) return ['none']\n const lines: string[] = []\n for (let index = 0; index < tools.length; index += AVAILABLE_TOOLS_PER_LINE) {\n lines.push(tools.slice(index, index + AVAILABLE_TOOLS_PER_LINE).join(', '))\n }\n return lines\n}\n\nfunction shortDate(value?: string): string {\n if (!value) return ''\n return value.slice(0, 10)\n}\n\nfunction datasetLabel(network: NetworkCapability): string {\n const coverage = network.coverage\n if (!coverage) return 'unknown'\n const blockRange = coverage.from_block !== undefined && coverage.to_block !== undefined\n ? `${coverage.from_block}..${coverage.to_block}`\n : 'blocks unknown'\n const dateRange = coverage.from_timestamp && coverage.to_timestamp\n ? `${shortDate(coverage.from_timestamp)}..${shortDate(coverage.to_timestamp)}`\n : ''\n if (blockRange === 'blocks unknown' && dateRange === '') return 'unknown'\n if (blockRange === 'blocks unknown') return dateRange\n if (dateRange === '') return blockRange\n return `${blockRange} / ${dateRange}`\n}\n\nexport function formatNetworkCapabilities(document: NetworkCapabilitiesDocument): string {\n if (document.networks.length === 0) return 'No supported networks advertised.'\n const headers = ['Network', 'Topology', 'Facts', 'Risk', 'Dataset', 'Available tools']\n const widths = [14, 10, 8, 8, 38, 64]\n const row = (values: string[]) => values.map((value, index) => value.padEnd(widths[index]!)).join(' ')\n const networkRows = document.networks.flatMap((network) => {\n const toolLines = availableToolLines(network)\n return toolLines.map((toolLine, index) => row([\n index === 0 ? network.display_name || network.network : '',\n index === 0 ? layerValue(network, 'topology') : '',\n index === 0 ? layerValue(network, 'facts') : '',\n index === 0 ? layerValue(network, 'risk') : '',\n index === 0 ? datasetLabel(network) : '',\n toolLine,\n ]))\n })\n return [\n row(headers),\n widths.map((width) => '-'.repeat(width)).join(' '),\n ...networkRows,\n ].join('\\n')\n}\n"],"mappings":"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"}
|
package/dist/cli.cjs
CHANGED
|
@@ -67,9 +67,9 @@ function resolveTopologyScopeOption(value) {
|
|
|
67
67
|
return value;
|
|
68
68
|
}
|
|
69
69
|
async function withGraphMcpClient(name, fn) {
|
|
70
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
70
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
71
71
|
const config = await loadConfig();
|
|
72
|
-
const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-
|
|
72
|
+
const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-rVqMG2j9.cjs")).then((n) => n.client_exports);
|
|
73
73
|
const paymentFetch = await createConfiguredGraphMcpFetch(config);
|
|
74
74
|
const { Client } = await import("@modelcontextprotocol/sdk/client/index.js");
|
|
75
75
|
const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
@@ -85,8 +85,8 @@ async function withGraphMcpClient(name, fn) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
async function printNetworkCapabilities(opts) {
|
|
88
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
89
|
-
const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-
|
|
88
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
89
|
+
const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-CjIcF3da.cjs"));
|
|
90
90
|
const document = await fetchNetworkCapabilities(await loadConfig());
|
|
91
91
|
if (opts.json) console.log(JSON.stringify(document, null, 2));
|
|
92
92
|
else console.log(formatNetworkCapabilities(document));
|
|
@@ -103,11 +103,11 @@ program.command("serve").description("Start local visualization server").option(
|
|
|
103
103
|
try {
|
|
104
104
|
const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
|
|
105
105
|
const workspaceRoot = requireWorkspaceRoot();
|
|
106
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
106
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
107
107
|
const { resolveServerPort } = await Promise.resolve().then(() => require("./resolve-port-CbaEoODz.cjs"));
|
|
108
108
|
const config = await loadConfig();
|
|
109
109
|
const port = resolveServerPort(opts.port, config.serverPort);
|
|
110
|
-
const { startServer } = await Promise.resolve().then(() => require("./server-
|
|
110
|
+
const { startServer } = await Promise.resolve().then(() => require("./server-BkljWFmU.cjs")).then((n) => n.server_exports);
|
|
111
111
|
console.log(`Workspace: ${workspaceRoot}`);
|
|
112
112
|
startServer(port);
|
|
113
113
|
} catch (err) {
|
|
@@ -116,7 +116,7 @@ program.command("serve").description("Start local visualization server").option(
|
|
|
116
116
|
}
|
|
117
117
|
});
|
|
118
118
|
program.command("status").description("Show toolkit status and configuration").action(async () => {
|
|
119
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
119
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
120
120
|
const { findActiveWorkspace, activeDataDir } = await Promise.resolve().then(() => require("./active-Bj6dohpc.cjs")).then((n) => n.active_exports);
|
|
121
121
|
const config = await loadConfig();
|
|
122
122
|
const workspace = findActiveWorkspace();
|
|
@@ -154,7 +154,7 @@ program.command("update").description("Check npmjs for a newer Chain Insights re
|
|
|
154
154
|
});
|
|
155
155
|
program.command("debug").description("Configure Chain Insights Graph debug mode").addCommand(new commander.Command("on").description("Enable Chain Insights Graph debug mode without x402 payments").requiredOption("--token <token>", "Debug bearer token").option("--endpoint <url>", "Chain Insights Graph endpoint").action(async (opts) => {
|
|
156
156
|
try {
|
|
157
|
-
const { saveConfig } = await Promise.resolve().then(() => require("./config-
|
|
157
|
+
const { saveConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
158
158
|
await saveConfig({
|
|
159
159
|
graphMcpMode: "debug",
|
|
160
160
|
graphMcpAuthToken: opts.token,
|
|
@@ -169,7 +169,7 @@ program.command("debug").description("Configure Chain Insights Graph debug mode"
|
|
|
169
169
|
}
|
|
170
170
|
})).addCommand(new commander.Command("off").description("Disable Chain Insights Graph debug mode and use paid x402 calls").action(async () => {
|
|
171
171
|
try {
|
|
172
|
-
const { saveConfig } = await Promise.resolve().then(() => require("./config-
|
|
172
|
+
const { saveConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
173
173
|
await saveConfig({
|
|
174
174
|
graphMcpMode: "paid",
|
|
175
175
|
graphMcpAuthToken: ""
|
|
@@ -182,7 +182,7 @@ program.command("debug").description("Configure Chain Insights Graph debug mode"
|
|
|
182
182
|
}
|
|
183
183
|
})).addCommand(new commander.Command("status").description("Show Chain Insights Graph payment/debug mode").action(async () => {
|
|
184
184
|
try {
|
|
185
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
185
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
186
186
|
const config = await loadConfig();
|
|
187
187
|
console.log(`Chain Insights Graph mode: ${config.graphMcpMode}`);
|
|
188
188
|
console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
|
|
@@ -197,7 +197,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
|
|
|
197
197
|
try {
|
|
198
198
|
const normalizedKey = key.trim();
|
|
199
199
|
if (!normalizedKey) throw new Error("Test access key is required");
|
|
200
|
-
const { saveConfig } = await Promise.resolve().then(() => require("./config-
|
|
200
|
+
const { saveConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
201
201
|
await saveConfig({
|
|
202
202
|
graphMcpMode: "debug",
|
|
203
203
|
graphMcpAuthToken: normalizedKey,
|
|
@@ -212,7 +212,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
|
|
|
212
212
|
}
|
|
213
213
|
})).addCommand(new commander.Command("clear").description("Remove the Chain Insights Graph test access key and use paid x402 calls").action(async () => {
|
|
214
214
|
try {
|
|
215
|
-
const { saveConfig } = await Promise.resolve().then(() => require("./config-
|
|
215
|
+
const { saveConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
216
216
|
await saveConfig({
|
|
217
217
|
graphMcpMode: "paid",
|
|
218
218
|
graphMcpAuthToken: ""
|
|
@@ -225,7 +225,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
|
|
|
225
225
|
}
|
|
226
226
|
})).addCommand(new commander.Command("status").description("Show Chain Insights Graph test access key status").action(async () => {
|
|
227
227
|
try {
|
|
228
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
228
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
229
229
|
const config = await loadConfig();
|
|
230
230
|
console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
|
|
231
231
|
console.log(`Access key: ${config.graphMcpAuthToken?.trim() ? "configured" : "not configured"}`);
|
|
@@ -237,7 +237,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
|
|
|
237
237
|
}));
|
|
238
238
|
program.command("init").description("Initialize an investigation workspace").argument("[dir]", "Workspace directory to initialize", ".").option("--force", "Overwrite existing workspace files").action(async (dir, opts) => {
|
|
239
239
|
try {
|
|
240
|
-
const { initWorkspace } = await Promise.resolve().then(() => require("./init-
|
|
240
|
+
const { initWorkspace } = await Promise.resolve().then(() => require("./init-s0SU97fS.cjs"));
|
|
241
241
|
const result = await initWorkspace({
|
|
242
242
|
targetDir: dir,
|
|
243
243
|
force: opts.force
|
|
@@ -259,8 +259,8 @@ program.command("setup").description("Configure external MCP clients").addComman
|
|
|
259
259
|
runInstaller("--hermes");
|
|
260
260
|
}));
|
|
261
261
|
program.command("config").description("Read or write configuration values").addCommand(new commander.Command("get").argument("<key>", "Config key to read").action(async (key) => {
|
|
262
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
263
|
-
const { CONFIG_KEYS } = await Promise.resolve().then(() => require("./schema-
|
|
262
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
263
|
+
const { CONFIG_KEYS } = await Promise.resolve().then(() => require("./schema-Dj2mqv1g.cjs")).then((n) => n.schema_exports);
|
|
264
264
|
if (!CONFIG_KEYS.includes(key)) {
|
|
265
265
|
console.error(`Unknown config key: ${key}`);
|
|
266
266
|
process.exit(1);
|
|
@@ -280,8 +280,8 @@ program.command("config").description("Read or write configuration values").addC
|
|
|
280
280
|
}
|
|
281
281
|
return;
|
|
282
282
|
}
|
|
283
|
-
const { loadConfig, saveConfig } = await Promise.resolve().then(() => require("./config-
|
|
284
|
-
const { CONFIG_KEYS, DEFAULT_CONFIG } = await Promise.resolve().then(() => require("./schema-
|
|
283
|
+
const { loadConfig, saveConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
284
|
+
const { CONFIG_KEYS, DEFAULT_CONFIG } = await Promise.resolve().then(() => require("./schema-Dj2mqv1g.cjs")).then((n) => n.schema_exports);
|
|
285
285
|
const current = await loadConfig();
|
|
286
286
|
if (!CONFIG_KEYS.includes(key)) {
|
|
287
287
|
console.error(`Unknown config key: ${key}`);
|
|
@@ -375,8 +375,8 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
375
375
|
const { loadSchema, saveSchema } = await Promise.resolve().then(() => require("./schema-cache-CX0r2UQp.cjs"));
|
|
376
376
|
const { formatToolsTable } = await Promise.resolve().then(() => require("./format-9NLBykEL.cjs"));
|
|
377
377
|
const { visibleRemoteTools } = await Promise.resolve().then(() => require("./tool-visibility-Cl2p7Ghx.cjs")).then((n) => n.tool_visibility_exports);
|
|
378
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
379
|
-
const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-
|
|
378
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
379
|
+
const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-rVqMG2j9.cjs")).then((n) => n.client_exports);
|
|
380
380
|
const config = await loadConfig();
|
|
381
381
|
const graphMcpEndpoint = resolveGraphMcpEndpoint(config);
|
|
382
382
|
let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint);
|
|
@@ -401,23 +401,11 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
401
401
|
console.error(err.message);
|
|
402
402
|
process.exit(1);
|
|
403
403
|
}
|
|
404
|
-
})).addCommand(new commander.Command("aml-address-risk").description("Screen an address for AML risk, exchange behavior, and optional comparison with another address").requiredOption("--address <address>", "Full blockchain address to screen").requiredOption("--network <network>", "Network to query. Run `cia mcp networks` for supported networks.").option("--compare-address <address>", "Optional second address to compare against the screened address").option("--topology-scope <scope>", "Which topology graph to query: live_topology (default) or archive_topology (full history)").
|
|
404
|
+
})).addCommand(new commander.Command("aml-address-risk").description("Screen an address for AML risk, exchange behavior, and optional comparison with another address").requiredOption("--address <address>", "Full blockchain address to screen").requiredOption("--network <network>", "Network to query. Run `cia mcp networks` for supported networks.").option("--compare-address <address>", "Optional second address to compare against the screened address").option("--topology-scope <scope>", "Which topology graph to query: live_topology (default) or archive_topology (full history)").action(async (opts) => {
|
|
405
405
|
try {
|
|
406
406
|
const topologyScope = resolveTopologyScopeOption(opts.topologyScope);
|
|
407
407
|
await withGraphMcpClient("chain-insights-cli-aml-address-risk", async (client) => {
|
|
408
|
-
|
|
409
|
-
printMcpTextContent(await client.callTool({
|
|
410
|
-
name: "aml_address_risk",
|
|
411
|
-
arguments: {
|
|
412
|
-
address: opts.address,
|
|
413
|
-
network: opts.network,
|
|
414
|
-
...opts.compareAddress ? { compare_address: opts.compareAddress } : {},
|
|
415
|
-
...topologyScope ? { topology_scope: topologyScope } : {}
|
|
416
|
-
}
|
|
417
|
-
}));
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-H9x9ob-q.cjs"));
|
|
408
|
+
const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-CXD65Dfk.cjs"));
|
|
421
409
|
const result = await addressRisk(client, {
|
|
422
410
|
address: opts.address,
|
|
423
411
|
network: opts.network,
|
|
@@ -430,30 +418,13 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
430
418
|
console.error(err.message);
|
|
431
419
|
process.exit(1);
|
|
432
420
|
}
|
|
433
|
-
})).addCommand(new commander.Command("aml-trace-victim-funds").description("Trace victim/source addresses forward to exchange deposit candidates").requiredOption("--victim-addresses <addresses>", "Comma-separated full victim/source addresses, max 5").requiredOption("--network <network>", "Network to query. Run `cia mcp networks` for supported networks.").option("--known-suspect-addresses <addresses>", "Optional known suspect addresses for context only, max 5").option("--incident-timestamp-ms <milliseconds>", "Optional incident timestamp in milliseconds").option("--max-hops <number>", "Maximum trace hops, 1-5").option("--per-address-limit <number>", "Maximum exchange paths/results per address, 1-10").option("--min-amount-sum <number>", "Minimum USD amount (amount_usd_sum) for traced edges").option("--topology-scope <scope>", "Which topology graph to query: live_topology (default) or archive_topology (full history)").
|
|
421
|
+
})).addCommand(new commander.Command("aml-trace-victim-funds").description("Trace victim/source addresses forward to exchange deposit candidates").requiredOption("--victim-addresses <addresses>", "Comma-separated full victim/source addresses, max 5").requiredOption("--network <network>", "Network to query. Run `cia mcp networks` for supported networks.").option("--known-suspect-addresses <addresses>", "Optional known suspect addresses for context only, max 5").option("--incident-timestamp-ms <milliseconds>", "Optional incident timestamp in milliseconds").option("--max-hops <number>", "Maximum trace hops, 1-5").option("--per-address-limit <number>", "Maximum exchange paths/results per address, 1-10").option("--min-amount-sum <number>", "Minimum USD amount (amount_usd_sum) for traced edges").option("--topology-scope <scope>", "Which topology graph to query: live_topology (default) or archive_topology (full history)").action(async (opts) => {
|
|
434
422
|
try {
|
|
435
423
|
const topologyScope = resolveTopologyScopeOption(opts.topologyScope);
|
|
436
424
|
const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
|
|
437
425
|
requireWorkspaceRoot();
|
|
438
426
|
await withGraphMcpClient("chain-insights-cli-aml-trace-victim-funds", async (client, config) => {
|
|
439
|
-
|
|
440
|
-
const { buildTraceVictimFundsRemoteArgs } = await Promise.resolve().then(() => require("./remote-trace-args-BkWtRX_h.cjs"));
|
|
441
|
-
printMcpTextContent(await client.callTool({
|
|
442
|
-
name: "aml_trace_victim_funds",
|
|
443
|
-
arguments: buildTraceVictimFundsRemoteArgs({
|
|
444
|
-
victimAddresses: opts.victimAddresses,
|
|
445
|
-
network: opts.network,
|
|
446
|
-
knownSuspectAddresses: opts.knownSuspectAddresses,
|
|
447
|
-
incidentTimestampMs: opts.incidentTimestampMs,
|
|
448
|
-
maxHops: opts.maxHops,
|
|
449
|
-
perAddressLimit: opts.perAddressLimit,
|
|
450
|
-
minAmountSum: opts.minAmountSum,
|
|
451
|
-
topologyScope: topologyScope ?? void 0
|
|
452
|
-
})
|
|
453
|
-
}));
|
|
454
|
-
return;
|
|
455
|
-
}
|
|
456
|
-
const { traceVictimFunds } = await Promise.resolve().then(() => require("./public-tools-H9x9ob-q.cjs"));
|
|
427
|
+
const { traceVictimFunds } = await Promise.resolve().then(() => require("./public-tools-CXD65Dfk.cjs"));
|
|
457
428
|
const result = await traceVictimFunds(client, config, {
|
|
458
429
|
victimAddresses: opts.victimAddresses,
|
|
459
430
|
knownSuspectAddresses: opts.knownSuspectAddresses,
|
|
@@ -477,7 +448,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
477
448
|
const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
|
|
478
449
|
requireWorkspaceRoot();
|
|
479
450
|
await withGraphMcpClient("chain-insights-cli-aml-trace-suspect-funds", async (client, config) => {
|
|
480
|
-
const { traceSuspectFunds } = await Promise.resolve().then(() => require("./public-tools-
|
|
451
|
+
const { traceSuspectFunds } = await Promise.resolve().then(() => require("./public-tools-CXD65Dfk.cjs"));
|
|
481
452
|
const result = await traceSuspectFunds(client, config, {
|
|
482
453
|
suspectAddresses: opts.suspectAddresses,
|
|
483
454
|
network: opts.network,
|
|
@@ -500,7 +471,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
500
471
|
const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
|
|
501
472
|
requireWorkspaceRoot();
|
|
502
473
|
await withGraphMcpClient("chain-insights-cli-aml-trace-deposit-sources", async (client, config) => {
|
|
503
|
-
const { traceDepositSources } = await Promise.resolve().then(() => require("./public-tools-
|
|
474
|
+
const { traceDepositSources } = await Promise.resolve().then(() => require("./public-tools-CXD65Dfk.cjs"));
|
|
504
475
|
const result = await traceDepositSources(client, config, {
|
|
505
476
|
depositAddresses: opts.depositAddresses,
|
|
506
477
|
network: opts.network,
|
|
@@ -544,13 +515,13 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
544
515
|
} catch (err) {
|
|
545
516
|
const { isMissingUsageStatusToolError, primitiveBackendUsageStatus, usageStatusText } = await Promise.resolve().then(() => require("./usage-status-H1xgCu99.cjs")).then((n) => n.usage_status_exports);
|
|
546
517
|
if (!isMissingUsageStatusToolError(err)) throw err;
|
|
547
|
-
const { resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-
|
|
518
|
+
const { resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-rVqMG2j9.cjs")).then((n) => n.client_exports);
|
|
548
519
|
console.log(usageStatusText(primitiveBackendUsageStatus(resolveGraphMcpEndpoint(config))));
|
|
549
520
|
}
|
|
550
521
|
return;
|
|
551
522
|
}
|
|
552
523
|
if (tool === "aml_address_risk") {
|
|
553
|
-
const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-
|
|
524
|
+
const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-CXD65Dfk.cjs"));
|
|
554
525
|
const result = await addressRisk(client, {
|
|
555
526
|
address: String(args["address"] ?? ""),
|
|
556
527
|
network: String(args["network"] ?? ""),
|
|
@@ -561,7 +532,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
561
532
|
return;
|
|
562
533
|
}
|
|
563
534
|
if (tool === "aml_trace_victim_funds") {
|
|
564
|
-
const { traceVictimFunds } = await Promise.resolve().then(() => require("./public-tools-
|
|
535
|
+
const { traceVictimFunds } = await Promise.resolve().then(() => require("./public-tools-CXD65Dfk.cjs"));
|
|
565
536
|
const result = await traceVictimFunds(client, config, {
|
|
566
537
|
victimAddresses: args["victim_addresses"] ?? "",
|
|
567
538
|
knownSuspectAddresses: args["known_suspect_addresses"],
|
|
@@ -575,7 +546,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
575
546
|
return;
|
|
576
547
|
}
|
|
577
548
|
if (tool === "aml_trace_suspect_funds") {
|
|
578
|
-
const { traceSuspectFunds } = await Promise.resolve().then(() => require("./public-tools-
|
|
549
|
+
const { traceSuspectFunds } = await Promise.resolve().then(() => require("./public-tools-CXD65Dfk.cjs"));
|
|
579
550
|
const result = await traceSuspectFunds(client, config, {
|
|
580
551
|
suspectAddresses: args["suspect_addresses"] ?? "",
|
|
581
552
|
network: String(args["network"] ?? ""),
|
|
@@ -588,7 +559,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
588
559
|
return;
|
|
589
560
|
}
|
|
590
561
|
if (tool === "aml_trace_deposit_sources") {
|
|
591
|
-
const { traceDepositSources } = await Promise.resolve().then(() => require("./public-tools-
|
|
562
|
+
const { traceDepositSources } = await Promise.resolve().then(() => require("./public-tools-CXD65Dfk.cjs"));
|
|
592
563
|
const result = await traceDepositSources(client, config, {
|
|
593
564
|
depositAddresses: args["deposit_addresses"] ?? "",
|
|
594
565
|
network: String(args["network"] ?? ""),
|
|
@@ -615,7 +586,7 @@ program.command("viz").description("Generate a workspace visualization").argumen
|
|
|
615
586
|
console.error("Provide either a visualization source ID or --data <file.json>");
|
|
616
587
|
process.exit(1);
|
|
617
588
|
}
|
|
618
|
-
const { loadConfig } = await Promise.resolve().then(() => require("./config-
|
|
589
|
+
const { loadConfig } = await Promise.resolve().then(() => require("./config-B8Hk-G1y.cjs")).then((n) => n.config_exports);
|
|
619
590
|
const { resolveServerPort } = await Promise.resolve().then(() => require("./resolve-port-CbaEoODz.cjs"));
|
|
620
591
|
const config = await loadConfig();
|
|
621
592
|
const port = resolveServerPort(opts.port, config.serverPort);
|
|
@@ -624,7 +595,7 @@ program.command("viz").description("Generate a workspace visualization").argumen
|
|
|
624
595
|
sourceId,
|
|
625
596
|
dataFile: opts.data
|
|
626
597
|
});
|
|
627
|
-
const { startServer } = await Promise.resolve().then(() => require("./server-
|
|
598
|
+
const { startServer } = await Promise.resolve().then(() => require("./server-BkljWFmU.cjs")).then((n) => n.server_exports);
|
|
628
599
|
startServer(port);
|
|
629
600
|
const url = `http://127.0.0.1:${port}/viz/${result.vizId}`;
|
|
630
601
|
console.log(`Visualization: ${url}`);
|