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.
Files changed (50) hide show
  1. package/bin/install.cjs +1 -2
  2. package/dist/{app-CDnQ2JzJ.cjs → app-BNrqZ_LR.cjs} +1 -1
  3. package/dist/{app-qkaa5DYD.mjs → app-CCXmYEV1.mjs} +2 -2
  4. package/dist/{app-qkaa5DYD.mjs.map → app-CCXmYEV1.mjs.map} +1 -1
  5. package/dist/{artifact-server-BXA0gdZE.cjs → artifact-server-B4YVpWK2.cjs} +1 -1
  6. package/dist/{artifact-server-Dw7AI6B1.mjs → artifact-server-DR13HEei.mjs} +2 -2
  7. package/dist/{artifact-server-Dw7AI6B1.mjs.map → artifact-server-DR13HEei.mjs.map} +1 -1
  8. package/dist/{capabilities-CKBZbIBf.cjs → capabilities-CjIcF3da.cjs} +2 -2
  9. package/dist/{capabilities-Bnlnmu6P.mjs → capabilities-GuF58uDa.mjs} +3 -3
  10. package/dist/{capabilities-Bnlnmu6P.mjs.map → capabilities-GuF58uDa.mjs.map} +1 -1
  11. package/dist/cli.cjs +33 -62
  12. package/dist/cli.mjs +33 -62
  13. package/dist/cli.mjs.map +1 -1
  14. package/dist/{client-C-A_VCul.mjs → client-C_HEuq0f.mjs} +3 -3
  15. package/dist/{client-C-A_VCul.mjs.map → client-C_HEuq0f.mjs.map} +1 -1
  16. package/dist/{client-oJdEMUFE.cjs → client-rVqMG2j9.cjs} +2 -2
  17. package/dist/{config-Cj4Jwv08.cjs → config-B8Hk-G1y.cjs} +2 -2
  18. package/dist/{config-BSMWXI4K.mjs → config-BFi5yBMm.mjs} +3 -3
  19. package/dist/{config-BSMWXI4K.mjs.map → config-BFi5yBMm.mjs.map} +1 -1
  20. package/dist/index.cjs +4 -4
  21. package/dist/index.d.cts +0 -2
  22. package/dist/index.d.cts.map +1 -1
  23. package/dist/index.d.mts +0 -2
  24. package/dist/index.d.mts.map +1 -1
  25. package/dist/index.mjs +4 -4
  26. package/dist/{init-B3sU6b3N.mjs → init-BWFFHDtL.mjs} +2 -2
  27. package/dist/{init-B3sU6b3N.mjs.map → init-BWFFHDtL.mjs.map} +1 -1
  28. package/dist/{init-BmyNlJ9M.cjs → init-s0SU97fS.cjs} +1 -1
  29. package/dist/{mcp-endpoint-CwsaQ8gL.cjs → mcp-endpoint-BIWrUOFG.cjs} +0 -7
  30. package/dist/{mcp-endpoint-B6QETHQM.mjs → mcp-endpoint-DbWtLcba.mjs} +2 -3
  31. package/dist/mcp-endpoint-DbWtLcba.mjs.map +1 -0
  32. package/dist/mcp-proxy.cjs +9 -9
  33. package/dist/mcp-proxy.mjs +9 -9
  34. package/dist/{public-tools-H9x9ob-q.cjs → public-tools-CXD65Dfk.cjs} +17 -1
  35. package/dist/{public-tools-BTxuEFAS.mjs → public-tools-DScJ1mRk.mjs} +18 -2
  36. package/dist/public-tools-DScJ1mRk.mjs.map +1 -0
  37. package/dist/{schema-Byt6GeSZ.cjs → schema-Dj2mqv1g.cjs} +1 -5
  38. package/dist/{schema-BbtE--TF.mjs → schema-zWbVYCQW.mjs} +2 -6
  39. package/dist/schema-zWbVYCQW.mjs.map +1 -0
  40. package/dist/{server-B5HlORyO.cjs → server-BkljWFmU.cjs} +1 -1
  41. package/dist/{server-Dy4d0Td1.mjs → server-CGGSh1TZ.mjs} +2 -2
  42. package/dist/{server-Dy4d0Td1.mjs.map → server-CGGSh1TZ.mjs.map} +1 -1
  43. package/docs/architecture.md +0 -2
  44. package/package.json +1 -1
  45. package/dist/mcp-endpoint-B6QETHQM.mjs.map +0 -1
  46. package/dist/public-tools-BTxuEFAS.mjs.map +0 -1
  47. package/dist/remote-trace-args-BkWtRX_h.cjs +0 -29
  48. package/dist/remote-trace-args-umlI_GIv.mjs +0 -31
  49. package/dist/remote-trace-args-umlI_GIv.mjs.map +0 -1
  50. 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
- mcpEndpoint: 'http://localhost:4000',
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-BSMWXI4K.mjs").then((n) => n.t);
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-qkaa5DYD.mjs.map
140
+ //# sourceMappingURL=app-CCXmYEV1.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-qkaa5DYD.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
+ {"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
- const require_app = require("./app-CDnQ2JzJ.cjs");
1
+ const require_app = require("./app-BNrqZ_LR.cjs");
2
2
  let _hono_node_server = require("@hono/node-server");
3
3
  let node_timers_promises = require("node:timers/promises");
4
4
  //#region src/mcp/artifact-server.ts
@@ -1,4 +1,4 @@
1
- import { t as createApp } from "./app-qkaa5DYD.mjs";
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-Dw7AI6B1.mjs.map
48
+ //# sourceMappingURL=artifact-server-DR13HEei.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-server-Dw7AI6B1.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
+ {"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-oJdEMUFE.cjs");
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() || config.mcpAuthToken?.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-C-A_VCul.mjs";
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() || config.mcpAuthToken?.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-Bnlnmu6P.mjs.map
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":";;AAiDA,MAAM,8CAA8B,IAAI,IAAI;CAAC;CAAa;CAAiB;AAAoB,CAAC;AAChG,MAAM,oCAAoC;CACxC,kBAAkB;CAClB,wBAAwB;CACxB,2BAA2B;CAC3B,yBAAyB;CACzB,aAAa;CACb,mBAAmB;CACnB,2BAA2B;CAC3B,mBAAmB;CACnB,gBAAgB;AAClB;AACA,MAAM,2BAA2B;AAEjC,SAAS,0BAA0B,UAAoE;CACrG,MAAM,SAAS,SAAS,SAAS,MAAM,YAAY,4BAA4B,IAAI,QAAQ,OAAO,CAAC;CACnG,OAAO;EACL,QAAQ;EACR,UAAU,SACN,CAAC;GACD,SAAS;GACT,cAAc;GACd,QAAQ,OAAO,UAAU;GACzB,SAAS,OAAO,YAAY;GAC5B,QAAQ;IACN,OAAO,EAAE,SAAS,OAAO,OAAO,OAAO,YAAY,KAAK;IACxD,MAAM,EAAE,SAAS,OAAO,OAAO,MAAM,YAAY,KAAK;IACtD,UAAU;KACR,SAAS,OAAO,OAAO,UAAU,YAAY;KAC7C,GAAI,OAAO,OAAO,UAAU,OAAO,EAAE,MAAM,OAAO,OAAO,SAAS,KAAK,IAAI,CAAC;KAC5E,GAAI,OAAO,OAAO,UAAU,UAAU,EAAE,SAAS,OAAO,OAAO,SAAS,QAAQ,IAAI,CAAC;IACvF;GACF;GACA,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;GACvD,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;GAC1D,OAAO;EACT,CAAC,IACC,CAAC;CACP;AACF;AAEA,SAAS,oBAAoB,UAAuB;CAClD,MAAM,MAAM,IAAI,IAAI,QAAQ;CAC5B,IAAI,WAAW;CACf,IAAI,SAAS;CACb,IAAI,OAAO;CACX,OAAO;AACT;AAEA,eAAsB,yBACpB,QACsC;CAEtC,MAAM,UAAU,oBADC,wBAAwB,MACE,CAAC;CAC5C,MAAM,UAAU,IAAI,QAAQ;CAC5B,MAAM,QAAQ,OAAO,mBAAmB,KAAK;CAC7C,IAAI,OACF,oBAAoB,SAAS,KAAK;CAEpC,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,MAAM,SAAS,EAAE,QAAQ,CAAC;CAC7C,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,uCAAuC,QAAQ,IAAK,IAAc,SAAS;CAC7F;CACA,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MAAM,uCAAuC,QAAQ,SAAS,SAAS,QAAQ;CAE3F,MAAM,SAAS,MAAM,SAAS,KAAK;CACnC,IAAI,OAAO,WAAW,4CAA4C,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAC9F,MAAM,IAAI,MAAM,sDAAsD;CAExE,OAAO,0BAA0B,MAAM;AACzC;AAEA,SAAS,WAAW,SAA4B,OAAuB;CAErE,IAAI,CADe,QAAQ,OAAO,MACnB,EAAE,SAAS,OAAO;CACjC,OAAO;AACT;AAEA,SAAS,eAAe,SAAsC;CAC5D,MAAM,iBAAiB,4BAA4B,IAAI,QAAQ,OAAO,KAAK,QAAQ,OAAO,UAAU,YAAY,OAC5G;EACA,GAAI,QAAQ,SAAS,CAAC;EACtB,GAAG;CACL,IACE,QAAQ,SAAS,CAAC;CAItB,OAHc,OAAO,QAAQ,cAAc,CAAC,CACzC,QAAQ,GAAG,YAAY,WAAW,WAAW,CAAC,CAC9C,KAAK,CAAC,UAAU,IACR,CAAC,CAAC,KAAK;AACpB;AAEA,SAAS,mBAAmB,SAAsC;CAChE,MAAM,QAAQ,eAAe,OAAO;CACpC,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM;CACtC,MAAM,QAAkB,CAAC;CACzB,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,0BACjD,MAAM,KAAK,MAAM,MAAM,OAAO,QAAQ,wBAAwB,CAAC,CAAC,KAAK,IAAI,CAAC;CAE5E,OAAO;AACT;AAEA,SAAS,UAAU,OAAwB;CACzC,IAAI,CAAC,OAAO,OAAO;CACnB,OAAO,MAAM,MAAM,GAAG,EAAE;AAC1B;AAEA,SAAS,aAAa,SAAoC;CACxD,MAAM,WAAW,QAAQ;CACzB,IAAI,CAAC,UAAU,OAAO;CACtB,MAAM,aAAa,SAAS,eAAe,KAAA,KAAa,SAAS,aAAa,KAAA,IAC1E,GAAG,SAAS,WAAW,IAAI,SAAS,aACpC;CACJ,MAAM,YAAY,SAAS,kBAAkB,SAAS,eAClD,GAAG,UAAU,SAAS,cAAc,EAAE,IAAI,UAAU,SAAS,YAAY,MACzE;CACJ,IAAI,eAAe,oBAAoB,cAAc,IAAI,OAAO;CAChE,IAAI,eAAe,kBAAkB,OAAO;CAC5C,IAAI,cAAc,IAAI,OAAO;CAC7B,OAAO,GAAG,WAAW,KAAK;AAC5B;AAEA,SAAgB,0BAA0B,UAA+C;CACvF,IAAI,SAAS,SAAS,WAAW,GAAG,OAAO;CAC3C,MAAM,UAAU;EAAC;EAAW;EAAY;EAAS;EAAQ;EAAW;CAAiB;CACrF,MAAM,SAAS;EAAC;EAAI;EAAI;EAAG;EAAG;EAAI;CAAE;CACpC,MAAM,OAAO,WAAqB,OAAO,KAAK,OAAO,UAAU,MAAM,OAAO,OAAO,MAAO,CAAC,CAAC,CAAC,KAAK,IAAI;CACtG,MAAM,cAAc,SAAS,SAAS,SAAS,YAAY;EAEzD,OADkB,mBAAmB,OACtB,CAAC,CAAC,KAAK,UAAU,UAAU,IAAI;GAC5C,UAAU,IAAI,QAAQ,gBAAgB,QAAQ,UAAU;GACxD,UAAU,IAAI,WAAW,SAAS,UAAU,IAAI;GAChD,UAAU,IAAI,WAAW,SAAS,OAAO,IAAI;GAC7C,UAAU,IAAI,WAAW,SAAS,MAAM,IAAI;GAC5C,UAAU,IAAI,aAAa,OAAO,IAAI;GACtC;EACF,CAAC,CAAC;CACJ,CAAC;CACD,OAAO;EACL,IAAI,OAAO;EACX,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;EAClD,GAAG;CACL,CAAC,CAAC,KAAK,IAAI;AACb"}
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-oJdEMUFE.cjs")).then((n) => n.client_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
89
- const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-CKBZbIBf.cjs"));
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-B5HlORyO.cjs")).then((n) => n.server_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-BmyNlJ9M.cjs"));
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
263
- const { CONFIG_KEYS } = await Promise.resolve().then(() => require("./schema-Byt6GeSZ.cjs")).then((n) => n.schema_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
284
- const { CONFIG_KEYS, DEFAULT_CONFIG } = await Promise.resolve().then(() => require("./schema-Byt6GeSZ.cjs")).then((n) => n.schema_exports);
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
379
- const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-oJdEMUFE.cjs")).then((n) => n.client_exports);
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)").option("--remote", "Force remote MCP tool call instead of local Chain Insights recipe").action(async (opts) => {
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
- if (opts.remote) {
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)").option("--remote", "Force remote MCP tool call instead of local Chain Insights recipe").action(async (opts) => {
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
- if (opts.remote) {
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-H9x9ob-q.cjs"));
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-H9x9ob-q.cjs"));
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-oJdEMUFE.cjs")).then((n) => n.client_exports);
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-H9x9ob-q.cjs"));
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-H9x9ob-q.cjs"));
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-H9x9ob-q.cjs"));
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-H9x9ob-q.cjs"));
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-Cj4Jwv08.cjs")).then((n) => n.config_exports);
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-B5HlORyO.cjs")).then((n) => n.server_exports);
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}`);