chain-insights 0.25.0 → 0.26.0

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/README.md CHANGED
@@ -22,12 +22,13 @@ as-is on macOS; on Windows use WSL.
22
22
  ```bash
23
23
  npx chain-insights@latest --help # run without installing
24
24
  npm install -g chain-insights # or install the cia CLI globally
25
- cia aml-address-risk --address 0xYourAddressHere --network robinhood
25
+ cia mcp aml-address-risk --address 0xYourAddressHere --network robinhood
26
26
  cia networks # network status + dataset overview
27
27
  cia network robinhood # details for one network
28
28
  ```
29
29
 
30
- Sixty seconds gets you the CLI, a network overview, and the remote tool catalog.
30
+ Sixty seconds gets you the CLI, a network overview, and the available tools for
31
+ Robinhood.
31
32
  To call the same tools from an agent, register the MCP proxy:
32
33
  `cia setup claude-code` (or `codex` / `hermes`).
33
34
 
@@ -38,7 +39,7 @@ script needs indented JSON:
38
39
  cia mcp call --json graph_query \
39
40
  network=robinhood \
40
41
  "query=USE topology MATCH (a:Address) RETURN a.address AS address LIMIT 10"
41
- cia aml-address-risk --json --address 0xYourAddressHere --network robinhood
42
+ cia mcp aml-address-risk --json --address 0xYourAddressHere --network robinhood
42
43
  ```
43
44
 
44
45
  The AML address-risk contract uses the latest version when `version` is
@@ -143,7 +144,7 @@ Graph queries choose the read graph explicitly:
143
144
  | Graph | Use it for |
144
145
  | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
145
146
  | `topology` | The unified address / FLOWS_TO / LINKED graph — recent and full historical fund-flow traversal, plus the node `risk_score`/`risk_level` verdict |
146
- | `facts` | Labels, features, assets, and enrichment |
147
+ | `facts` | Bounded individual `TRANSFER` rows with amount, `amount_usd`, asset, transaction, and block facts |
147
148
 
148
149
  One rule is worth reading before writing a query by hand: the `network`
149
150
  argument selects the graph, not the addresses inside it. The address-space
@@ -225,7 +226,7 @@ cia update --check
225
226
  Run a first screen from any directory:
226
227
 
227
228
  ```bash
228
- cia aml-address-risk \
229
+ cia mcp aml-address-risk \
229
230
  --address 0xYourAddressHere --network robinhood
230
231
  ```
231
232
 
@@ -2,7 +2,6 @@ const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
2
2
  const require_client = require("./client-Ypw9BNbn.cjs");
3
3
  //#region src/mcp/capabilities.ts
4
4
  var capabilities_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
5
- PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS: () => PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,
6
5
  fetchNetworkCapabilities: () => fetchNetworkCapabilities,
7
6
  findNetworkCapability: () => findNetworkCapability,
8
7
  formatNetworkCapabilities: () => formatNetworkCapabilities,
@@ -10,19 +9,16 @@ var capabilities_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll(
10
9
  formatNetworkOverview: () => formatNetworkOverview,
11
10
  mirrorGraphNetworkCapabilities: () => mirrorGraphNetworkCapabilities
12
11
  });
13
- const PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS = {
14
- aml_address_risk: "available",
15
- graph_query: "available",
16
- graph_query_batch: "available",
17
- meta_network_capabilities: "available",
18
- meta_usage_status: "available",
19
- meta_help: "available",
20
- wallet_balance: "available"
21
- };
22
12
  const AVAILABLE_TOOLS_PER_LINE = 3;
23
13
  function isRecord(value) {
24
14
  return typeof value === "object" && value !== null && !Array.isArray(value);
25
15
  }
16
+ function advertisedTools(raw) {
17
+ if (!isRecord(raw)) return {};
18
+ const tools = {};
19
+ for (const [name, status] of Object.entries(raw)) if (name.trim() !== "" && typeof status === "string") tools[name] = status;
20
+ return tools;
21
+ }
26
22
  function advertisedNetwork(raw) {
27
23
  if (!isRecord(raw) || typeof raw.network !== "string" || raw.network.trim() === "") return null;
28
24
  const network = raw.network.trim();
@@ -31,7 +27,7 @@ function advertisedNetwork(raw) {
31
27
  display_name: typeof raw.display_name === "string" && raw.display_name.trim() !== "" ? raw.display_name : network,
32
28
  status: typeof raw.status === "string" && raw.status.trim() !== "" ? raw.status : "live",
33
29
  layers: {},
34
- tools: { ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS }
30
+ tools: advertisedTools(raw.tools)
35
31
  };
36
32
  if (raw.default === true) capability.default = true;
37
33
  if (raw.default === false) capability.default = false;
@@ -73,11 +69,7 @@ async function fetchNetworkCapabilities(config) {
73
69
  return publicNetworkCapabilities(parsed);
74
70
  }
75
71
  function availableTools(network) {
76
- const effectiveTools = {
77
- ...network.tools ?? {},
78
- ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS
79
- };
80
- return Object.entries(effectiveTools).filter(([, status]) => status === "available").map(([name]) => name).sort();
72
+ return Object.entries(network.tools ?? {}).filter(([, status]) => status === "available").map(([name]) => name).sort();
81
73
  }
82
74
  function availableToolLines(network) {
83
75
  const tools = availableTools(network);
@@ -2,7 +2,6 @@ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
2
  import { a as resolveGraphMcpEndpoint, n as applyMcpAuthHeaders } from "./client-CHYskPnG.mjs";
3
3
  //#region src/mcp/capabilities.ts
4
4
  var capabilities_exports = /* @__PURE__ */ __exportAll({
5
- PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS: () => PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,
6
5
  fetchNetworkCapabilities: () => fetchNetworkCapabilities,
7
6
  findNetworkCapability: () => findNetworkCapability,
8
7
  formatNetworkCapabilities: () => formatNetworkCapabilities,
@@ -10,19 +9,16 @@ var capabilities_exports = /* @__PURE__ */ __exportAll({
10
9
  formatNetworkOverview: () => formatNetworkOverview,
11
10
  mirrorGraphNetworkCapabilities: () => mirrorGraphNetworkCapabilities
12
11
  });
13
- const PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS = {
14
- aml_address_risk: "available",
15
- graph_query: "available",
16
- graph_query_batch: "available",
17
- meta_network_capabilities: "available",
18
- meta_usage_status: "available",
19
- meta_help: "available",
20
- wallet_balance: "available"
21
- };
22
12
  const AVAILABLE_TOOLS_PER_LINE = 3;
23
13
  function isRecord(value) {
24
14
  return typeof value === "object" && value !== null && !Array.isArray(value);
25
15
  }
16
+ function advertisedTools(raw) {
17
+ if (!isRecord(raw)) return {};
18
+ const tools = {};
19
+ for (const [name, status] of Object.entries(raw)) if (name.trim() !== "" && typeof status === "string") tools[name] = status;
20
+ return tools;
21
+ }
26
22
  function advertisedNetwork(raw) {
27
23
  if (!isRecord(raw) || typeof raw.network !== "string" || raw.network.trim() === "") return null;
28
24
  const network = raw.network.trim();
@@ -31,7 +27,7 @@ function advertisedNetwork(raw) {
31
27
  display_name: typeof raw.display_name === "string" && raw.display_name.trim() !== "" ? raw.display_name : network,
32
28
  status: typeof raw.status === "string" && raw.status.trim() !== "" ? raw.status : "live",
33
29
  layers: {},
34
- tools: { ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS }
30
+ tools: advertisedTools(raw.tools)
35
31
  };
36
32
  if (raw.default === true) capability.default = true;
37
33
  if (raw.default === false) capability.default = false;
@@ -73,11 +69,7 @@ async function fetchNetworkCapabilities(config) {
73
69
  return publicNetworkCapabilities(parsed);
74
70
  }
75
71
  function availableTools(network) {
76
- const effectiveTools = {
77
- ...network.tools ?? {},
78
- ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS
79
- };
80
- return Object.entries(effectiveTools).filter(([, status]) => status === "available").map(([name]) => name).sort();
72
+ return Object.entries(network.tools ?? {}).filter(([, status]) => status === "available").map(([name]) => name).sort();
81
73
  }
82
74
  function availableToolLines(network) {
83
75
  const tools = availableTools(network);
@@ -168,4 +160,4 @@ function formatNetworkCapability(network) {
168
160
  //#endregion
169
161
  export { mirrorGraphNetworkCapabilities as n, capabilities_exports as t };
170
162
 
171
- //# sourceMappingURL=capabilities-CY3Ok5ls.mjs.map
163
+ //# sourceMappingURL=capabilities-ByKP5l0G.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities-ByKP5l0G.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 AVAILABLE_TOOLS_PER_LINE = 3\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction advertisedTools(raw: unknown): Record<string, string> {\n if (!isRecord(raw)) return {}\n const tools: Record<string, string> = {}\n for (const [name, status] of Object.entries(raw)) {\n if (name.trim() !== '' && typeof status === 'string') tools[name] = status\n }\n return tools\n}\n\nfunction advertisedNetwork(raw: unknown): NetworkCapability | null {\n if (!isRecord(raw) || typeof raw.network !== 'string' || raw.network.trim() === '') {\n return null\n }\n const network = raw.network.trim()\n const capability: NetworkCapability = {\n network,\n display_name:\n typeof raw.display_name === 'string' && raw.display_name.trim() !== ''\n ? raw.display_name\n : network,\n status: typeof raw.status === 'string' && raw.status.trim() !== '' ? raw.status : 'live',\n layers: {},\n tools: advertisedTools(raw.tools),\n }\n if (raw.default === true) capability.default = true\n if (raw.default === false) capability.default = false\n if (isRecord(raw.coverage)) capability.coverage = raw.coverage as NetworkCapability['coverage']\n if (isRecord(raw.freshness))\n capability.freshness = raw.freshness as NetworkCapability['freshness']\n return capability\n}\n\n/** Repeat GraphRAG's network list. CIA does not add, drop, or invent names. */\nexport function mirrorGraphNetworkCapabilities(document: {\n networks: unknown[]\n}): NetworkCapabilitiesDocument {\n return {\n schema: 'chain-insights.network-capabilities.v1',\n networks: document.networks\n .map((network) => advertisedNetwork(network))\n .filter((network): network is NetworkCapability => network !== null),\n }\n}\n\nfunction publicNetworkCapabilities(\n document: NetworkCapabilitiesDocument\n): NetworkCapabilitiesDocument {\n return mirrorGraphNetworkCapabilities(document)\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 (\n parsed.schema !== 'chain-insights.network-capabilities.v1' ||\n !Array.isArray(parsed.networks)\n ) {\n throw new Error('network capabilities response has unsupported schema')\n }\n return publicNetworkCapabilities(parsed)\n}\n\nfunction availableTools(network: NetworkCapability): string[] {\n const tools = Object.entries(network.tools ?? {})\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 =\n coverage.from_block !== undefined && coverage.to_block !== undefined\n ? `${coverage.from_block}..${coverage.to_block}`\n : 'blocks unknown'\n const dateRange =\n 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\nfunction displayName(network: NetworkCapability): string {\n return network.display_name || network.network\n}\n\nfunction statusLabel(network: NetworkCapability): string {\n return network.default ? `${network.status} (default)` : network.status\n}\n\nfunction formatTable(headers: string[], rows: string[][], minimumWidths: number[]): string {\n const widths = headers.map((header, index) =>\n Math.max(\n minimumWidths[index] ?? 0,\n header.length,\n ...rows.map((row) => row[index]?.length ?? 0)\n )\n )\n const row = (values: string[]) =>\n values.map((value, index) => value.padEnd(widths[index]!)).join(' ')\n return [row(headers), widths.map((width) => '-'.repeat(width)).join(' '), ...rows.map(row)].join(\n '\\n'\n )\n}\n\nexport function formatNetworkOverview(document: NetworkCapabilitiesDocument): string {\n if (document.networks.length === 0) return 'No supported networks advertised.'\n const rows = document.networks.map((network) => [\n displayName(network),\n statusLabel(network),\n datasetLabel(network),\n ])\n return formatTable(['Network', 'Status', 'Dataset'], rows, [14, 10, 38])\n}\n\nexport function formatNetworkCapabilities(document: NetworkCapabilitiesDocument): string {\n if (document.networks.length === 0) return 'No supported networks advertised.'\n const networkRows = document.networks.flatMap((network) => {\n const toolLines = availableToolLines(network)\n return toolLines.map((toolLine, index) => [\n index === 0 ? displayName(network) : '',\n index === 0 ? datasetLabel(network) : '',\n toolLine,\n ])\n })\n return formatTable(['Network', 'Dataset', 'Chain Insights tools'], networkRows, [14, 38, 64])\n}\n\nexport function findNetworkCapability(\n document: NetworkCapabilitiesDocument,\n name: string\n): NetworkCapability | undefined {\n const normalizedName = name.trim().toLowerCase()\n if (!normalizedName) return undefined\n return document.networks.find((network) =>\n [network.network, network.display_name].some(\n (candidate) => candidate?.trim().toLowerCase() === normalizedName\n )\n )\n}\n\nexport function formatNetworkCapability(network: NetworkCapability): string {\n const rows = [\n ['Network', network.display_name || network.network],\n ['Identifier', network.network],\n ['Status', network.default ? `${network.status} (default)` : network.status],\n ['Dataset', datasetLabel(network)],\n ['Available tools', availableTools(network).join(', ') || 'none'],\n ]\n const labelWidth = Math.max(...rows.map(([label]) => label.length))\n return rows.map(([label, value]) => `${label.padEnd(labelWidth)} ${value}`).join('\\n')\n}\n"],"mappings":"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"}
package/dist/cli.cjs CHANGED
@@ -109,7 +109,7 @@ program.name("cia").description("AML investigation toolkit for blockchain analys
109
109
  const rawArgs = process.argv.slice(2);
110
110
  const installerFlags = rawArgs.filter((a) => a === "--claude" || a === "--codex" || a === "--hermes");
111
111
  function normalizeAmlToolVersionArgv(argv) {
112
- const commandIndex = rawArgs.findIndex((arg, index) => arg === "aml-address-risk" && (index === 0 || index === 1 && rawArgs[0] === "mcp"));
112
+ const commandIndex = rawArgs.findIndex((arg, index) => arg === "aml-address-risk" && index === 1 && rawArgs[0] === "mcp");
113
113
  if (commandIndex === -1) return argv;
114
114
  return argv.map((arg, index) => {
115
115
  if (index - 2 <= commandIndex) return arg;
@@ -163,21 +163,21 @@ async function withGraphMcpClient(name, fn) {
163
163
  }
164
164
  async function printNetworkCapabilities(opts) {
165
165
  const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
166
- const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-CjpGnrVg.cjs")).then((n) => n.capabilities_exports);
166
+ const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-B-M8vAYp.cjs")).then((n) => n.capabilities_exports);
167
167
  const document = await fetchNetworkCapabilities(await loadConfig());
168
168
  if (opts.json) console.log(JSON.stringify(document, null, 2));
169
169
  else console.log(formatNetworkCapabilities(document));
170
170
  }
171
171
  async function printNetworkOverview(opts) {
172
172
  const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
173
- const { fetchNetworkCapabilities, formatNetworkOverview } = await Promise.resolve().then(() => require("./capabilities-CjpGnrVg.cjs")).then((n) => n.capabilities_exports);
173
+ const { fetchNetworkCapabilities, formatNetworkOverview } = await Promise.resolve().then(() => require("./capabilities-B-M8vAYp.cjs")).then((n) => n.capabilities_exports);
174
174
  const document = await fetchNetworkCapabilities(await loadConfig());
175
175
  if (opts.json) console.log(JSON.stringify(document, null, 2));
176
176
  else console.log(formatNetworkOverview(document));
177
177
  }
178
178
  async function printNetworkCapability(name, opts) {
179
179
  const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
180
- const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } = await Promise.resolve().then(() => require("./capabilities-CjpGnrVg.cjs")).then((n) => n.capabilities_exports);
180
+ const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } = await Promise.resolve().then(() => require("./capabilities-B-M8vAYp.cjs")).then((n) => n.capabilities_exports);
181
181
  const document = await fetchNetworkCapabilities(await loadConfig());
182
182
  const network = findNetworkCapability(document, name);
183
183
  if (!network) {
@@ -484,7 +484,6 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
484
484
  process.exit(1);
485
485
  }
486
486
  }));
487
- addAmlAddressRiskCommand(program, "cia networks");
488
487
  const mcpCommand = program.command("mcp").description("Interact with the Chain Insights MCP endpoint").allowExcessArguments(false).addCommand(createCliCommand("networks").description("List the detailed Chain Insights capability matrix and tool support").option("--json", "Print raw capability JSON").action(async (opts) => {
489
488
  try {
490
489
  await printNetworkCapabilities(opts);
package/dist/cli.mjs CHANGED
@@ -107,7 +107,7 @@ program.name("cia").description("AML investigation toolkit for blockchain analys
107
107
  const rawArgs = process.argv.slice(2);
108
108
  const installerFlags = rawArgs.filter((a) => a === "--claude" || a === "--codex" || a === "--hermes");
109
109
  function normalizeAmlToolVersionArgv(argv) {
110
- const commandIndex = rawArgs.findIndex((arg, index) => arg === "aml-address-risk" && (index === 0 || index === 1 && rawArgs[0] === "mcp"));
110
+ const commandIndex = rawArgs.findIndex((arg, index) => arg === "aml-address-risk" && index === 1 && rawArgs[0] === "mcp");
111
111
  if (commandIndex === -1) return argv;
112
112
  return argv.map((arg, index) => {
113
113
  if (index - 2 <= commandIndex) return arg;
@@ -161,21 +161,21 @@ async function withGraphMcpClient(name, fn) {
161
161
  }
162
162
  async function printNetworkCapabilities(opts) {
163
163
  const { loadConfig } = await import("./config-DbbPiGk0.mjs").then((n) => n.t);
164
- const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import("./capabilities-CY3Ok5ls.mjs").then((n) => n.t);
164
+ const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import("./capabilities-ByKP5l0G.mjs").then((n) => n.t);
165
165
  const document = await fetchNetworkCapabilities(await loadConfig());
166
166
  if (opts.json) console.log(JSON.stringify(document, null, 2));
167
167
  else console.log(formatNetworkCapabilities(document));
168
168
  }
169
169
  async function printNetworkOverview(opts) {
170
170
  const { loadConfig } = await import("./config-DbbPiGk0.mjs").then((n) => n.t);
171
- const { fetchNetworkCapabilities, formatNetworkOverview } = await import("./capabilities-CY3Ok5ls.mjs").then((n) => n.t);
171
+ const { fetchNetworkCapabilities, formatNetworkOverview } = await import("./capabilities-ByKP5l0G.mjs").then((n) => n.t);
172
172
  const document = await fetchNetworkCapabilities(await loadConfig());
173
173
  if (opts.json) console.log(JSON.stringify(document, null, 2));
174
174
  else console.log(formatNetworkOverview(document));
175
175
  }
176
176
  async function printNetworkCapability(name, opts) {
177
177
  const { loadConfig } = await import("./config-DbbPiGk0.mjs").then((n) => n.t);
178
- const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } = await import("./capabilities-CY3Ok5ls.mjs").then((n) => n.t);
178
+ const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } = await import("./capabilities-ByKP5l0G.mjs").then((n) => n.t);
179
179
  const document = await fetchNetworkCapabilities(await loadConfig());
180
180
  const network = findNetworkCapability(document, name);
181
181
  if (!network) {
@@ -482,7 +482,6 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
482
482
  process.exit(1);
483
483
  }
484
484
  }));
485
- addAmlAddressRiskCommand(program, "cia networks");
486
485
  const mcpCommand = program.command("mcp").description("Interact with the Chain Insights MCP endpoint").allowExcessArguments(false).addCommand(createCliCommand("networks").description("List the detailed Chain Insights capability matrix and tool support").option("--json", "Print raw capability JSON").action(async (opts) => {
487
486
  try {
488
487
  await printNetworkCapabilities(opts);
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":[],"sources":["../src/mcp/print-result.ts","../src/cli.ts"],"sourcesContent":["export interface McpTextResult {\n content?: Array<{ type: string; text?: string }>\n isError?: boolean\n}\n\nexport interface McpPrintOptions {\n tool?: string\n json?: boolean\n}\n\ntype JsonRecord = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatTable(rows: Array<JsonRecord>): string[] {\n if (rows.length === 0) return []\n const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))]\n const values = rows.map((row) => columns.map((column) => displayValue(row[column])))\n const widths = columns.map((column, index) =>\n Math.max(column.length, ...values.map((row) => row[index]?.length ?? 0))\n )\n const line = (row: string[]): string =>\n row\n .map((value, index) => (index === row.length - 1 ? value : value.padEnd(widths[index] ?? 0)))\n .join(' | ')\n return [line(columns), widths.map((width) => '-'.repeat(width)).join('-+-'), ...values.map(line)]\n}\n\nfunction formatGraphResult(value: JsonRecord, fallbackTool?: string): string | null {\n const facts = isRecord(value.facts) ? value.facts : undefined\n const query = facts && isRecord(facts.query) ? facts.query : undefined\n const queries = facts && Array.isArray(facts.queries) ? facts.queries : undefined\n if (!query && !queries) return null\n\n const lines = [`Tool: ${displayValue(value.tool) || fallbackTool || 'MCP result'}`]\n const subject = isRecord(value.subject)\n ? value.subject\n : facts && isRecord(facts.subject)\n ? facts.subject\n : undefined\n if (subject?.network !== undefined) lines.push(`Network: ${displayValue(subject.network)}`)\n\n if (query) {\n const results = Array.isArray(query.results) ? query.results.filter(isRecord) : []\n if (query.count !== undefined) lines.push(`Rows: ${displayValue(query.count)}`)\n else lines.push(`Rows: ${results.length}`)\n if (query.billable_units !== undefined) {\n lines.push(`Billed units: ${displayValue(query.billable_units)}`)\n }\n if (query.elapsed_ms !== undefined) lines.push(`Elapsed: ${displayValue(query.elapsed_ms)} ms`)\n if (query.truncated !== undefined) lines.push(`Truncated: ${displayValue(query.truncated)}`)\n if (query.error !== undefined) lines.push(`Error: ${displayValue(query.error)}`)\n if (results.length > 0) lines.push('', 'Results:', ...formatTable(results))\n else lines.push('', 'Results: none')\n }\n\n if (queries) {\n lines.push(`Queries: ${queries.length}`)\n for (const entry of queries) {\n if (!isRecord(entry)) continue\n const id = displayValue(entry.id) || 'query'\n const results = Array.isArray(entry.results) ? entry.results.filter(isRecord) : []\n lines.push('', `[${id}]`)\n if (entry.error !== undefined) lines.push(`Error: ${displayValue(entry.error)}`)\n lines.push(`Rows: ${displayValue(entry.count ?? results.length)}`)\n if (results.length > 0) lines.push(...formatTable(results))\n else lines.push('Results: none')\n }\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Formats one MCP text block for terminal output. JSON is indented when the\n * caller requests `--json`; graph query envelopes are rendered as a compact\n * result summary and table by default.\n */\nexport function formatMcpTextContent(\n text: string,\n tool?: string,\n options: Pick<McpPrintOptions, 'json'> = {}\n): string {\n let parsed: unknown\n try {\n parsed = JSON.parse(text) as unknown\n } catch {\n return text\n }\n\n if (options.json) {\n try {\n return JSON.stringify(parsed, null, 2)\n } catch {\n return text\n }\n }\n\n if (isRecord(parsed)) {\n return formatGraphResult(parsed, tool) ?? JSON.stringify(parsed, null, 2)\n }\n return displayValue(parsed)\n}\n\n/**\n * Prints the text blocks of an MCP tool result to stdout. When the result is\n * flagged `isError`, throws with the tool's error text instead — MCP `callTool`\n * returns tool errors as ordinary results (it does not reject), so callers must\n * surface them as failures (non-zero exit) rather than printing to stdout and\n * exiting 0.\n */\nexport function printMcpTextContent(result: McpTextResult, options: McpPrintOptions = {}): void {\n const texts = (result.content ?? [])\n .filter((item) => item.type === 'text')\n .map((item) => item.text ?? '')\n\n if (result.isError) {\n throw new Error(texts.join('\\n').trim() || 'MCP tool returned an error')\n }\n\n for (const text of texts) console.log(formatMcpTextContent(text, options.tool, options))\n}\n","import { Command, Option } from 'commander'\nimport { execFileSync } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\nimport path from 'node:path'\nimport { PACKAGE_INFO, PACKAGE_VERSION } from './version.js'\nimport { printMcpTextContent } from './mcp/print-result.js'\n\n// Resolve bin/install.cjs relative to this file's location in dist/\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\nconst installerPath = path.resolve(__dirname, '..', 'bin', 'install.cjs')\n\nconst program = new Command()\n\nfunction createCliCommand(name: string): Command {\n return new Command(name).showHelpAfterError()\n}\n\nprogram\n .name('cia')\n .description('AML investigation toolkit for blockchain analysis')\n .version(PACKAGE_INFO.version)\n .showHelpAfterError()\n .option('--claude', 'Install Claude Code skills globally to ~/.claude/skills/')\n .option('--codex', 'Install Codex skills globally to ~/.codex/skills/ and register MCP')\n .option(\n '--hermes',\n 'Install Hermes skills globally to ~/.hermes/skills/chain-insights/ and register MCP'\n )\n\n// Handle installer flags when invoked with no subcommand (bare `chain-insights --claude`)\nconst rawArgs = process.argv.slice(2)\nconst installerFlags = rawArgs.filter(\n (a) => a === '--claude' || a === '--codex' || a === '--hermes'\n)\n\n// Commander treats the root package `--version` option as global, so it would\n// consume the same flag on the AML child command before the child can route a\n// tool contract. Rewrite only the child-command form to a hidden alias. The\n// visible child help still documents `--version`, while root `cia --version`\n// remains the package version.\nfunction normalizeAmlToolVersionArgv(argv: string[]): string[] {\n const commandIndex = rawArgs.findIndex(\n (arg, index) =>\n arg === 'aml-address-risk' && (index === 0 || (index === 1 && rawArgs[0] === 'mcp'))\n )\n if (commandIndex === -1) return argv\n\n return argv.map((arg, index) => {\n const userArgIndex = index - 2\n if (userArgIndex <= commandIndex) return arg\n if (arg === '--version') return '--tool-version'\n if (arg.startsWith('--version=')) return `--tool-version=${arg.slice('--version='.length)}`\n return arg\n })\n}\n// A help/version request must never trigger a global install side effect — let\n// commander handle it and print help/version instead.\nconst wantsHelpOrVersion = rawArgs.some(\n (a) => a === '--help' || a === '-h' || a === '--version' || a === '-V'\n)\nif (installerFlags.length > 0 && !wantsHelpOrVersion && !rawArgs.some((a) => !a.startsWith('-'))) {\n try {\n execFileSync(process.execPath, [installerPath, ...installerFlags], { stdio: 'inherit' })\n } catch (err) {\n console.error('Installation failed:', (err as Error).message)\n process.exit(1)\n }\n process.exit(0)\n}\n\n// Legacy mcp aliases for retired graph tools are not commands; reject them\n// before Commander can mis-parse them. Members are built by concatenation so\n// retired names never appear as literal source strings.\nconst retiredMcpAliases = new Set([['trace', '-funds'].join(''), ['track', '-funds'].join('')])\nif (rawArgs[0] === 'mcp' && retiredMcpAliases.has(rawArgs[1] ?? '')) {\n console.error(`error: unknown command '${rawArgs[1]}'`)\n process.exit(1)\n}\n\nfunction runInstaller(flag: '--claude' | '--codex' | '--hermes'): void {\n try {\n execFileSync(process.execPath, [installerPath, flag], { stdio: 'inherit' })\n } catch (err) {\n console.error('Installation failed:', (err as Error).message)\n process.exit(1)\n }\n}\n\nasync function withGraphMcpClient<T>(\n name: string,\n fn: (\n client: import('@modelcontextprotocol/sdk/client/index.js').Client,\n config: Awaited<ReturnType<typeof import('./config/index.js').loadConfig>>\n ) => Promise<T>\n): Promise<T> {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } =\n await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name, version: PACKAGE_VERSION })\n await client.connect(\n new StreamableHTTPClientTransport(new URL(resolveGraphMcpEndpoint(config)), {\n fetch: paymentFetch,\n })\n )\n // Every CLI command builds its own client, separate from the MCP proxy's\n // one, so unattended scheduled CLI runs also write to the action log.\n const { installActionLogging } = await import('./mcp/action-log.js')\n installActionLogging(client)\n try {\n return await fn(client, config)\n } finally {\n await client.close()\n }\n}\n\nasync function printNetworkCapabilities(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkCapabilities } =\n await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n if (opts.json) {\n console.log(JSON.stringify(document, null, 2))\n } else {\n console.log(formatNetworkCapabilities(document))\n }\n}\n\nasync function printNetworkOverview(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkOverview } = await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n if (opts.json) {\n console.log(JSON.stringify(document, null, 2))\n } else {\n console.log(formatNetworkOverview(document))\n }\n}\n\nasync function printNetworkCapability(name: string, opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } =\n await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n const network = findNetworkCapability(document, name)\n if (!network) {\n const available = document.networks.map((candidate) => candidate.network).join(', ')\n const suffix = available ? ` Available networks: ${available}.` : ''\n throw new Error(\n `Network \"${name}\" is not supported.${suffix} Run \\`cia networks\\` to list supported networks.`\n )\n }\n if (opts.json) {\n console.log(JSON.stringify(network, null, 2))\n } else {\n console.log(formatNetworkCapability(network))\n }\n}\n\nfunction addAmlAddressRiskCommand(parent: Command, networksCommand: string): void {\n parent.addCommand(\n createCliCommand('aml-address-risk')\n .description(\n 'Screen an address for AML risk, exchange behavior, and optional comparison with another address'\n )\n .requiredOption('--address <address>', 'Full blockchain address to screen')\n .requiredOption(\n '--network <network>',\n `Network to query. Run \\`${networksCommand}\\` for supported networks.`\n )\n .option(\n '--compare-address <address>',\n 'Optional second address to compare against the screened address'\n )\n .option('--json', 'Print machine-readable JSON output')\n .option(\n '--version <version>',\n 'AML tool contract version. Omit to use the latest version (currently v1)'\n )\n .addOption(\n new Option('--tool-version <version>', 'Internal alias for the AML tool version').hideHelp()\n )\n .action(\n async (opts: {\n address: string\n network: string\n compareAddress?: string\n json?: boolean\n version?: string\n toolVersion?: string\n }) => {\n try {\n const { resolveAmlAddressRiskVersion } = await import('./investigation/public-tools.js')\n const requestedVersion = opts.toolVersion ?? opts.version\n resolveAmlAddressRiskVersion(requestedVersion)\n await withGraphMcpClient('chain-insights-cli-aml-address-risk', async (client) => {\n const { runAmlAddressRisk } = await import('./investigation/public-tools.js')\n const result = await runAmlAddressRisk(\n client,\n {\n address: opts.address,\n network: opts.network,\n compareAddress: opts.compareAddress,\n },\n requestedVersion\n )\n console.log(\n opts.json ? JSON.stringify(result.structuredContent, null, 2) : result.summaryText\n )\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n }\n )\n )\n}\n\nprogram\n .command('networks')\n .description('Show supported network status and dataset overview')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkOverview(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('network')\n .description('Show details for one supported graph network')\n .argument('<name>', 'Network identifier or display name (for example: robinhood)')\n .option('--json', 'Print raw capability JSON for this network')\n .action(async (name: string, opts: { json?: boolean }) => {\n try {\n await printNetworkCapability(name, opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('status')\n .description('Show toolkit status and configuration')\n .action(async () => {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n const graphMcpStatus =\n config.graphMcpMode === 'debug' && config.graphMcpAuthToken?.trim()\n ? 'bearer access mode'\n : `${config.graphMcpMode} mode`\n console.log('Config: ', config.dataDir)\n console.log('Chain Insights Graph:', graphMcpStatus)\n console.log('Graph endpoint:', config.graphMcpEndpoint)\n })\n\nprogram\n .command('update')\n .description('Check npmjs for a newer Chain Insights release and update this CLI')\n .option('--check', 'Only check for a newer release')\n .option('--dry-run', 'Print the update command without running it')\n .action(async (opts: { check?: boolean; dryRun?: boolean }) => {\n try {\n const { checkForUpdate, runPackageUpdate } = await import('./update.js')\n const result = await checkForUpdate()\n if (result.error) {\n throw new Error(`Could not check npmjs for updates: ${result.error}`)\n }\n if (!result.updateAvailable || !result.latestVersion) {\n console.log(`Chain Insights is up to date (${result.currentVersion}).`)\n return\n }\n\n console.log(\n `Chain Insights ${result.latestVersion} is available (current ${result.currentVersion}).`\n )\n if (opts.check) {\n console.log(`Run: ${result.updateCommand}`)\n return\n }\n if (opts.dryRun) {\n console.log(`Would run: ${result.updateCommand}`)\n return\n }\n\n console.log(`Running: ${result.updateCommand}`)\n runPackageUpdate(result.packageName)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('debug')\n .description('Configure Chain Insights Graph debug mode')\n .addCommand(\n createCliCommand('on')\n .description('Enable Chain Insights Graph debug mode without x402 payments')\n .requiredOption('--token <token>', 'Debug bearer token')\n .option('--endpoint <url>', 'Chain Insights Graph endpoint')\n .action(async (opts: { token: string; endpoint?: string }) => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({\n graphMcpMode: 'debug',\n graphMcpAuthToken: opts.token,\n ...(opts.endpoint ? { graphMcpEndpoint: opts.endpoint } : {}),\n })\n console.log('Chain Insights Graph debug mode enabled')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('off')\n .description('Disable Chain Insights Graph debug mode and use paid x402 calls')\n .action(async () => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({ graphMcpMode: 'paid', graphMcpAuthToken: '' })\n console.log('Chain Insights Graph debug mode disabled')\n console.log('Payments: enabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('status')\n .description('Show Chain Insights Graph payment/debug mode')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Chain Insights Graph mode: ${config.graphMcpMode}`)\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(\n `Debug token: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`\n )\n console.log(`Payments: ${config.graphMcpMode === 'debug' ? 'disabled' : 'enabled'}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('access-key')\n .description('Configure Chain Insights Graph test access key mode')\n .addCommand(\n createCliCommand('set')\n .description('Use a Chain Insights Graph test access key without x402 payments')\n .argument('<key>', 'Test access key')\n .option('--endpoint <url>', 'Chain Insights Graph endpoint')\n .action(async (key: string, opts: { endpoint?: string }) => {\n try {\n const normalizedKey = key.trim()\n if (!normalizedKey) throw new Error('Test access key is required')\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({\n graphMcpMode: 'debug',\n graphMcpAuthToken: normalizedKey,\n ...(opts.endpoint ? { graphMcpEndpoint: opts.endpoint } : {}),\n })\n console.log('Chain Insights Graph test access key configured')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled when the server accepts this key')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('clear')\n .description('Remove the Chain Insights Graph test access key and use paid x402 calls')\n .action(async () => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({ graphMcpMode: 'paid', graphMcpAuthToken: '' })\n console.log('Chain Insights Graph test access key cleared')\n console.log('Payments: enabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('status')\n .description('Show Chain Insights Graph test access key status')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(\n `Access key: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`\n )\n console.log(\n `Payments: ${config.graphMcpAuthToken?.trim() ? 'disabled when accepted by server' : 'enabled'}`\n )\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('setup')\n .description('Configure external MCP clients')\n .addCommand(\n createCliCommand('claude-code')\n .alias('claude')\n .description('Install Claude Code skills and register the MCP proxy')\n .action(() => {\n runInstaller('--claude')\n })\n )\n .addCommand(\n createCliCommand('codex')\n .description('Install Codex skills and register the MCP proxy')\n .action(() => {\n runInstaller('--codex')\n })\n )\n .addCommand(\n createCliCommand('hermes')\n .description('Install Hermes skills and register the MCP proxy')\n .action(() => {\n runInstaller('--hermes')\n })\n )\n\nprogram\n .command('config')\n .description('Read or write configuration values')\n .addCommand(\n createCliCommand('get')\n .description('Read one Chain Insights configuration value')\n .argument('<key>', 'Config key to read')\n .action(async (key: string) => {\n const { loadConfig } = await import('./config/index.js')\n const { CONFIG_KEYS } = await import('./config/schema.js')\n if (!CONFIG_KEYS.includes(key as (typeof CONFIG_KEYS)[number])) {\n console.error(`Unknown config key: ${key}`)\n process.exit(1)\n }\n const config = await loadConfig()\n const value = (config as Record<string, unknown>)[key]\n console.log(value ?? '')\n })\n )\n .addCommand(\n createCliCommand('set')\n .description('Write one Chain Insights configuration value')\n .argument('<key>', 'Config key to write')\n .argument('<value>', 'Value to set')\n .action(async (key: string, value: string) => {\n // D-01: walletPrivateKey is intercepted before saveConfig — the raw private key\n // must NEVER be written to config.json.\n if (key === 'walletPrivateKey') {\n try {\n const { setWalletPrivateKey } = await import('./wallet/index.js')\n const address = await setWalletPrivateKey(value)\n console.log('Wallet private key encrypted and stored in ~/.chain-insights/wallet.json')\n console.log(`Wallet address: ${address}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n return // MUST return — walletPrivateKey must never reach saveConfig or config.json\n }\n const { loadConfig, saveConfig } = await import('./config/index.js')\n const { CONFIG_KEYS, DEFAULT_CONFIG } = await import('./config/schema.js')\n const current = await loadConfig()\n if (!CONFIG_KEYS.includes(key as (typeof CONFIG_KEYS)[number])) {\n console.error(`Unknown config key: ${key}`)\n process.exit(1)\n }\n const existing = (current as Record<string, unknown>)[key]\n const defaultValue = (DEFAULT_CONFIG as Record<string, unknown>)[key]\n const coerced =\n typeof existing === 'number' || typeof defaultValue === 'number' ? Number(value) : value\n await saveConfig({ [key]: coerced } as Parameters<typeof saveConfig>[0])\n const displayed = key.toLowerCase().includes('token') ? '[redacted]' : coerced\n console.log(`Set ${key} = ${displayed}`)\n })\n )\n\nprogram\n .command('wallet')\n .description('Manage the local Base USDC payment wallet')\n .addCommand(\n createCliCommand('create')\n .description('Generate a new local Base payment wallet')\n .action(async () => {\n try {\n const { isWalletConfigured, setWalletPrivateKey, walletPath } =\n await import('./wallet/index.js')\n const { createInterface } = await import('node:readline/promises')\n const { formatWalletBackupWarning, generateWalletPrivateKey, isWalletBackupConfirmed } =\n await import('./wallet/create.js')\n\n if (await isWalletConfigured()) {\n throw new Error(\n 'A payment wallet already exists. Run `cia wallet address` to view it or use `cia wallet import <private-key> --force` to replace it.'\n )\n }\n\n const privateKey = generateWalletPrivateKey()\n const color = process.stderr.isTTY === true && process.env['NO_COLOR'] === undefined\n process.stderr.write(`${formatWalletBackupWarning(privateKey, { color })}\\n`)\n const prompt = createInterface({ input: process.stdin, output: process.stderr })\n let answer: string\n try {\n answer = await prompt.question('> ')\n } finally {\n prompt.close()\n }\n process.stderr.write('\\n')\n if (!isWalletBackupConfirmed(answer)) {\n throw new Error('Wallet creation cancelled. The wallet was not saved.')\n }\n\n const address = await setWalletPrivateKey(privateKey)\n console.log(`Wallet created: ${address}`)\n console.log(`Encrypted local copy: ${walletPath()}`)\n console.log('Next: cia wallet ready')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('import')\n .description('Import a Base payment wallet')\n .argument('<private-key>', '0x-prefixed EVM private key')\n .option(\n '--force',\n 'Replace an existing wallet (the previous key is backed up next to wallet.json)'\n )\n .action(async (privateKey: string, opts: { force?: boolean }) => {\n try {\n const { setWalletPrivateKey, isWalletConfigured } = await import('./wallet/index.js')\n const replacing = opts.force === true && (await isWalletConfigured())\n const address = await setWalletPrivateKey(privateKey, { force: opts.force })\n if (replacing) {\n console.log('Previous wallet key backed up next to ~/.chain-insights/wallet.json')\n }\n console.log(`Wallet imported: ${address}`)\n console.log(\n 'Keep your original private key backed up securely; it cannot be recovered from the encrypted local copy.'\n )\n console.log('Encrypted local copy: ~/.chain-insights/wallet.json')\n console.log('Next: cia wallet ready')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('address')\n .description('Print the local payment wallet address')\n .action(async () => {\n try {\n const { getWalletAccount } = await import('./wallet/tools.js')\n const account = await getWalletAccount()\n console.log(account.address)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('balance')\n .description('Show the local payment wallet Base USDC balance')\n .action(async () => {\n try {\n const { getWalletBalanceText } = await import('./wallet/tools.js')\n console.log(await getWalletBalanceText())\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('ready')\n .description('Check and prepare the wallet for paid Chain Insights Graph calls')\n .option('--check-only', 'Only check readiness; do not submit the one-time payment setup')\n .addOption(new Option('--no-approve', 'Deprecated alias for --check-only').hideHelp())\n .option('--payment-usdc <amount>', 'USDC setup cap to prepare for paid calls', '1')\n .addOption(\n new Option('--approval-usdc <amount>', 'Deprecated alias for --payment-usdc').hideHelp()\n )\n .option('--json', 'Print machine-readable readiness metadata')\n .action(\n async (opts: {\n checkOnly?: boolean\n approve?: boolean\n paymentUsdc?: string\n approvalUsdc?: string\n json?: boolean\n }) => {\n try {\n const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } =\n await import('./wallet/tools.js')\n const minimumApprovalUnits = parsePaymentApprovalUnits(\n opts.paymentUsdc ?? opts.approvalUsdc ?? '1'\n )\n const result = await prepareWalletForPaidCalls({\n minimumApprovalUnits,\n approve: opts.checkOnly ? false : opts.approve !== false,\n })\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n result,\n (_key, value) => (typeof value === 'bigint' ? value.toString() : value),\n 2\n )\n )\n return\n }\n\n console.log(formatWalletReadiness(result.readiness, result.approval))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n }\n )\n )\n .addCommand(\n createCliCommand('topup')\n .description('Open a local browser page to top up the payment wallet')\n .option('--no-open', 'Print the top-up URL without opening a browser')\n .option('--json', 'Print machine-readable top-up metadata')\n .action(async (opts: { open?: boolean; json?: boolean }) => {\n try {\n const { buildTopupInfo, getWalletAccount } = await import('./wallet/tools.js')\n const { startTopupServer } = await import('./wallet/topup-server.js')\n const account = await getWalletAccount()\n const url = await startTopupServer(account)\n const info = buildTopupInfo(account.address, url)\n\n if (opts.json) {\n console.log(JSON.stringify(info, null, 2))\n } else {\n console.log(`Top-up URL: ${url}`)\n console.log(`Wallet: ${account.address}`)\n console.log('Network: Base')\n console.log('Token: USDC')\n console.log('Press Ctrl+C to stop the top-up server.')\n }\n\n if (opts.open !== false) {\n const open = (await import('open')).default\n await open(url)\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\naddAmlAddressRiskCommand(program, 'cia networks')\n\nconst mcpCommand = program\n .command('mcp')\n .description('Interact with the Chain Insights MCP endpoint')\n .allowExcessArguments(false)\n .addCommand(\n createCliCommand('networks')\n .description('List the detailed Chain Insights capability matrix and tool support')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkCapabilities(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('tools')\n .description('List remote GraphRAG MCP tools (cached for 24 hours)')\n .option('--refresh', 'Force refresh schema cache')\n .action(async (opts: { refresh?: boolean }) => {\n try {\n const { loadSchema, saveSchema } = await import('./mcp/schema-cache.js')\n const { formatToolsTable } = await import('./mcp/format.js')\n const { visibleRemoteTools } = await import('./mcp/tool-visibility.js')\n const { loadConfig } = await import('./config/index.js')\n const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } =\n await import('./mcp/client.js')\n const config = await loadConfig()\n const graphMcpEndpoint = resolveGraphMcpEndpoint(config)\n let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint)\n if (!tools) {\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } =\n await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name: 'chain-insights-cli', version: PACKAGE_VERSION })\n await client.connect(\n new StreamableHTTPClientTransport(new URL(graphMcpEndpoint), { fetch: paymentFetch })\n )\n try {\n const result = await client.listTools()\n tools = result.tools as Array<{ name: string; description?: string }>\n await saveSchema(tools, graphMcpEndpoint)\n } finally {\n await client.close()\n }\n }\n console.log(formatToolsTable(visibleRemoteTools(tools)))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\naddAmlAddressRiskCommand(mcpCommand, 'cia mcp networks')\n\nmcpCommand.addCommand(\n createCliCommand('call')\n .description('Call an MCP tool directly (debug)')\n .option('--json', 'Print machine-readable JSON output')\n .argument('<tool>', 'Tool name to call')\n .argument('[args...]', 'Key=value arguments (e.g. address=0x1234... network=robinhood)')\n .action(async (tool: string, rawArgs: string[], opts: { json?: boolean }) => {\n try {\n const { parseMcpCallArgs } = await import('./mcp/call-args.js')\n const { assertPublicMcpToolName, validatePublicMcpToolArguments } =\n await import('./mcp/tool-visibility.js')\n const args = parseMcpCallArgs(rawArgs)\n assertPublicMcpToolName(tool)\n validatePublicMcpToolArguments(tool, args)\n\n if (tool === 'aml_address_risk') {\n const { resolveAmlAddressRiskVersion } = await import('./investigation/public-tools.js')\n resolveAmlAddressRiskVersion(\n args['version'] === undefined ? undefined : String(args['version'])\n )\n }\n\n if (tool === 'wallet_balance') {\n const { getWalletBalanceText } = await import('./wallet/tools.js')\n console.log(await getWalletBalanceText())\n return\n }\n\n if (tool === 'meta_network_capabilities') {\n await printNetworkCapabilities({ json: opts.json })\n return\n }\n\n if (tool === 'meta_help') {\n console.log(\n 'Chain Insights tools: aml_*, graph_query, graph_query_batch, meta_*, and wallet_balance.'\n )\n return\n }\n\n await withGraphMcpClient('chain-insights-cli-call', async (client, config) => {\n if (tool === 'meta_usage_status') {\n try {\n const result = await client.callTool({ name: 'usage_status', arguments: {} })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n } catch (err) {\n const {\n isMissingUsageStatusToolError,\n primitiveBackendUsageStatus,\n usageStatusText,\n } = await import('./mcp/usage-status.js')\n if (!isMissingUsageStatusToolError(err)) throw err\n const { resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n console.log(\n usageStatusText(primitiveBackendUsageStatus(resolveGraphMcpEndpoint(config)))\n )\n }\n return\n }\n if (tool === 'aml_address_risk') {\n const { runAmlAddressRisk } = await import('./investigation/public-tools.js')\n const result = await runAmlAddressRisk(\n client,\n {\n address: String(args['address'] ?? ''),\n network: String(args['network'] ?? ''),\n compareAddress:\n args['compare_address'] === undefined\n ? undefined\n : String(args['compare_address']),\n },\n args['version'] === undefined ? undefined : String(args['version'])\n )\n console.log(\n opts.json ? JSON.stringify(result.structuredContent, null, 2) : result.summaryText\n )\n return\n }\n const result = await client.callTool({ name: tool, arguments: args })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n })\n } catch (err) {\n const { formatMcpCallError } = await import('./mcp/tool-visibility.js')\n console.error(formatMcpCallError(tool, err))\n process.exit(1)\n }\n })\n)\n\n// parseAsync (not parse) so a rejected async action surfaces as a clean\n// one-line error and a non-zero exit, instead of an unhandled-rejection stack\n// trace. Commands with their own try/catch still exit(1) before this fires.\nprogram.parseAsync(normalizeAmlToolVersionArgv(process.argv)).catch((err) => {\n console.error((err as Error).message)\n process.exit(1)\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../src/mcp/print-result.ts","../src/cli.ts"],"sourcesContent":["export interface McpTextResult {\n content?: Array<{ type: string; text?: string }>\n isError?: boolean\n}\n\nexport interface McpPrintOptions {\n tool?: string\n json?: boolean\n}\n\ntype JsonRecord = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatTable(rows: Array<JsonRecord>): string[] {\n if (rows.length === 0) return []\n const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))]\n const values = rows.map((row) => columns.map((column) => displayValue(row[column])))\n const widths = columns.map((column, index) =>\n Math.max(column.length, ...values.map((row) => row[index]?.length ?? 0))\n )\n const line = (row: string[]): string =>\n row\n .map((value, index) => (index === row.length - 1 ? value : value.padEnd(widths[index] ?? 0)))\n .join(' | ')\n return [line(columns), widths.map((width) => '-'.repeat(width)).join('-+-'), ...values.map(line)]\n}\n\nfunction formatGraphResult(value: JsonRecord, fallbackTool?: string): string | null {\n const facts = isRecord(value.facts) ? value.facts : undefined\n const query = facts && isRecord(facts.query) ? facts.query : undefined\n const queries = facts && Array.isArray(facts.queries) ? facts.queries : undefined\n if (!query && !queries) return null\n\n const lines = [`Tool: ${displayValue(value.tool) || fallbackTool || 'MCP result'}`]\n const subject = isRecord(value.subject)\n ? value.subject\n : facts && isRecord(facts.subject)\n ? facts.subject\n : undefined\n if (subject?.network !== undefined) lines.push(`Network: ${displayValue(subject.network)}`)\n\n if (query) {\n const results = Array.isArray(query.results) ? query.results.filter(isRecord) : []\n if (query.count !== undefined) lines.push(`Rows: ${displayValue(query.count)}`)\n else lines.push(`Rows: ${results.length}`)\n if (query.billable_units !== undefined) {\n lines.push(`Billed units: ${displayValue(query.billable_units)}`)\n }\n if (query.elapsed_ms !== undefined) lines.push(`Elapsed: ${displayValue(query.elapsed_ms)} ms`)\n if (query.truncated !== undefined) lines.push(`Truncated: ${displayValue(query.truncated)}`)\n if (query.error !== undefined) lines.push(`Error: ${displayValue(query.error)}`)\n if (results.length > 0) lines.push('', 'Results:', ...formatTable(results))\n else lines.push('', 'Results: none')\n }\n\n if (queries) {\n lines.push(`Queries: ${queries.length}`)\n for (const entry of queries) {\n if (!isRecord(entry)) continue\n const id = displayValue(entry.id) || 'query'\n const results = Array.isArray(entry.results) ? entry.results.filter(isRecord) : []\n lines.push('', `[${id}]`)\n if (entry.error !== undefined) lines.push(`Error: ${displayValue(entry.error)}`)\n lines.push(`Rows: ${displayValue(entry.count ?? results.length)}`)\n if (results.length > 0) lines.push(...formatTable(results))\n else lines.push('Results: none')\n }\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Formats one MCP text block for terminal output. JSON is indented when the\n * caller requests `--json`; graph query envelopes are rendered as a compact\n * result summary and table by default.\n */\nexport function formatMcpTextContent(\n text: string,\n tool?: string,\n options: Pick<McpPrintOptions, 'json'> = {}\n): string {\n let parsed: unknown\n try {\n parsed = JSON.parse(text) as unknown\n } catch {\n return text\n }\n\n if (options.json) {\n try {\n return JSON.stringify(parsed, null, 2)\n } catch {\n return text\n }\n }\n\n if (isRecord(parsed)) {\n return formatGraphResult(parsed, tool) ?? JSON.stringify(parsed, null, 2)\n }\n return displayValue(parsed)\n}\n\n/**\n * Prints the text blocks of an MCP tool result to stdout. When the result is\n * flagged `isError`, throws with the tool's error text instead — MCP `callTool`\n * returns tool errors as ordinary results (it does not reject), so callers must\n * surface them as failures (non-zero exit) rather than printing to stdout and\n * exiting 0.\n */\nexport function printMcpTextContent(result: McpTextResult, options: McpPrintOptions = {}): void {\n const texts = (result.content ?? [])\n .filter((item) => item.type === 'text')\n .map((item) => item.text ?? '')\n\n if (result.isError) {\n throw new Error(texts.join('\\n').trim() || 'MCP tool returned an error')\n }\n\n for (const text of texts) console.log(formatMcpTextContent(text, options.tool, options))\n}\n","import { Command, Option } from 'commander'\nimport { execFileSync } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\nimport path from 'node:path'\nimport { PACKAGE_INFO, PACKAGE_VERSION } from './version.js'\nimport { printMcpTextContent } from './mcp/print-result.js'\n\n// Resolve bin/install.cjs relative to this file's location in dist/\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\nconst installerPath = path.resolve(__dirname, '..', 'bin', 'install.cjs')\n\nconst program = new Command()\n\nfunction createCliCommand(name: string): Command {\n return new Command(name).showHelpAfterError()\n}\n\nprogram\n .name('cia')\n .description('AML investigation toolkit for blockchain analysis')\n .version(PACKAGE_INFO.version)\n .showHelpAfterError()\n .option('--claude', 'Install Claude Code skills globally to ~/.claude/skills/')\n .option('--codex', 'Install Codex skills globally to ~/.codex/skills/ and register MCP')\n .option(\n '--hermes',\n 'Install Hermes skills globally to ~/.hermes/skills/chain-insights/ and register MCP'\n )\n\n// Handle installer flags when invoked with no subcommand (bare `chain-insights --claude`)\nconst rawArgs = process.argv.slice(2)\nconst installerFlags = rawArgs.filter(\n (a) => a === '--claude' || a === '--codex' || a === '--hermes'\n)\n\n// Commander treats the root package `--version` option as global, so it would\n// consume the same flag on the AML child command before the child can route a\n// tool contract. Rewrite only the child-command form to a hidden alias. The\n// visible child help still documents `--version`, while root `cia --version`\n// remains the package version.\nfunction normalizeAmlToolVersionArgv(argv: string[]): string[] {\n const commandIndex = rawArgs.findIndex(\n (arg, index) => arg === 'aml-address-risk' && index === 1 && rawArgs[0] === 'mcp'\n )\n if (commandIndex === -1) return argv\n\n return argv.map((arg, index) => {\n const userArgIndex = index - 2\n if (userArgIndex <= commandIndex) return arg\n if (arg === '--version') return '--tool-version'\n if (arg.startsWith('--version=')) return `--tool-version=${arg.slice('--version='.length)}`\n return arg\n })\n}\n// A help/version request must never trigger a global install side effect — let\n// commander handle it and print help/version instead.\nconst wantsHelpOrVersion = rawArgs.some(\n (a) => a === '--help' || a === '-h' || a === '--version' || a === '-V'\n)\nif (installerFlags.length > 0 && !wantsHelpOrVersion && !rawArgs.some((a) => !a.startsWith('-'))) {\n try {\n execFileSync(process.execPath, [installerPath, ...installerFlags], { stdio: 'inherit' })\n } catch (err) {\n console.error('Installation failed:', (err as Error).message)\n process.exit(1)\n }\n process.exit(0)\n}\n\n// Legacy mcp aliases for retired graph tools are not commands; reject them\n// before Commander can mis-parse them. Members are built by concatenation so\n// retired names never appear as literal source strings.\nconst retiredMcpAliases = new Set([['trace', '-funds'].join(''), ['track', '-funds'].join('')])\nif (rawArgs[0] === 'mcp' && retiredMcpAliases.has(rawArgs[1] ?? '')) {\n console.error(`error: unknown command '${rawArgs[1]}'`)\n process.exit(1)\n}\n\nfunction runInstaller(flag: '--claude' | '--codex' | '--hermes'): void {\n try {\n execFileSync(process.execPath, [installerPath, flag], { stdio: 'inherit' })\n } catch (err) {\n console.error('Installation failed:', (err as Error).message)\n process.exit(1)\n }\n}\n\nasync function withGraphMcpClient<T>(\n name: string,\n fn: (\n client: import('@modelcontextprotocol/sdk/client/index.js').Client,\n config: Awaited<ReturnType<typeof import('./config/index.js').loadConfig>>\n ) => Promise<T>\n): Promise<T> {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } =\n await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name, version: PACKAGE_VERSION })\n await client.connect(\n new StreamableHTTPClientTransport(new URL(resolveGraphMcpEndpoint(config)), {\n fetch: paymentFetch,\n })\n )\n // Every CLI command builds its own client, separate from the MCP proxy's\n // one, so unattended scheduled CLI runs also write to the action log.\n const { installActionLogging } = await import('./mcp/action-log.js')\n installActionLogging(client)\n try {\n return await fn(client, config)\n } finally {\n await client.close()\n }\n}\n\nasync function printNetworkCapabilities(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkCapabilities } =\n await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n if (opts.json) {\n console.log(JSON.stringify(document, null, 2))\n } else {\n console.log(formatNetworkCapabilities(document))\n }\n}\n\nasync function printNetworkOverview(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkOverview } = await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n if (opts.json) {\n console.log(JSON.stringify(document, null, 2))\n } else {\n console.log(formatNetworkOverview(document))\n }\n}\n\nasync function printNetworkCapability(name: string, opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } =\n await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n const network = findNetworkCapability(document, name)\n if (!network) {\n const available = document.networks.map((candidate) => candidate.network).join(', ')\n const suffix = available ? ` Available networks: ${available}.` : ''\n throw new Error(\n `Network \"${name}\" is not supported.${suffix} Run \\`cia networks\\` to list supported networks.`\n )\n }\n if (opts.json) {\n console.log(JSON.stringify(network, null, 2))\n } else {\n console.log(formatNetworkCapability(network))\n }\n}\n\nfunction addAmlAddressRiskCommand(parent: Command, networksCommand: string): void {\n parent.addCommand(\n createCliCommand('aml-address-risk')\n .description(\n 'Screen an address for AML risk, exchange behavior, and optional comparison with another address'\n )\n .requiredOption('--address <address>', 'Full blockchain address to screen')\n .requiredOption(\n '--network <network>',\n `Network to query. Run \\`${networksCommand}\\` for supported networks.`\n )\n .option(\n '--compare-address <address>',\n 'Optional second address to compare against the screened address'\n )\n .option('--json', 'Print machine-readable JSON output')\n .option(\n '--version <version>',\n 'AML tool contract version. Omit to use the latest version (currently v1)'\n )\n .addOption(\n new Option('--tool-version <version>', 'Internal alias for the AML tool version').hideHelp()\n )\n .action(\n async (opts: {\n address: string\n network: string\n compareAddress?: string\n json?: boolean\n version?: string\n toolVersion?: string\n }) => {\n try {\n const { resolveAmlAddressRiskVersion } = await import('./investigation/public-tools.js')\n const requestedVersion = opts.toolVersion ?? opts.version\n resolveAmlAddressRiskVersion(requestedVersion)\n await withGraphMcpClient('chain-insights-cli-aml-address-risk', async (client) => {\n const { runAmlAddressRisk } = await import('./investigation/public-tools.js')\n const result = await runAmlAddressRisk(\n client,\n {\n address: opts.address,\n network: opts.network,\n compareAddress: opts.compareAddress,\n },\n requestedVersion\n )\n console.log(\n opts.json ? JSON.stringify(result.structuredContent, null, 2) : result.summaryText\n )\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n }\n )\n )\n}\n\nprogram\n .command('networks')\n .description('Show supported network status and dataset overview')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkOverview(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('network')\n .description('Show details for one supported graph network')\n .argument('<name>', 'Network identifier or display name (for example: robinhood)')\n .option('--json', 'Print raw capability JSON for this network')\n .action(async (name: string, opts: { json?: boolean }) => {\n try {\n await printNetworkCapability(name, opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('status')\n .description('Show toolkit status and configuration')\n .action(async () => {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n const graphMcpStatus =\n config.graphMcpMode === 'debug' && config.graphMcpAuthToken?.trim()\n ? 'bearer access mode'\n : `${config.graphMcpMode} mode`\n console.log('Config: ', config.dataDir)\n console.log('Chain Insights Graph:', graphMcpStatus)\n console.log('Graph endpoint:', config.graphMcpEndpoint)\n })\n\nprogram\n .command('update')\n .description('Check npmjs for a newer Chain Insights release and update this CLI')\n .option('--check', 'Only check for a newer release')\n .option('--dry-run', 'Print the update command without running it')\n .action(async (opts: { check?: boolean; dryRun?: boolean }) => {\n try {\n const { checkForUpdate, runPackageUpdate } = await import('./update.js')\n const result = await checkForUpdate()\n if (result.error) {\n throw new Error(`Could not check npmjs for updates: ${result.error}`)\n }\n if (!result.updateAvailable || !result.latestVersion) {\n console.log(`Chain Insights is up to date (${result.currentVersion}).`)\n return\n }\n\n console.log(\n `Chain Insights ${result.latestVersion} is available (current ${result.currentVersion}).`\n )\n if (opts.check) {\n console.log(`Run: ${result.updateCommand}`)\n return\n }\n if (opts.dryRun) {\n console.log(`Would run: ${result.updateCommand}`)\n return\n }\n\n console.log(`Running: ${result.updateCommand}`)\n runPackageUpdate(result.packageName)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('debug')\n .description('Configure Chain Insights Graph debug mode')\n .addCommand(\n createCliCommand('on')\n .description('Enable Chain Insights Graph debug mode without x402 payments')\n .requiredOption('--token <token>', 'Debug bearer token')\n .option('--endpoint <url>', 'Chain Insights Graph endpoint')\n .action(async (opts: { token: string; endpoint?: string }) => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({\n graphMcpMode: 'debug',\n graphMcpAuthToken: opts.token,\n ...(opts.endpoint ? { graphMcpEndpoint: opts.endpoint } : {}),\n })\n console.log('Chain Insights Graph debug mode enabled')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('off')\n .description('Disable Chain Insights Graph debug mode and use paid x402 calls')\n .action(async () => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({ graphMcpMode: 'paid', graphMcpAuthToken: '' })\n console.log('Chain Insights Graph debug mode disabled')\n console.log('Payments: enabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('status')\n .description('Show Chain Insights Graph payment/debug mode')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Chain Insights Graph mode: ${config.graphMcpMode}`)\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(\n `Debug token: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`\n )\n console.log(`Payments: ${config.graphMcpMode === 'debug' ? 'disabled' : 'enabled'}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('access-key')\n .description('Configure Chain Insights Graph test access key mode')\n .addCommand(\n createCliCommand('set')\n .description('Use a Chain Insights Graph test access key without x402 payments')\n .argument('<key>', 'Test access key')\n .option('--endpoint <url>', 'Chain Insights Graph endpoint')\n .action(async (key: string, opts: { endpoint?: string }) => {\n try {\n const normalizedKey = key.trim()\n if (!normalizedKey) throw new Error('Test access key is required')\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({\n graphMcpMode: 'debug',\n graphMcpAuthToken: normalizedKey,\n ...(opts.endpoint ? { graphMcpEndpoint: opts.endpoint } : {}),\n })\n console.log('Chain Insights Graph test access key configured')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled when the server accepts this key')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('clear')\n .description('Remove the Chain Insights Graph test access key and use paid x402 calls')\n .action(async () => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({ graphMcpMode: 'paid', graphMcpAuthToken: '' })\n console.log('Chain Insights Graph test access key cleared')\n console.log('Payments: enabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('status')\n .description('Show Chain Insights Graph test access key status')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(\n `Access key: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`\n )\n console.log(\n `Payments: ${config.graphMcpAuthToken?.trim() ? 'disabled when accepted by server' : 'enabled'}`\n )\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('setup')\n .description('Configure external MCP clients')\n .addCommand(\n createCliCommand('claude-code')\n .alias('claude')\n .description('Install Claude Code skills and register the MCP proxy')\n .action(() => {\n runInstaller('--claude')\n })\n )\n .addCommand(\n createCliCommand('codex')\n .description('Install Codex skills and register the MCP proxy')\n .action(() => {\n runInstaller('--codex')\n })\n )\n .addCommand(\n createCliCommand('hermes')\n .description('Install Hermes skills and register the MCP proxy')\n .action(() => {\n runInstaller('--hermes')\n })\n )\n\nprogram\n .command('config')\n .description('Read or write configuration values')\n .addCommand(\n createCliCommand('get')\n .description('Read one Chain Insights configuration value')\n .argument('<key>', 'Config key to read')\n .action(async (key: string) => {\n const { loadConfig } = await import('./config/index.js')\n const { CONFIG_KEYS } = await import('./config/schema.js')\n if (!CONFIG_KEYS.includes(key as (typeof CONFIG_KEYS)[number])) {\n console.error(`Unknown config key: ${key}`)\n process.exit(1)\n }\n const config = await loadConfig()\n const value = (config as Record<string, unknown>)[key]\n console.log(value ?? '')\n })\n )\n .addCommand(\n createCliCommand('set')\n .description('Write one Chain Insights configuration value')\n .argument('<key>', 'Config key to write')\n .argument('<value>', 'Value to set')\n .action(async (key: string, value: string) => {\n // D-01: walletPrivateKey is intercepted before saveConfig — the raw private key\n // must NEVER be written to config.json.\n if (key === 'walletPrivateKey') {\n try {\n const { setWalletPrivateKey } = await import('./wallet/index.js')\n const address = await setWalletPrivateKey(value)\n console.log('Wallet private key encrypted and stored in ~/.chain-insights/wallet.json')\n console.log(`Wallet address: ${address}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n return // MUST return — walletPrivateKey must never reach saveConfig or config.json\n }\n const { loadConfig, saveConfig } = await import('./config/index.js')\n const { CONFIG_KEYS, DEFAULT_CONFIG } = await import('./config/schema.js')\n const current = await loadConfig()\n if (!CONFIG_KEYS.includes(key as (typeof CONFIG_KEYS)[number])) {\n console.error(`Unknown config key: ${key}`)\n process.exit(1)\n }\n const existing = (current as Record<string, unknown>)[key]\n const defaultValue = (DEFAULT_CONFIG as Record<string, unknown>)[key]\n const coerced =\n typeof existing === 'number' || typeof defaultValue === 'number' ? Number(value) : value\n await saveConfig({ [key]: coerced } as Parameters<typeof saveConfig>[0])\n const displayed = key.toLowerCase().includes('token') ? '[redacted]' : coerced\n console.log(`Set ${key} = ${displayed}`)\n })\n )\n\nprogram\n .command('wallet')\n .description('Manage the local Base USDC payment wallet')\n .addCommand(\n createCliCommand('create')\n .description('Generate a new local Base payment wallet')\n .action(async () => {\n try {\n const { isWalletConfigured, setWalletPrivateKey, walletPath } =\n await import('./wallet/index.js')\n const { createInterface } = await import('node:readline/promises')\n const { formatWalletBackupWarning, generateWalletPrivateKey, isWalletBackupConfirmed } =\n await import('./wallet/create.js')\n\n if (await isWalletConfigured()) {\n throw new Error(\n 'A payment wallet already exists. Run `cia wallet address` to view it or use `cia wallet import <private-key> --force` to replace it.'\n )\n }\n\n const privateKey = generateWalletPrivateKey()\n const color = process.stderr.isTTY === true && process.env['NO_COLOR'] === undefined\n process.stderr.write(`${formatWalletBackupWarning(privateKey, { color })}\\n`)\n const prompt = createInterface({ input: process.stdin, output: process.stderr })\n let answer: string\n try {\n answer = await prompt.question('> ')\n } finally {\n prompt.close()\n }\n process.stderr.write('\\n')\n if (!isWalletBackupConfirmed(answer)) {\n throw new Error('Wallet creation cancelled. The wallet was not saved.')\n }\n\n const address = await setWalletPrivateKey(privateKey)\n console.log(`Wallet created: ${address}`)\n console.log(`Encrypted local copy: ${walletPath()}`)\n console.log('Next: cia wallet ready')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('import')\n .description('Import a Base payment wallet')\n .argument('<private-key>', '0x-prefixed EVM private key')\n .option(\n '--force',\n 'Replace an existing wallet (the previous key is backed up next to wallet.json)'\n )\n .action(async (privateKey: string, opts: { force?: boolean }) => {\n try {\n const { setWalletPrivateKey, isWalletConfigured } = await import('./wallet/index.js')\n const replacing = opts.force === true && (await isWalletConfigured())\n const address = await setWalletPrivateKey(privateKey, { force: opts.force })\n if (replacing) {\n console.log('Previous wallet key backed up next to ~/.chain-insights/wallet.json')\n }\n console.log(`Wallet imported: ${address}`)\n console.log(\n 'Keep your original private key backed up securely; it cannot be recovered from the encrypted local copy.'\n )\n console.log('Encrypted local copy: ~/.chain-insights/wallet.json')\n console.log('Next: cia wallet ready')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('address')\n .description('Print the local payment wallet address')\n .action(async () => {\n try {\n const { getWalletAccount } = await import('./wallet/tools.js')\n const account = await getWalletAccount()\n console.log(account.address)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('balance')\n .description('Show the local payment wallet Base USDC balance')\n .action(async () => {\n try {\n const { getWalletBalanceText } = await import('./wallet/tools.js')\n console.log(await getWalletBalanceText())\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('ready')\n .description('Check and prepare the wallet for paid Chain Insights Graph calls')\n .option('--check-only', 'Only check readiness; do not submit the one-time payment setup')\n .addOption(new Option('--no-approve', 'Deprecated alias for --check-only').hideHelp())\n .option('--payment-usdc <amount>', 'USDC setup cap to prepare for paid calls', '1')\n .addOption(\n new Option('--approval-usdc <amount>', 'Deprecated alias for --payment-usdc').hideHelp()\n )\n .option('--json', 'Print machine-readable readiness metadata')\n .action(\n async (opts: {\n checkOnly?: boolean\n approve?: boolean\n paymentUsdc?: string\n approvalUsdc?: string\n json?: boolean\n }) => {\n try {\n const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } =\n await import('./wallet/tools.js')\n const minimumApprovalUnits = parsePaymentApprovalUnits(\n opts.paymentUsdc ?? opts.approvalUsdc ?? '1'\n )\n const result = await prepareWalletForPaidCalls({\n minimumApprovalUnits,\n approve: opts.checkOnly ? false : opts.approve !== false,\n })\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n result,\n (_key, value) => (typeof value === 'bigint' ? value.toString() : value),\n 2\n )\n )\n return\n }\n\n console.log(formatWalletReadiness(result.readiness, result.approval))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n }\n )\n )\n .addCommand(\n createCliCommand('topup')\n .description('Open a local browser page to top up the payment wallet')\n .option('--no-open', 'Print the top-up URL without opening a browser')\n .option('--json', 'Print machine-readable top-up metadata')\n .action(async (opts: { open?: boolean; json?: boolean }) => {\n try {\n const { buildTopupInfo, getWalletAccount } = await import('./wallet/tools.js')\n const { startTopupServer } = await import('./wallet/topup-server.js')\n const account = await getWalletAccount()\n const url = await startTopupServer(account)\n const info = buildTopupInfo(account.address, url)\n\n if (opts.json) {\n console.log(JSON.stringify(info, null, 2))\n } else {\n console.log(`Top-up URL: ${url}`)\n console.log(`Wallet: ${account.address}`)\n console.log('Network: Base')\n console.log('Token: USDC')\n console.log('Press Ctrl+C to stop the top-up server.')\n }\n\n if (opts.open !== false) {\n const open = (await import('open')).default\n await open(url)\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nconst mcpCommand = program\n .command('mcp')\n .description('Interact with the Chain Insights MCP endpoint')\n .allowExcessArguments(false)\n .addCommand(\n createCliCommand('networks')\n .description('List the detailed Chain Insights capability matrix and tool support')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkCapabilities(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('tools')\n .description('List remote GraphRAG MCP tools (cached for 24 hours)')\n .option('--refresh', 'Force refresh schema cache')\n .action(async (opts: { refresh?: boolean }) => {\n try {\n const { loadSchema, saveSchema } = await import('./mcp/schema-cache.js')\n const { formatToolsTable } = await import('./mcp/format.js')\n const { visibleRemoteTools } = await import('./mcp/tool-visibility.js')\n const { loadConfig } = await import('./config/index.js')\n const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } =\n await import('./mcp/client.js')\n const config = await loadConfig()\n const graphMcpEndpoint = resolveGraphMcpEndpoint(config)\n let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint)\n if (!tools) {\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } =\n await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name: 'chain-insights-cli', version: PACKAGE_VERSION })\n await client.connect(\n new StreamableHTTPClientTransport(new URL(graphMcpEndpoint), { fetch: paymentFetch })\n )\n try {\n const result = await client.listTools()\n tools = result.tools as Array<{ name: string; description?: string }>\n await saveSchema(tools, graphMcpEndpoint)\n } finally {\n await client.close()\n }\n }\n console.log(formatToolsTable(visibleRemoteTools(tools)))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\naddAmlAddressRiskCommand(mcpCommand, 'cia mcp networks')\n\nmcpCommand.addCommand(\n createCliCommand('call')\n .description('Call an MCP tool directly (debug)')\n .option('--json', 'Print machine-readable JSON output')\n .argument('<tool>', 'Tool name to call')\n .argument('[args...]', 'Key=value arguments (e.g. address=0x1234... network=robinhood)')\n .action(async (tool: string, rawArgs: string[], opts: { json?: boolean }) => {\n try {\n const { parseMcpCallArgs } = await import('./mcp/call-args.js')\n const { assertPublicMcpToolName, validatePublicMcpToolArguments } =\n await import('./mcp/tool-visibility.js')\n const args = parseMcpCallArgs(rawArgs)\n assertPublicMcpToolName(tool)\n validatePublicMcpToolArguments(tool, args)\n\n if (tool === 'aml_address_risk') {\n const { resolveAmlAddressRiskVersion } = await import('./investigation/public-tools.js')\n resolveAmlAddressRiskVersion(\n args['version'] === undefined ? undefined : String(args['version'])\n )\n }\n\n if (tool === 'wallet_balance') {\n const { getWalletBalanceText } = await import('./wallet/tools.js')\n console.log(await getWalletBalanceText())\n return\n }\n\n if (tool === 'meta_network_capabilities') {\n await printNetworkCapabilities({ json: opts.json })\n return\n }\n\n if (tool === 'meta_help') {\n console.log(\n 'Chain Insights tools: aml_*, graph_query, graph_query_batch, meta_*, and wallet_balance.'\n )\n return\n }\n\n await withGraphMcpClient('chain-insights-cli-call', async (client, config) => {\n if (tool === 'meta_usage_status') {\n try {\n const result = await client.callTool({ name: 'usage_status', arguments: {} })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n } catch (err) {\n const {\n isMissingUsageStatusToolError,\n primitiveBackendUsageStatus,\n usageStatusText,\n } = await import('./mcp/usage-status.js')\n if (!isMissingUsageStatusToolError(err)) throw err\n const { resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n console.log(\n usageStatusText(primitiveBackendUsageStatus(resolveGraphMcpEndpoint(config)))\n )\n }\n return\n }\n if (tool === 'aml_address_risk') {\n const { runAmlAddressRisk } = await import('./investigation/public-tools.js')\n const result = await runAmlAddressRisk(\n client,\n {\n address: String(args['address'] ?? ''),\n network: String(args['network'] ?? ''),\n compareAddress:\n args['compare_address'] === undefined\n ? undefined\n : String(args['compare_address']),\n },\n args['version'] === undefined ? undefined : String(args['version'])\n )\n console.log(\n opts.json ? JSON.stringify(result.structuredContent, null, 2) : result.summaryText\n )\n return\n }\n const result = await client.callTool({ name: tool, arguments: args })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n })\n } catch (err) {\n const { formatMcpCallError } = await import('./mcp/tool-visibility.js')\n console.error(formatMcpCallError(tool, err))\n process.exit(1)\n }\n })\n)\n\n// parseAsync (not parse) so a rejected async action surfaces as a clean\n// one-line error and a non-zero exit, instead of an unhandled-rejection stack\n// trace. Commands with their own try/catch still exit(1) before this fires.\nprogram.parseAsync(normalizeAmlToolVersionArgv(process.argv)).catch((err) => {\n console.error((err as Error).message)\n process.exit(1)\n})\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ const require_version = require("./version-CO9Or_YV.cjs");
4
4
  const require_client = require("./client-Ypw9BNbn.cjs");
5
5
  const require_tool_visibility = require("./tool-visibility-BBEbpKt4.cjs");
6
6
  const require_usage_status = require("./usage-status-BdwwgYsu.cjs");
7
- const require_capabilities = require("./capabilities-CjpGnrVg.cjs");
7
+ const require_capabilities = require("./capabilities-B-M8vAYp.cjs");
8
8
  const require_action_log = require("./action-log-HniMMF7f.cjs");
9
9
  let node_path = require("node:path");
10
10
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
@@ -2,7 +2,7 @@ import { n as PACKAGE_VERSION } from "./version-BA3J8hu4.mjs";
2
2
  import { t as PaymentRequiredError } from "./client-CHYskPnG.mjs";
3
3
  import { n as PUBLIC_MCP_TOOL_ALLOWED_ARGS, r as PUBLIC_MCP_TOOL_REQUIRED_ARGS, t as HIDDEN_REMOTE_TOOL_NAMES } from "./tool-visibility-CJqjmDF5.mjs";
4
4
  import { t as primitiveBackendUsageStatus } from "./usage-status-CHiOPA-2.mjs";
5
- import { n as mirrorGraphNetworkCapabilities } from "./capabilities-CY3Ok5ls.mjs";
5
+ import { n as mirrorGraphNetworkCapabilities } from "./capabilities-ByKP5l0G.mjs";
6
6
  import { r as appendActionLog, t as actionLogSignalsFromResult } from "./action-log-diTHyMbV.mjs";
7
7
  import path from "node:path";
8
8
  import { appendFile, mkdir } from "node:fs/promises";
@@ -21,8 +21,8 @@ Chain Insights tools such as `aml_address_risk` are recipes built over
21
21
  Chain Insights Graph endpoint.
22
22
 
23
23
  `cia mcp tools` lists this remote GraphRAG surface. Use `cia networks` for the
24
- short network overview and `cia mcp networks` for the full Chain Insights
25
- capability matrix, which also reports local workflow and wallet tools.
24
+ short network overview, `cia network <name>` for one network's details and
25
+ available tools, and `cia mcp networks` for the full network capability matrix.
26
26
 
27
27
  The Chain Insights MCP proxy adds product-facing local metadata tools such as
28
28
  `meta_network_capabilities`, `meta_usage_status`, and `meta_help`. On hosted
@@ -37,7 +37,10 @@ primitive-backend status instead.
37
37
  - Use `USE topology` for topology (the address / FLOWS_TO / LINKED graph,
38
38
  covering unified recent and full historical activity in one graph, plus the
39
39
  node `risk_score`/`risk_level` verdict).
40
- - Use `USE facts` for labels, features, assets, and enrichment.
40
+ - Use `USE facts` for bounded individual `TRANSFER` rows and their amount,
41
+ `amount_usd`, asset, transaction, and block facts. Address labels, risk,
42
+ lifetime metrics, and `FLOWS_TO`/`LINKED` relationships belong to
43
+ `USE topology`.
41
44
  - Use `meta_usage_status` through Chain Insights before public hosted reads
42
45
  when you need the caller's remaining free-tier allowance.
43
46
  - Hosted endpoints can expose a public free tier for graph_query. The default
package/docs/mcp-proxy.md CHANGED
@@ -91,8 +91,9 @@ Chain Insights presents this as local, prefixed metadata through
91
91
  `meta_network_capabilities`.
92
92
 
93
93
  The CLI keeps these catalogs distinct: `cia mcp tools` lists remote GraphRAG
94
- tools and caches that schema for 24 hours, while `cia mcp networks` reports the
95
- Chain Insights capability matrix, including local workflow and wallet tools.
94
+ tools and caches that schema for 24 hours, while `cia networks` and
95
+ `cia network <name>` report the network list and each network's advertised
96
+ tools. `cia mcp networks` exposes the same full network capability matrix.
96
97
  Use `cia mcp tools --refresh` after a backend tool change.
97
98
 
98
99
  `meta_usage_status` is a Chain Insights proxy tool. On hosted Chain Insights Graph
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chain-insights",
3
- "version": "0.25.0",
3
+ "version": "0.26.0",
4
4
  "description": "AML investigation CLI and MCP proxy for blockchain risk screening and Chain Insights Graph access",
5
5
  "homepage": "https://chain-insights.ai",
6
6
  "repository": {
@@ -32,7 +32,7 @@ The screen covers risk, behavior, neighborhood context, and exchange
32
32
  exposure. Treat exchange hot wallets as terminals, not as intermediate
33
33
  hops.
34
34
 
35
- For the CLI, use `cia aml-address-risk` for the readable summary. Add
35
+ For the CLI, use `cia mcp aml-address-risk` for the readable summary. Add
36
36
  `--json` for indented structured output. When using `cia mcp call`, pass the
37
37
  version as `version=v1`.
38
38
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"capabilities-CY3Ok5ls.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\nexport const PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS = {\n aml_address_risk: 'available',\n graph_query: 'available',\n graph_query_batch: 'available',\n meta_network_capabilities: 'available',\n meta_usage_status: 'available',\n meta_help: 'available',\n wallet_balance: 'available',\n} as const\nconst AVAILABLE_TOOLS_PER_LINE = 3\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction advertisedNetwork(raw: unknown): NetworkCapability | null {\n if (!isRecord(raw) || typeof raw.network !== 'string' || raw.network.trim() === '') {\n return null\n }\n const network = raw.network.trim()\n const capability: NetworkCapability = {\n network,\n display_name:\n typeof raw.display_name === 'string' && raw.display_name.trim() !== ''\n ? raw.display_name\n : network,\n status: typeof raw.status === 'string' && raw.status.trim() !== '' ? raw.status : 'live',\n layers: {},\n tools: { ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS },\n }\n if (raw.default === true) capability.default = true\n if (raw.default === false) capability.default = false\n if (isRecord(raw.coverage)) capability.coverage = raw.coverage as NetworkCapability['coverage']\n if (isRecord(raw.freshness))\n capability.freshness = raw.freshness as NetworkCapability['freshness']\n return capability\n}\n\n/** Repeat GraphRAG's network list. CIA does not add, drop, or invent names. */\nexport function mirrorGraphNetworkCapabilities(document: {\n networks: unknown[]\n}): NetworkCapabilitiesDocument {\n return {\n schema: 'chain-insights.network-capabilities.v1',\n networks: document.networks\n .map((network) => advertisedNetwork(network))\n .filter((network): network is NetworkCapability => network !== null),\n }\n}\n\nfunction publicNetworkCapabilities(\n document: NetworkCapabilitiesDocument\n): NetworkCapabilitiesDocument {\n return mirrorGraphNetworkCapabilities(document)\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 (\n parsed.schema !== 'chain-insights.network-capabilities.v1' ||\n !Array.isArray(parsed.networks)\n ) {\n throw new Error('network capabilities response has unsupported schema')\n }\n return publicNetworkCapabilities(parsed)\n}\n\nfunction availableTools(network: NetworkCapability): string[] {\n const effectiveTools = {\n ...(network.tools ?? {}),\n ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,\n }\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 =\n coverage.from_block !== undefined && coverage.to_block !== undefined\n ? `${coverage.from_block}..${coverage.to_block}`\n : 'blocks unknown'\n const dateRange =\n 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\nfunction displayName(network: NetworkCapability): string {\n return network.display_name || network.network\n}\n\nfunction statusLabel(network: NetworkCapability): string {\n return network.default ? `${network.status} (default)` : network.status\n}\n\nfunction formatTable(headers: string[], rows: string[][], minimumWidths: number[]): string {\n const widths = headers.map((header, index) =>\n Math.max(\n minimumWidths[index] ?? 0,\n header.length,\n ...rows.map((row) => row[index]?.length ?? 0)\n )\n )\n const row = (values: string[]) =>\n values.map((value, index) => value.padEnd(widths[index]!)).join(' ')\n return [row(headers), widths.map((width) => '-'.repeat(width)).join(' '), ...rows.map(row)].join(\n '\\n'\n )\n}\n\nexport function formatNetworkOverview(document: NetworkCapabilitiesDocument): string {\n if (document.networks.length === 0) return 'No supported networks advertised.'\n const rows = document.networks.map((network) => [\n displayName(network),\n statusLabel(network),\n datasetLabel(network),\n ])\n return formatTable(['Network', 'Status', 'Dataset'], rows, [14, 10, 38])\n}\n\nexport function formatNetworkCapabilities(document: NetworkCapabilitiesDocument): string {\n if (document.networks.length === 0) return 'No supported networks advertised.'\n const networkRows = document.networks.flatMap((network) => {\n const toolLines = availableToolLines(network)\n return toolLines.map((toolLine, index) => [\n index === 0 ? displayName(network) : '',\n index === 0 ? datasetLabel(network) : '',\n toolLine,\n ])\n })\n return formatTable(['Network', 'Dataset', 'Chain Insights tools'], networkRows, [14, 38, 64])\n}\n\nexport function findNetworkCapability(\n document: NetworkCapabilitiesDocument,\n name: string\n): NetworkCapability | undefined {\n const normalizedName = name.trim().toLowerCase()\n if (!normalizedName) return undefined\n return document.networks.find((network) =>\n [network.network, network.display_name].some(\n (candidate) => candidate?.trim().toLowerCase() === normalizedName\n )\n )\n}\n\nexport function formatNetworkCapability(network: NetworkCapability): string {\n const rows = [\n ['Network', network.display_name || network.network],\n ['Identifier', network.network],\n ['Status', network.default ? `${network.status} (default)` : network.status],\n ['Dataset', datasetLabel(network)],\n ['Available tools', availableTools(network).join(', ') || 'none'],\n ]\n const labelWidth = Math.max(...rows.map(([label]) => label.length))\n return rows.map(([label, value]) => `${label.padEnd(labelWidth)} ${value}`).join('\\n')\n}\n"],"mappings":"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"}