chain-insights 0.23.0 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +20 -4
  2. package/bin/cli.js +1 -1
  3. package/bin/install.cjs +1 -1
  4. package/dist/{capabilities-BZI6qROg.mjs → capabilities-CY3Ok5ls.mjs} +61 -19
  5. package/dist/capabilities-CY3Ok5ls.mjs.map +1 -0
  6. package/dist/{capabilities-CPcrxodx.cjs → capabilities-CjpGnrVg.cjs} +60 -18
  7. package/dist/cli.cjs +78 -19
  8. package/dist/cli.mjs +78 -19
  9. package/dist/cli.mjs.map +1 -1
  10. package/dist/{client-D4aM4bzP.mjs → client-CHYskPnG.mjs} +6 -6
  11. package/dist/client-CHYskPnG.mjs.map +1 -0
  12. package/dist/{client-CqAzD519.cjs → client-Ypw9BNbn.cjs} +5 -5
  13. package/dist/create-C0buxEfU.mjs +48 -0
  14. package/dist/create-C0buxEfU.mjs.map +1 -0
  15. package/dist/create-DdggkF04.cjs +69 -0
  16. package/dist/format-BjZuYDr8.cjs +50 -0
  17. package/dist/format-DB2IH2U5.mjs +52 -0
  18. package/dist/format-DB2IH2U5.mjs.map +1 -0
  19. package/dist/index.cjs +7 -3
  20. package/dist/index.d.cts +10 -1
  21. package/dist/index.d.cts.map +1 -1
  22. package/dist/index.d.mts +10 -1
  23. package/dist/index.d.mts.map +1 -1
  24. package/dist/index.mjs +5 -4
  25. package/dist/mcp-proxy.cjs +5 -5
  26. package/dist/mcp-proxy.mjs +5 -5
  27. package/dist/mcp-proxy.mjs.map +1 -1
  28. package/dist/{tools-lPY6k-vJ.cjs → tools-BHfphgy9.cjs} +4 -4
  29. package/dist/{tools-BKLnlBG1.mjs → tools-BRQAPF2R.mjs} +5 -5
  30. package/dist/tools-BRQAPF2R.mjs.map +1 -0
  31. package/dist/{wallet-BEvHrHi3.cjs → wallet-B3hAr70M.cjs} +3 -3
  32. package/dist/{wallet-fMbhvKXT.mjs → wallet-COcm4oIb.mjs} +4 -4
  33. package/dist/wallet-COcm4oIb.mjs.map +1 -0
  34. package/docs/architecture.md +5 -5
  35. package/docs/graph-tools.md +7 -3
  36. package/docs/mcp-proxy.md +34 -20
  37. package/package.json +1 -1
  38. package/dist/capabilities-BZI6qROg.mjs.map +0 -1
  39. package/dist/client-D4aM4bzP.mjs.map +0 -1
  40. package/dist/format-9NLBykEL.cjs +0 -20
  41. package/dist/format-Bq94jSyw.mjs +0 -22
  42. package/dist/format-Bq94jSyw.mjs.map +0 -1
  43. package/dist/tools-BKLnlBG1.mjs.map +0 -1
  44. package/dist/wallet-fMbhvKXT.mjs.map +0 -1
package/README.md CHANGED
@@ -23,10 +23,11 @@ as-is on macOS; on Windows use WSL.
23
23
  npx chain-insights@latest --help # run without installing
24
24
  npm install -g chain-insights # or install the cia CLI globally
25
25
  cia mcp call aml_address_risk network=robinhood address=0xYourAddressHere
26
- cia networks # supported networks + public tool surface
26
+ cia networks # network status + dataset overview
27
+ cia network robinhood # details for one network
27
28
  ```
28
29
 
29
- Sixty seconds gets you the CLI and the live tool catalog.
30
+ Sixty seconds gets you the CLI, a network overview, and the remote tool catalog.
30
31
  To call the same tools from an agent, register the MCP proxy:
31
32
  `cia setup claude-code` (or `codex` / `hermes`).
32
33
 
@@ -214,6 +215,18 @@ cia mcp call aml_address_risk \
214
215
  network=robinhood address=0xYourAddressHere
215
216
  ```
216
217
 
218
+ Create a local payment wallet when paid access is needed:
219
+
220
+ ```bash
221
+ cia wallet create
222
+ ```
223
+
224
+ The command shows the private key once in a clearly marked warning panel.
225
+ Save it in a secure password manager or offline backup, then type `BACKED UP`
226
+ to finish. The encrypted local copy is stored at
227
+ `~/.chain-insights/wallet.json`. Continue with `cia wallet ready` when you are
228
+ ready to enable paid access.
229
+
217
230
  Example queries. Direct topology:
218
231
 
219
232
  ```bash
@@ -314,13 +327,16 @@ Health checks (each is runnable):
314
327
  # Configured endpoint
315
328
  cia config get graphMcpEndpoint
316
329
 
317
- # Endpoint reachable, networks listed
330
+ # User-facing network overview
331
+ cia networks
332
+
333
+ # Detailed Chain Insights capability matrix
318
334
  cia mcp networks
319
335
 
320
336
  # Caller allowance / metering status
321
337
  cia mcp call meta_usage_status
322
338
 
323
- # Fresh tool discovery
339
+ # Fresh remote tool discovery
324
340
  cia mcp tools --refresh
325
341
 
326
342
  # Installed CLI sanity
package/bin/cli.js CHANGED
@@ -4,6 +4,6 @@
4
4
  // CJS shim: bridges the npm bin entry to the ESM dist built by tsdown.
5
5
  // Dynamic import() is the correct bridge pattern from CommonJS to ESM.
6
6
  import('../dist/cli.mjs').catch((err) => {
7
- console.error('Failed to load chain-insights:', err.message)
7
+ console.error('Failed to load cia:', err.message)
8
8
  process.exit(1)
9
9
  })
package/bin/install.cjs CHANGED
@@ -282,5 +282,5 @@ for (const target of skillsTargets) {
282
282
  console.log(` ${cyan}Config:${reset} ${configPath}`)
283
283
  console.log(` ${cyan}Data dir:${reset} ${dataDir}`)
284
284
  console.log(
285
- `\n${dim}Run ${reset}${cyan}chain-insights status${reset}${dim} to verify the installation.${reset}\n`
285
+ `\n${dim}Run ${reset}${cyan}cia status${reset}${dim} to verify the installation.${reset}\n`
286
286
  )
@@ -1,10 +1,13 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
- import { a as resolveGraphMcpEndpoint, n as applyMcpAuthHeaders } from "./client-D4aM4bzP.mjs";
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
5
  PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS: () => PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,
6
6
  fetchNetworkCapabilities: () => fetchNetworkCapabilities,
7
+ findNetworkCapability: () => findNetworkCapability,
7
8
  formatNetworkCapabilities: () => formatNetworkCapabilities,
9
+ formatNetworkCapability: () => formatNetworkCapability,
10
+ formatNetworkOverview: () => formatNetworkOverview,
8
11
  mirrorGraphNetworkCapabilities: () => mirrorGraphNetworkCapabilities
9
12
  });
10
13
  const PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS = {
@@ -97,33 +100,72 @@ function datasetLabel(network) {
97
100
  if (dateRange === "") return blockRange;
98
101
  return `${blockRange} / ${dateRange}`;
99
102
  }
103
+ function displayName(network) {
104
+ return network.display_name || network.network;
105
+ }
106
+ function statusLabel(network) {
107
+ return network.default ? `${network.status} (default)` : network.status;
108
+ }
109
+ function formatTable(headers, rows, minimumWidths) {
110
+ const widths = headers.map((header, index) => Math.max(minimumWidths[index] ?? 0, header.length, ...rows.map((row) => row[index]?.length ?? 0)));
111
+ const row = (values) => values.map((value, index) => value.padEnd(widths[index])).join(" ");
112
+ return [
113
+ row(headers),
114
+ widths.map((width) => "-".repeat(width)).join(" "),
115
+ ...rows.map(row)
116
+ ].join("\n");
117
+ }
118
+ function formatNetworkOverview(document) {
119
+ if (document.networks.length === 0) return "No supported networks advertised.";
120
+ return formatTable([
121
+ "Network",
122
+ "Status",
123
+ "Dataset"
124
+ ], document.networks.map((network) => [
125
+ displayName(network),
126
+ statusLabel(network),
127
+ datasetLabel(network)
128
+ ]), [
129
+ 14,
130
+ 10,
131
+ 38
132
+ ]);
133
+ }
100
134
  function formatNetworkCapabilities(document) {
101
135
  if (document.networks.length === 0) return "No supported networks advertised.";
102
- const headers = [
136
+ return formatTable([
103
137
  "Network",
104
138
  "Dataset",
105
- "Available tools"
106
- ];
107
- const widths = [
139
+ "Chain Insights tools"
140
+ ], document.networks.flatMap((network) => {
141
+ return availableToolLines(network).map((toolLine, index) => [
142
+ index === 0 ? displayName(network) : "",
143
+ index === 0 ? datasetLabel(network) : "",
144
+ toolLine
145
+ ]);
146
+ }), [
108
147
  14,
109
148
  38,
110
149
  64
150
+ ]);
151
+ }
152
+ function findNetworkCapability(document, name) {
153
+ const normalizedName = name.trim().toLowerCase();
154
+ if (!normalizedName) return void 0;
155
+ return document.networks.find((network) => [network.network, network.display_name].some((candidate) => candidate?.trim().toLowerCase() === normalizedName));
156
+ }
157
+ function formatNetworkCapability(network) {
158
+ const rows = [
159
+ ["Network", network.display_name || network.network],
160
+ ["Identifier", network.network],
161
+ ["Status", network.default ? `${network.status} (default)` : network.status],
162
+ ["Dataset", datasetLabel(network)],
163
+ ["Available tools", availableTools(network).join(", ") || "none"]
111
164
  ];
112
- const row = (values) => values.map((value, index) => value.padEnd(widths[index])).join(" ");
113
- const networkRows = document.networks.flatMap((network) => {
114
- return availableToolLines(network).map((toolLine, index) => row([
115
- index === 0 ? network.display_name || network.network : "",
116
- index === 0 ? datasetLabel(network) : "",
117
- toolLine
118
- ]));
119
- });
120
- return [
121
- row(headers),
122
- widths.map((width) => "-".repeat(width)).join(" "),
123
- ...networkRows
124
- ].join("\n");
165
+ const labelWidth = Math.max(...rows.map(([label]) => label.length));
166
+ return rows.map(([label, value]) => `${label.padEnd(labelWidth)} ${value}`).join("\n");
125
167
  }
126
168
  //#endregion
127
169
  export { mirrorGraphNetworkCapabilities as n, capabilities_exports as t };
128
170
 
129
- //# sourceMappingURL=capabilities-BZI6qROg.mjs.map
171
+ //# sourceMappingURL=capabilities-CY3Ok5ls.mjs.map
@@ -0,0 +1 @@
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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"}
@@ -1,10 +1,13 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
2
- const require_client = require("./client-CqAzD519.cjs");
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
5
  PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS: () => PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,
6
6
  fetchNetworkCapabilities: () => fetchNetworkCapabilities,
7
+ findNetworkCapability: () => findNetworkCapability,
7
8
  formatNetworkCapabilities: () => formatNetworkCapabilities,
9
+ formatNetworkCapability: () => formatNetworkCapability,
10
+ formatNetworkOverview: () => formatNetworkOverview,
8
11
  mirrorGraphNetworkCapabilities: () => mirrorGraphNetworkCapabilities
9
12
  });
10
13
  const PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS = {
@@ -97,31 +100,70 @@ function datasetLabel(network) {
97
100
  if (dateRange === "") return blockRange;
98
101
  return `${blockRange} / ${dateRange}`;
99
102
  }
103
+ function displayName(network) {
104
+ return network.display_name || network.network;
105
+ }
106
+ function statusLabel(network) {
107
+ return network.default ? `${network.status} (default)` : network.status;
108
+ }
109
+ function formatTable(headers, rows, minimumWidths) {
110
+ const widths = headers.map((header, index) => Math.max(minimumWidths[index] ?? 0, header.length, ...rows.map((row) => row[index]?.length ?? 0)));
111
+ const row = (values) => values.map((value, index) => value.padEnd(widths[index])).join(" ");
112
+ return [
113
+ row(headers),
114
+ widths.map((width) => "-".repeat(width)).join(" "),
115
+ ...rows.map(row)
116
+ ].join("\n");
117
+ }
118
+ function formatNetworkOverview(document) {
119
+ if (document.networks.length === 0) return "No supported networks advertised.";
120
+ return formatTable([
121
+ "Network",
122
+ "Status",
123
+ "Dataset"
124
+ ], document.networks.map((network) => [
125
+ displayName(network),
126
+ statusLabel(network),
127
+ datasetLabel(network)
128
+ ]), [
129
+ 14,
130
+ 10,
131
+ 38
132
+ ]);
133
+ }
100
134
  function formatNetworkCapabilities(document) {
101
135
  if (document.networks.length === 0) return "No supported networks advertised.";
102
- const headers = [
136
+ return formatTable([
103
137
  "Network",
104
138
  "Dataset",
105
- "Available tools"
106
- ];
107
- const widths = [
139
+ "Chain Insights tools"
140
+ ], document.networks.flatMap((network) => {
141
+ return availableToolLines(network).map((toolLine, index) => [
142
+ index === 0 ? displayName(network) : "",
143
+ index === 0 ? datasetLabel(network) : "",
144
+ toolLine
145
+ ]);
146
+ }), [
108
147
  14,
109
148
  38,
110
149
  64
150
+ ]);
151
+ }
152
+ function findNetworkCapability(document, name) {
153
+ const normalizedName = name.trim().toLowerCase();
154
+ if (!normalizedName) return void 0;
155
+ return document.networks.find((network) => [network.network, network.display_name].some((candidate) => candidate?.trim().toLowerCase() === normalizedName));
156
+ }
157
+ function formatNetworkCapability(network) {
158
+ const rows = [
159
+ ["Network", network.display_name || network.network],
160
+ ["Identifier", network.network],
161
+ ["Status", network.default ? `${network.status} (default)` : network.status],
162
+ ["Dataset", datasetLabel(network)],
163
+ ["Available tools", availableTools(network).join(", ") || "none"]
111
164
  ];
112
- const row = (values) => values.map((value, index) => value.padEnd(widths[index])).join(" ");
113
- const networkRows = document.networks.flatMap((network) => {
114
- return availableToolLines(network).map((toolLine, index) => row([
115
- index === 0 ? network.display_name || network.network : "",
116
- index === 0 ? datasetLabel(network) : "",
117
- toolLine
118
- ]));
119
- });
120
- return [
121
- row(headers),
122
- widths.map((width) => "-".repeat(width)).join(" "),
123
- ...networkRows
124
- ].join("\n");
165
+ const labelWidth = Math.max(...rows.map(([label]) => label.length));
166
+ return rows.map(([label, value]) => `${label.padEnd(labelWidth)} ${value}`).join("\n");
125
167
  }
126
168
  //#endregion
127
169
  Object.defineProperty(exports, "capabilities_exports", {
package/dist/cli.cjs CHANGED
@@ -23,7 +23,7 @@ function printMcpTextContent(result) {
23
23
  const __dirname$1 = node_path.default.dirname((0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href));
24
24
  const installerPath = node_path.default.resolve(__dirname$1, "..", "bin", "install.cjs");
25
25
  const program = new commander.Command();
26
- program.name("chain-insights").description("AML investigation toolkit for blockchain analysis").version(require_version.PACKAGE_INFO.version).option("--claude", "Install Claude Code skills globally to ~/.claude/skills/").option("--codex", "Install Codex skills globally to ~/.codex/skills/ and register MCP").option("--hermes", "Install Hermes skills globally to ~/.hermes/skills/chain-insights/ and register MCP");
26
+ program.name("cia").description("AML investigation toolkit for blockchain analysis").version(require_version.PACKAGE_INFO.version).option("--claude", "Install Claude Code skills globally to ~/.claude/skills/").option("--codex", "Install Codex skills globally to ~/.codex/skills/ and register MCP").option("--hermes", "Install Hermes skills globally to ~/.hermes/skills/chain-insights/ and register MCP");
27
27
  const rawArgs = process.argv.slice(2);
28
28
  const installerFlags = rawArgs.filter((a) => a === "--claude" || a === "--codex" || a === "--hermes");
29
29
  const wantsHelpOrVersion = rawArgs.some((a) => a === "--help" || a === "-h" || a === "--version" || a === "-V");
@@ -52,7 +52,7 @@ function runInstaller(flag) {
52
52
  async function withGraphMcpClient(name, fn) {
53
53
  const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
54
54
  const config = await loadConfig();
55
- const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-CqAzD519.cjs")).then((n) => n.client_exports);
55
+ const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-Ypw9BNbn.cjs")).then((n) => n.client_exports);
56
56
  const paymentFetch = await createConfiguredGraphMcpFetch(config);
57
57
  const { Client } = await import("@modelcontextprotocol/sdk/client/index.js");
58
58
  const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
@@ -71,14 +71,42 @@ async function withGraphMcpClient(name, fn) {
71
71
  }
72
72
  async function printNetworkCapabilities(opts) {
73
73
  const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
74
- const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-CPcrxodx.cjs")).then((n) => n.capabilities_exports);
74
+ const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-CjpGnrVg.cjs")).then((n) => n.capabilities_exports);
75
75
  const document = await fetchNetworkCapabilities(await loadConfig());
76
76
  if (opts.json) console.log(JSON.stringify(document, null, 2));
77
77
  else console.log(formatNetworkCapabilities(document));
78
78
  }
79
- program.command("networks").alias("network").description("List supported graph networks, capability layers, and available tools").option("--json", "Print raw capability JSON").action(async (opts) => {
79
+ async function printNetworkOverview(opts) {
80
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
81
+ const { fetchNetworkCapabilities, formatNetworkOverview } = await Promise.resolve().then(() => require("./capabilities-CjpGnrVg.cjs")).then((n) => n.capabilities_exports);
82
+ const document = await fetchNetworkCapabilities(await loadConfig());
83
+ if (opts.json) console.log(JSON.stringify(document, null, 2));
84
+ else console.log(formatNetworkOverview(document));
85
+ }
86
+ async function printNetworkCapability(name, opts) {
87
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
88
+ const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } = await Promise.resolve().then(() => require("./capabilities-CjpGnrVg.cjs")).then((n) => n.capabilities_exports);
89
+ const document = await fetchNetworkCapabilities(await loadConfig());
90
+ const network = findNetworkCapability(document, name);
91
+ if (!network) {
92
+ const available = document.networks.map((candidate) => candidate.network).join(", ");
93
+ const suffix = available ? ` Available networks: ${available}.` : "";
94
+ throw new Error(`Network "${name}" is not supported.${suffix} Run \`cia networks\` to list supported networks.`);
95
+ }
96
+ if (opts.json) console.log(JSON.stringify(network, null, 2));
97
+ else console.log(formatNetworkCapability(network));
98
+ }
99
+ program.command("networks").description("Show supported network status and dataset overview").option("--json", "Print raw capability JSON").action(async (opts) => {
80
100
  try {
81
- await printNetworkCapabilities(opts);
101
+ await printNetworkOverview(opts);
102
+ } catch (err) {
103
+ console.error(err.message);
104
+ process.exit(1);
105
+ }
106
+ });
107
+ program.command("network").description("Show details for one supported graph network").argument("<name>", "Network identifier or display name (for example: robinhood)").option("--json", "Print raw capability JSON for this network").action(async (name, opts) => {
108
+ try {
109
+ await printNetworkCapability(name, opts);
82
110
  } catch (err) {
83
111
  console.error(err.message);
84
112
  process.exit(1);
@@ -219,7 +247,7 @@ program.command("config").description("Read or write configuration values").addC
219
247
  })).addCommand(new commander.Command("set").argument("<key>", "Config key to write").argument("<value>", "Value to set").action(async (key, value) => {
220
248
  if (key === "walletPrivateKey") {
221
249
  try {
222
- const { setWalletPrivateKey } = await Promise.resolve().then(() => require("./wallet-BEvHrHi3.cjs")).then((n) => n.wallet_exports);
250
+ const { setWalletPrivateKey } = await Promise.resolve().then(() => require("./wallet-B3hAr70M.cjs")).then((n) => n.wallet_exports);
223
251
  const address = await setWalletPrivateKey(value);
224
252
  console.log("Wallet private key encrypted and stored in ~/.chain-insights/wallet.json");
225
253
  console.log(`Wallet address: ${address}`);
@@ -243,21 +271,52 @@ program.command("config").description("Read or write configuration values").addC
243
271
  const displayed = key.toLowerCase().includes("token") ? "[redacted]" : coerced;
244
272
  console.log(`Set ${key} = ${displayed}`);
245
273
  }));
246
- program.command("wallet").description("Manage the local Base USDC payment wallet").addCommand(new commander.Command("import").description("Import a Base payment wallet").argument("<private-key>", "0x-prefixed EVM private key").option("--force", "Replace an existing wallet (the previous key is backed up next to wallet.json)").action(async (privateKey, opts) => {
274
+ program.command("wallet").description("Manage the local Base USDC payment wallet").addCommand(new commander.Command("create").description("Generate a new local Base payment wallet").action(async () => {
275
+ try {
276
+ const { isWalletConfigured, setWalletPrivateKey, walletPath } = await Promise.resolve().then(() => require("./wallet-B3hAr70M.cjs")).then((n) => n.wallet_exports);
277
+ const { createInterface } = await import("node:readline/promises");
278
+ const { formatWalletBackupWarning, generateWalletPrivateKey, isWalletBackupConfirmed } = await Promise.resolve().then(() => require("./create-DdggkF04.cjs")).then((n) => n.create_exports);
279
+ if (await isWalletConfigured()) throw new Error("A payment wallet already exists. Run `cia wallet address` to view it or use `cia wallet import <private-key> --force` to replace it.");
280
+ const privateKey = generateWalletPrivateKey();
281
+ const color = process.stderr.isTTY === true && process.env["NO_COLOR"] === void 0;
282
+ process.stderr.write(`${formatWalletBackupWarning(privateKey, { color })}\n`);
283
+ const prompt = createInterface({
284
+ input: process.stdin,
285
+ output: process.stderr
286
+ });
287
+ let answer;
288
+ try {
289
+ answer = await prompt.question("> ");
290
+ } finally {
291
+ prompt.close();
292
+ }
293
+ process.stderr.write("\n");
294
+ if (!isWalletBackupConfirmed(answer)) throw new Error("Wallet creation cancelled. The wallet was not saved.");
295
+ const address = await setWalletPrivateKey(privateKey);
296
+ console.log(`Wallet created: ${address}`);
297
+ console.log(`Encrypted local copy: ${walletPath()}`);
298
+ console.log("Next: cia wallet ready");
299
+ } catch (err) {
300
+ console.error(err.message);
301
+ process.exit(1);
302
+ }
303
+ })).addCommand(new commander.Command("import").description("Import a Base payment wallet").argument("<private-key>", "0x-prefixed EVM private key").option("--force", "Replace an existing wallet (the previous key is backed up next to wallet.json)").action(async (privateKey, opts) => {
247
304
  try {
248
- const { setWalletPrivateKey, isWalletConfigured } = await Promise.resolve().then(() => require("./wallet-BEvHrHi3.cjs")).then((n) => n.wallet_exports);
305
+ const { setWalletPrivateKey, isWalletConfigured } = await Promise.resolve().then(() => require("./wallet-B3hAr70M.cjs")).then((n) => n.wallet_exports);
249
306
  const replacing = opts.force === true && await isWalletConfigured();
250
307
  const address = await setWalletPrivateKey(privateKey, { force: opts.force });
251
308
  if (replacing) console.log("Previous wallet key backed up next to ~/.chain-insights/wallet.json");
252
309
  console.log(`Wallet imported: ${address}`);
253
- console.log("Next: run `chain-insights wallet ready`");
310
+ console.log("Keep your original private key backed up securely; it cannot be recovered from the encrypted local copy.");
311
+ console.log("Encrypted local copy: ~/.chain-insights/wallet.json");
312
+ console.log("Next: cia wallet ready");
254
313
  } catch (err) {
255
314
  console.error(err.message);
256
315
  process.exit(1);
257
316
  }
258
317
  })).addCommand(new commander.Command("address").description("Print the local payment wallet address").action(async () => {
259
318
  try {
260
- const { getWalletAccount } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
319
+ const { getWalletAccount } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
261
320
  const account = await getWalletAccount();
262
321
  console.log(account.address);
263
322
  } catch (err) {
@@ -266,7 +325,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
266
325
  }
267
326
  })).addCommand(new commander.Command("balance").description("Show the local payment wallet Base USDC balance").action(async () => {
268
327
  try {
269
- const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
328
+ const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
270
329
  console.log(await getWalletBalanceText());
271
330
  } catch (err) {
272
331
  console.error(err.message);
@@ -274,7 +333,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
274
333
  }
275
334
  })).addCommand(new commander.Command("ready").description("Check and prepare the wallet for paid Chain Insights Graph calls").option("--check-only", "Only check readiness; do not submit the one-time payment setup").addOption(new commander.Option("--no-approve", "Deprecated alias for --check-only").hideHelp()).option("--payment-usdc <amount>", "USDC setup cap to prepare for paid calls", "1").addOption(new commander.Option("--approval-usdc <amount>", "Deprecated alias for --payment-usdc").hideHelp()).option("--json", "Print machine-readable readiness metadata").action(async (opts) => {
276
335
  try {
277
- const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
336
+ const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
278
337
  const result = await prepareWalletForPaidCalls({
279
338
  minimumApprovalUnits: parsePaymentApprovalUnits(opts.paymentUsdc ?? opts.approvalUsdc ?? "1"),
280
339
  approve: opts.checkOnly ? false : opts.approve !== false
@@ -290,7 +349,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
290
349
  }
291
350
  })).addCommand(new commander.Command("topup").description("Open a local browser page to top up the payment wallet").option("--no-open", "Print the top-up URL without opening a browser").option("--json", "Print machine-readable top-up metadata").action(async (opts) => {
292
351
  try {
293
- const { buildTopupInfo, getWalletAccount } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
352
+ const { buildTopupInfo, getWalletAccount } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
294
353
  const { startTopupServer } = await Promise.resolve().then(() => require("./topup-server-YN3iHrHW.cjs")).then((n) => n.topup_server_exports);
295
354
  const account = await getWalletAccount();
296
355
  const url = await startTopupServer(account);
@@ -312,20 +371,20 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
312
371
  process.exit(1);
313
372
  }
314
373
  }));
315
- program.command("mcp").description("Interact with the Chain Insights MCP endpoint").allowExcessArguments(false).addCommand(new commander.Command("networks").description("List supported graph networks, capability layers, dataset coverage, and available tools").option("--json", "Print raw capability JSON").action(async (opts) => {
374
+ program.command("mcp").description("Interact with the Chain Insights MCP endpoint").allowExcessArguments(false).addCommand(new commander.Command("networks").description("List the detailed Chain Insights capability matrix and tool support").option("--json", "Print raw capability JSON").action(async (opts) => {
316
375
  try {
317
376
  await printNetworkCapabilities(opts);
318
377
  } catch (err) {
319
378
  console.error(err.message);
320
379
  process.exit(1);
321
380
  }
322
- })).addCommand(new commander.Command("tools").description("List available MCP tools (cached 24h)").option("--refresh", "Force refresh schema cache").action(async (opts) => {
381
+ })).addCommand(new commander.Command("tools").description("List remote GraphRAG MCP tools (cached for 24 hours)").option("--refresh", "Force refresh schema cache").action(async (opts) => {
323
382
  try {
324
383
  const { loadSchema, saveSchema } = await Promise.resolve().then(() => require("./schema-cache-n7Gbhvsj.cjs"));
325
- const { formatToolsTable } = await Promise.resolve().then(() => require("./format-9NLBykEL.cjs"));
384
+ const { formatToolsTable } = await Promise.resolve().then(() => require("./format-BjZuYDr8.cjs"));
326
385
  const { visibleRemoteTools } = await Promise.resolve().then(() => require("./tool-visibility-C8F9Yoxy.cjs")).then((n) => n.tool_visibility_exports);
327
386
  const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
328
- const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-CqAzD519.cjs")).then((n) => n.client_exports);
387
+ const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-Ypw9BNbn.cjs")).then((n) => n.client_exports);
329
388
  const config = await loadConfig();
330
389
  const graphMcpEndpoint = resolveGraphMcpEndpoint(config);
331
390
  let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint);
@@ -373,7 +432,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
373
432
  assertPublicMcpToolName(tool);
374
433
  validatePublicMcpToolArguments(tool, args);
375
434
  if (tool === "wallet_balance") {
376
- const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
435
+ const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
377
436
  console.log(await getWalletBalanceText());
378
437
  return;
379
438
  }
@@ -395,7 +454,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
395
454
  } catch (err) {
396
455
  const { isMissingUsageStatusToolError, primitiveBackendUsageStatus, usageStatusText } = await Promise.resolve().then(() => require("./usage-status-BdwwgYsu.cjs")).then((n) => n.usage_status_exports);
397
456
  if (!isMissingUsageStatusToolError(err)) throw err;
398
- const { resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-CqAzD519.cjs")).then((n) => n.client_exports);
457
+ const { resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-Ypw9BNbn.cjs")).then((n) => n.client_exports);
399
458
  console.log(usageStatusText(primitiveBackendUsageStatus(resolveGraphMcpEndpoint(config))));
400
459
  }
401
460
  return;