chain-insights 0.22.3 → 0.24.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.
Files changed (109) hide show
  1. package/README.md +33 -42
  2. package/bin/cli.js +1 -1
  3. package/bin/install.cjs +1 -1
  4. package/dist/{capabilities-BZI6qROg.mjs → capabilities-BPnw6nP_.mjs} +20 -2
  5. package/dist/{capabilities-BZI6qROg.mjs.map → capabilities-BPnw6nP_.mjs.map} +1 -1
  6. package/dist/{capabilities-CPcrxodx.cjs → capabilities-EMRzwPBU.cjs} +19 -1
  7. package/dist/cli.cjs +82 -92
  8. package/dist/cli.mjs +82 -92
  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/{config-DYiUgdzg.cjs → config-B542AM4w.cjs} +2 -3
  14. package/dist/{config-DiQs0rQX.mjs → config-DbbPiGk0.mjs} +2 -3
  15. package/dist/{config-DiQs0rQX.mjs.map → config-DbbPiGk0.mjs.map} +1 -1
  16. package/dist/create-C0buxEfU.mjs +48 -0
  17. package/dist/create-C0buxEfU.mjs.map +1 -0
  18. package/dist/create-DdggkF04.cjs +69 -0
  19. package/dist/html-generator-BCDtYcGs.mjs +16 -0
  20. package/dist/{html-generator-D2BDzLED.mjs.map → html-generator-BCDtYcGs.mjs.map} +1 -1
  21. package/dist/html-generator-DFwMRWN3.cjs +16 -0
  22. package/dist/index.cjs +9 -11
  23. package/dist/index.d.cts +10 -99
  24. package/dist/index.d.cts.map +1 -1
  25. package/dist/index.d.mts +10 -99
  26. package/dist/index.d.mts.map +1 -1
  27. package/dist/index.mjs +7 -9
  28. package/dist/mcp-proxy.cjs +40 -161
  29. package/dist/mcp-proxy.d.cts.map +1 -1
  30. package/dist/mcp-proxy.d.mts.map +1 -1
  31. package/dist/mcp-proxy.mjs +40 -161
  32. package/dist/mcp-proxy.mjs.map +1 -1
  33. package/dist/{public-tools-BFs_7U_Z.cjs → public-tools-Bou25cki.cjs} +153 -5
  34. package/dist/{public-tools-BjqZGGAC.mjs → public-tools-CpOLkME5.mjs} +152 -4
  35. package/dist/public-tools-CpOLkME5.mjs.map +1 -0
  36. package/dist/{schema-v5cwychf.mjs → schema-B0OuHW_l.mjs} +63 -4
  37. package/dist/schema-B0OuHW_l.mjs.map +1 -0
  38. package/dist/{schema-DepyuUEP.cjs → schema-CtFWYoJz.cjs} +72 -7
  39. package/dist/{tool-visibility-DZBAP62b.cjs → tool-visibility-C8F9Yoxy.cjs} +1 -2
  40. package/dist/{tool-visibility-C0ALejXI.mjs → tool-visibility-CXbwfKhv.mjs} +2 -3
  41. package/dist/tool-visibility-CXbwfKhv.mjs.map +1 -0
  42. package/dist/{tools-lPY6k-vJ.cjs → tools-BHfphgy9.cjs} +4 -4
  43. package/dist/{tools-BKLnlBG1.mjs → tools-BRQAPF2R.mjs} +5 -5
  44. package/dist/tools-BRQAPF2R.mjs.map +1 -0
  45. package/dist/{topup-server-rqI7bqem.mjs → topup-server-BLdF1SFQ.mjs} +2 -2
  46. package/dist/topup-server-BLdF1SFQ.mjs.map +1 -0
  47. package/dist/{topup-server-DAqmAuu1.cjs → topup-server-YN3iHrHW.cjs} +1 -1
  48. package/dist/{update-CJUfGCxs.mjs → update-MsoEFbhn.mjs} +2 -36
  49. package/dist/{update-CJUfGCxs.mjs.map → update-MsoEFbhn.mjs.map} +1 -1
  50. package/dist/{update-BJoXYucO.cjs → update-RKd0UW90.cjs} +0 -35
  51. package/dist/{wallet-BEvHrHi3.cjs → wallet-B3hAr70M.cjs} +3 -3
  52. package/dist/{wallet-fMbhvKXT.mjs → wallet-COcm4oIb.mjs} +4 -4
  53. package/dist/wallet-COcm4oIb.mjs.map +1 -0
  54. package/docs/architecture.md +18 -49
  55. package/docs/contributing.md +0 -3
  56. package/docs/development.md +3 -5
  57. package/docs/graph-tools.md +7 -32
  58. package/docs/mcp-proxy.md +32 -47
  59. package/docs/stability.md +0 -12
  60. package/package.json +3 -4
  61. package/skills/chain-insights-address-risk/SKILL.md +0 -1
  62. package/dist/app-BHRl5oDo.cjs +0 -145
  63. package/dist/app-BeZyCVuz.mjs +0 -140
  64. package/dist/app-BeZyCVuz.mjs.map +0 -1
  65. package/dist/artifact-server-B8WKXtXr.cjs +0 -47
  66. package/dist/artifact-server-C1fETWsc.mjs +0 -49
  67. package/dist/artifact-server-C1fETWsc.mjs.map +0 -1
  68. package/dist/client-D4aM4bzP.mjs.map +0 -1
  69. package/dist/graph-normalizer-B2Q2lgVy.cjs +0 -130
  70. package/dist/graph-normalizer-BA3Rbd6l.mjs +0 -127
  71. package/dist/graph-normalizer-BA3Rbd6l.mjs.map +0 -1
  72. package/dist/graph-reports-B6yoYbPq.mjs +0 -63
  73. package/dist/graph-reports-B6yoYbPq.mjs.map +0 -1
  74. package/dist/graph-reports-_gqzxvvs.cjs +0 -64
  75. package/dist/html-generator-B9f_GIi2.cjs +0 -86
  76. package/dist/html-generator-D2BDzLED.mjs +0 -70
  77. package/dist/init-C3AVZHFb.cjs +0 -319
  78. package/dist/init-CO-PRYhT.mjs +0 -319
  79. package/dist/init-CO-PRYhT.mjs.map +0 -1
  80. package/dist/limits-D3Mn-gig.mjs +0 -94
  81. package/dist/limits-D3Mn-gig.mjs.map +0 -1
  82. package/dist/limits-km3pmmL3.cjs +0 -115
  83. package/dist/mcp-endpoint-Bd3SvCkg.mjs +0 -41
  84. package/dist/mcp-endpoint-Bd3SvCkg.mjs.map +0 -1
  85. package/dist/mcp-endpoint-DdIVQKW5.cjs +0 -56
  86. package/dist/output-root-BK4pdjyz.mjs +0 -36
  87. package/dist/output-root-BK4pdjyz.mjs.map +0 -1
  88. package/dist/output-root-BewoQaTx.cjs +0 -46
  89. package/dist/public-tools-BjqZGGAC.mjs.map +0 -1
  90. package/dist/resolve-port-CbaEoODz.cjs +0 -18
  91. package/dist/resolve-port-DxPK7Ipx.mjs +0 -20
  92. package/dist/resolve-port-DxPK7Ipx.mjs.map +0 -1
  93. package/dist/schema-v5cwychf.mjs.map +0 -1
  94. package/dist/server-BDmHAF1w.mjs +0 -46
  95. package/dist/server-BDmHAF1w.mjs.map +0 -1
  96. package/dist/server-BjprY9Ef.cjs +0 -55
  97. package/dist/templates/graph.html +0 -1450
  98. package/dist/tool-visibility-C0ALejXI.mjs.map +0 -1
  99. package/dist/tools-BKLnlBG1.mjs.map +0 -1
  100. package/dist/topup-server-rqI7bqem.mjs.map +0 -1
  101. package/dist/viz-BJ_kyRjI.cjs +0 -217
  102. package/dist/viz-Uh_EF-qB.mjs +0 -206
  103. package/dist/viz-Uh_EF-qB.mjs.map +0 -1
  104. package/dist/wallet-fMbhvKXT.mjs.map +0 -1
  105. package/docs/images/graph-mcp-iframe.png +0 -0
  106. package/docs/images/graph-visualization.png +0 -0
  107. package/docs/images/quickstart-demo.svg +0 -1
  108. package/docs/investigation-workspaces.md +0 -108
  109. package/docs/search-limits.md +0 -73
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");
@@ -50,9 +50,9 @@ function runInstaller(flag) {
50
50
  }
51
51
  }
52
52
  async function withGraphMcpClient(name, fn) {
53
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
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");
@@ -70,13 +70,26 @@ async function withGraphMcpClient(name, fn) {
70
70
  }
71
71
  }
72
72
  async function printNetworkCapabilities(opts) {
73
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
74
- const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-CPcrxodx.cjs")).then((n) => n.capabilities_exports);
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-EMRzwPBU.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 printNetworkCapability(name, opts) {
80
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
81
+ const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } = await Promise.resolve().then(() => require("./capabilities-EMRzwPBU.cjs")).then((n) => n.capabilities_exports);
82
+ const document = await fetchNetworkCapabilities(await loadConfig());
83
+ const network = findNetworkCapability(document, name);
84
+ if (!network) {
85
+ const available = document.networks.map((candidate) => candidate.network).join(", ");
86
+ const suffix = available ? ` Available networks: ${available}.` : "";
87
+ throw new Error(`Network "${name}" is not supported.${suffix} Run \`cia networks\` to list supported networks.`);
88
+ }
89
+ if (opts.json) console.log(JSON.stringify(network, null, 2));
90
+ else console.log(formatNetworkCapability(network));
91
+ }
92
+ program.command("networks").description("List supported graph networks, capability layers, and available tools").option("--json", "Print raw capability JSON").action(async (opts) => {
80
93
  try {
81
94
  await printNetworkCapabilities(opts);
82
95
  } catch (err) {
@@ -84,37 +97,25 @@ program.command("networks").alias("network").description("List supported graph n
84
97
  process.exit(1);
85
98
  }
86
99
  });
87
- program.command("serve").description("Start local visualization server").option("-p, --port <number>", "Port to bind (defaults to the configured serverPort)").action(async (opts) => {
100
+ 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) => {
88
101
  try {
89
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-BewoQaTx.cjs")).then((n) => n.output_root_exports);
90
- const workspaceRoot = requireWorkspaceRoot();
91
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
92
- const { resolveServerPort } = await Promise.resolve().then(() => require("./resolve-port-CbaEoODz.cjs"));
93
- const config = await loadConfig();
94
- const port = resolveServerPort(opts.port, config.serverPort);
95
- const { startServer } = await Promise.resolve().then(() => require("./server-BjprY9Ef.cjs")).then((n) => n.server_exports);
96
- console.log(`Workspace: ${workspaceRoot}`);
97
- startServer(port);
102
+ await printNetworkCapability(name, opts);
98
103
  } catch (err) {
99
104
  console.error(err.message);
100
105
  process.exit(1);
101
106
  }
102
107
  });
103
108
  program.command("status").description("Show toolkit status and configuration").action(async () => {
104
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
105
- const { findActiveWorkspace, activeDataDir } = await Promise.resolve().then(() => require("./active-Bc13hJIm.cjs")).then((n) => n.active_exports);
109
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
106
110
  const config = await loadConfig();
107
- const workspace = findActiveWorkspace();
108
111
  const graphMcpStatus = config.graphMcpMode === "debug" && config.graphMcpAuthToken?.trim() ? "bearer access mode" : `${config.graphMcpMode} mode`;
109
- console.log("Config: ", activeDataDir(config.dataDir));
110
- if (workspace) console.log("Workspace:", workspace.root);
111
- console.log("Server: ", `http://127.0.0.1:${config.serverPort}`);
112
+ console.log("Config: ", config.dataDir);
112
113
  console.log("Chain Insights Graph:", graphMcpStatus);
113
114
  console.log("Graph endpoint:", config.graphMcpEndpoint);
114
115
  });
115
116
  program.command("update").description("Check npmjs for a newer Chain Insights release and update this CLI").option("--check", "Only check for a newer release").option("--dry-run", "Print the update command without running it").action(async (opts) => {
116
117
  try {
117
- const { checkForUpdate, runPackageUpdate } = await Promise.resolve().then(() => require("./update-BJoXYucO.cjs"));
118
+ const { checkForUpdate, runPackageUpdate } = await Promise.resolve().then(() => require("./update-RKd0UW90.cjs"));
118
119
  const result = await checkForUpdate();
119
120
  if (result.error) throw new Error(`Could not check npmjs for updates: ${result.error}`);
120
121
  if (!result.updateAvailable || !result.latestVersion) {
@@ -139,7 +140,7 @@ program.command("update").description("Check npmjs for a newer Chain Insights re
139
140
  });
140
141
  program.command("debug").description("Configure Chain Insights Graph debug mode").addCommand(new commander.Command("on").description("Enable Chain Insights Graph debug mode without x402 payments").requiredOption("--token <token>", "Debug bearer token").option("--endpoint <url>", "Chain Insights Graph endpoint").action(async (opts) => {
141
142
  try {
142
- const { saveConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
143
+ const { saveConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
143
144
  await saveConfig({
144
145
  graphMcpMode: "debug",
145
146
  graphMcpAuthToken: opts.token,
@@ -154,7 +155,7 @@ program.command("debug").description("Configure Chain Insights Graph debug mode"
154
155
  }
155
156
  })).addCommand(new commander.Command("off").description("Disable Chain Insights Graph debug mode and use paid x402 calls").action(async () => {
156
157
  try {
157
- const { saveConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
158
+ const { saveConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
158
159
  await saveConfig({
159
160
  graphMcpMode: "paid",
160
161
  graphMcpAuthToken: ""
@@ -167,7 +168,7 @@ program.command("debug").description("Configure Chain Insights Graph debug mode"
167
168
  }
168
169
  })).addCommand(new commander.Command("status").description("Show Chain Insights Graph payment/debug mode").action(async () => {
169
170
  try {
170
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
171
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
171
172
  const config = await loadConfig();
172
173
  console.log(`Chain Insights Graph mode: ${config.graphMcpMode}`);
173
174
  console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
@@ -182,7 +183,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
182
183
  try {
183
184
  const normalizedKey = key.trim();
184
185
  if (!normalizedKey) throw new Error("Test access key is required");
185
- const { saveConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
186
+ const { saveConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
186
187
  await saveConfig({
187
188
  graphMcpMode: "debug",
188
189
  graphMcpAuthToken: normalizedKey,
@@ -197,7 +198,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
197
198
  }
198
199
  })).addCommand(new commander.Command("clear").description("Remove the Chain Insights Graph test access key and use paid x402 calls").action(async () => {
199
200
  try {
200
- const { saveConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
201
+ const { saveConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
201
202
  await saveConfig({
202
203
  graphMcpMode: "paid",
203
204
  graphMcpAuthToken: ""
@@ -210,7 +211,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
210
211
  }
211
212
  })).addCommand(new commander.Command("status").description("Show Chain Insights Graph test access key status").action(async () => {
212
213
  try {
213
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
214
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
214
215
  const config = await loadConfig();
215
216
  console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
216
217
  console.log(`Access key: ${config.graphMcpAuthToken?.trim() ? "configured" : "not configured"}`);
@@ -220,22 +221,6 @@ program.command("access-key").description("Configure Chain Insights Graph test a
220
221
  process.exit(1);
221
222
  }
222
223
  }));
223
- program.command("init").description("Initialize an investigation workspace").argument("[dir]", "Workspace directory to initialize", ".").option("--force", "Overwrite existing workspace files").action(async (dir, opts) => {
224
- try {
225
- const { initWorkspace } = await Promise.resolve().then(() => require("./init-C3AVZHFb.cjs"));
226
- const result = await initWorkspace({
227
- targetDir: dir,
228
- force: opts.force
229
- });
230
- console.log(`Workspace initialized: ${result.workspaceRoot}`);
231
- console.log(`Files written: ${result.filesWritten.length}`);
232
- const { maybePromptForUpdate } = await Promise.resolve().then(() => require("./update-BJoXYucO.cjs"));
233
- await maybePromptForUpdate();
234
- } catch (err) {
235
- console.error(err.message);
236
- process.exit(1);
237
- }
238
- });
239
224
  program.command("setup").description("Configure external MCP clients").addCommand(new commander.Command("claude-code").alias("claude").description("Install Claude Code skills and register the MCP proxy").action(() => {
240
225
  runInstaller("--claude");
241
226
  })).addCommand(new commander.Command("codex").description("Install Codex skills and register the MCP proxy").action(() => {
@@ -244,8 +229,8 @@ program.command("setup").description("Configure external MCP clients").addComman
244
229
  runInstaller("--hermes");
245
230
  }));
246
231
  program.command("config").description("Read or write configuration values").addCommand(new commander.Command("get").argument("<key>", "Config key to read").action(async (key) => {
247
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
248
- const { CONFIG_KEYS } = await Promise.resolve().then(() => require("./schema-DepyuUEP.cjs")).then((n) => n.schema_exports);
232
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
233
+ const { CONFIG_KEYS } = await Promise.resolve().then(() => require("./schema-CtFWYoJz.cjs")).then((n) => n.schema_exports);
249
234
  if (!CONFIG_KEYS.includes(key)) {
250
235
  console.error(`Unknown config key: ${key}`);
251
236
  process.exit(1);
@@ -255,7 +240,7 @@ program.command("config").description("Read or write configuration values").addC
255
240
  })).addCommand(new commander.Command("set").argument("<key>", "Config key to write").argument("<value>", "Value to set").action(async (key, value) => {
256
241
  if (key === "walletPrivateKey") {
257
242
  try {
258
- const { setWalletPrivateKey } = await Promise.resolve().then(() => require("./wallet-BEvHrHi3.cjs")).then((n) => n.wallet_exports);
243
+ const { setWalletPrivateKey } = await Promise.resolve().then(() => require("./wallet-B3hAr70M.cjs")).then((n) => n.wallet_exports);
259
244
  const address = await setWalletPrivateKey(value);
260
245
  console.log("Wallet private key encrypted and stored in ~/.chain-insights/wallet.json");
261
246
  console.log(`Wallet address: ${address}`);
@@ -265,8 +250,8 @@ program.command("config").description("Read or write configuration values").addC
265
250
  }
266
251
  return;
267
252
  }
268
- const { loadConfig, saveConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
269
- const { CONFIG_KEYS, DEFAULT_CONFIG } = await Promise.resolve().then(() => require("./schema-DepyuUEP.cjs")).then((n) => n.schema_exports);
253
+ const { loadConfig, saveConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
254
+ const { CONFIG_KEYS, DEFAULT_CONFIG } = await Promise.resolve().then(() => require("./schema-CtFWYoJz.cjs")).then((n) => n.schema_exports);
270
255
  const current = await loadConfig();
271
256
  if (!CONFIG_KEYS.includes(key)) {
272
257
  console.error(`Unknown config key: ${key}`);
@@ -279,21 +264,52 @@ program.command("config").description("Read or write configuration values").addC
279
264
  const displayed = key.toLowerCase().includes("token") ? "[redacted]" : coerced;
280
265
  console.log(`Set ${key} = ${displayed}`);
281
266
  }));
282
- 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) => {
267
+ 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 () => {
283
268
  try {
284
- const { setWalletPrivateKey, isWalletConfigured } = await Promise.resolve().then(() => require("./wallet-BEvHrHi3.cjs")).then((n) => n.wallet_exports);
269
+ const { isWalletConfigured, setWalletPrivateKey, walletPath } = await Promise.resolve().then(() => require("./wallet-B3hAr70M.cjs")).then((n) => n.wallet_exports);
270
+ const { createInterface } = await import("node:readline/promises");
271
+ const { formatWalletBackupWarning, generateWalletPrivateKey, isWalletBackupConfirmed } = await Promise.resolve().then(() => require("./create-DdggkF04.cjs")).then((n) => n.create_exports);
272
+ 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.");
273
+ const privateKey = generateWalletPrivateKey();
274
+ const color = process.stderr.isTTY === true && process.env["NO_COLOR"] === void 0;
275
+ process.stderr.write(`${formatWalletBackupWarning(privateKey, { color })}\n`);
276
+ const prompt = createInterface({
277
+ input: process.stdin,
278
+ output: process.stderr
279
+ });
280
+ let answer;
281
+ try {
282
+ answer = await prompt.question("> ");
283
+ } finally {
284
+ prompt.close();
285
+ }
286
+ process.stderr.write("\n");
287
+ if (!isWalletBackupConfirmed(answer)) throw new Error("Wallet creation cancelled. The wallet was not saved.");
288
+ const address = await setWalletPrivateKey(privateKey);
289
+ console.log(`Wallet created: ${address}`);
290
+ console.log(`Encrypted local copy: ${walletPath()}`);
291
+ console.log("Next: cia wallet ready");
292
+ } catch (err) {
293
+ console.error(err.message);
294
+ process.exit(1);
295
+ }
296
+ })).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) => {
297
+ try {
298
+ const { setWalletPrivateKey, isWalletConfigured } = await Promise.resolve().then(() => require("./wallet-B3hAr70M.cjs")).then((n) => n.wallet_exports);
285
299
  const replacing = opts.force === true && await isWalletConfigured();
286
300
  const address = await setWalletPrivateKey(privateKey, { force: opts.force });
287
301
  if (replacing) console.log("Previous wallet key backed up next to ~/.chain-insights/wallet.json");
288
302
  console.log(`Wallet imported: ${address}`);
289
- console.log("Next: run `chain-insights wallet ready`");
303
+ console.log("Keep your original private key backed up securely; it cannot be recovered from the encrypted local copy.");
304
+ console.log("Encrypted local copy: ~/.chain-insights/wallet.json");
305
+ console.log("Next: cia wallet ready");
290
306
  } catch (err) {
291
307
  console.error(err.message);
292
308
  process.exit(1);
293
309
  }
294
310
  })).addCommand(new commander.Command("address").description("Print the local payment wallet address").action(async () => {
295
311
  try {
296
- const { getWalletAccount } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
312
+ const { getWalletAccount } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
297
313
  const account = await getWalletAccount();
298
314
  console.log(account.address);
299
315
  } catch (err) {
@@ -302,7 +318,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
302
318
  }
303
319
  })).addCommand(new commander.Command("balance").description("Show the local payment wallet Base USDC balance").action(async () => {
304
320
  try {
305
- const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
321
+ const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
306
322
  console.log(await getWalletBalanceText());
307
323
  } catch (err) {
308
324
  console.error(err.message);
@@ -310,7 +326,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
310
326
  }
311
327
  })).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) => {
312
328
  try {
313
- const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
329
+ const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
314
330
  const result = await prepareWalletForPaidCalls({
315
331
  minimumApprovalUnits: parsePaymentApprovalUnits(opts.paymentUsdc ?? opts.approvalUsdc ?? "1"),
316
332
  approve: opts.checkOnly ? false : opts.approve !== false
@@ -326,8 +342,8 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
326
342
  }
327
343
  })).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) => {
328
344
  try {
329
- const { buildTopupInfo, getWalletAccount } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
330
- const { startTopupServer } = await Promise.resolve().then(() => require("./topup-server-DAqmAuu1.cjs")).then((n) => n.topup_server_exports);
345
+ const { buildTopupInfo, getWalletAccount } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
346
+ const { startTopupServer } = await Promise.resolve().then(() => require("./topup-server-YN3iHrHW.cjs")).then((n) => n.topup_server_exports);
331
347
  const account = await getWalletAccount();
332
348
  const url = await startTopupServer(account);
333
349
  const info = buildTopupInfo(account.address, url);
@@ -359,9 +375,9 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
359
375
  try {
360
376
  const { loadSchema, saveSchema } = await Promise.resolve().then(() => require("./schema-cache-n7Gbhvsj.cjs"));
361
377
  const { formatToolsTable } = await Promise.resolve().then(() => require("./format-9NLBykEL.cjs"));
362
- const { visibleRemoteTools } = await Promise.resolve().then(() => require("./tool-visibility-DZBAP62b.cjs")).then((n) => n.tool_visibility_exports);
363
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
364
- const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-CqAzD519.cjs")).then((n) => n.client_exports);
378
+ const { visibleRemoteTools } = await Promise.resolve().then(() => require("./tool-visibility-C8F9Yoxy.cjs")).then((n) => n.tool_visibility_exports);
379
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-B542AM4w.cjs")).then((n) => n.config_exports);
380
+ const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-Ypw9BNbn.cjs")).then((n) => n.client_exports);
365
381
  const config = await loadConfig();
366
382
  const graphMcpEndpoint = resolveGraphMcpEndpoint(config);
367
383
  let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint);
@@ -389,7 +405,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
389
405
  })).addCommand(new commander.Command("aml-address-risk").description("Screen an address for AML risk, exchange behavior, and optional comparison with another address").requiredOption("--address <address>", "Full blockchain address to screen").requiredOption("--network <network>", "Network to query. Run `cia mcp networks` for supported networks.").option("--compare-address <address>", "Optional second address to compare against the screened address").action(async (opts) => {
390
406
  try {
391
407
  await withGraphMcpClient("chain-insights-cli-aml-address-risk", async (client) => {
392
- const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-BFs_7U_Z.cjs"));
408
+ const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-Bou25cki.cjs"));
393
409
  const result = await addressRisk(client, {
394
410
  address: opts.address,
395
411
  network: opts.network,
@@ -404,12 +420,12 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
404
420
  })).addCommand(new commander.Command("call").description("Call an MCP tool directly (debug)").argument("<tool>", "Tool name to call").argument("[args...]", "Key=value arguments (e.g. address=0x1234... network=robinhood)").action(async (tool, rawArgs) => {
405
421
  try {
406
422
  const { parseMcpCallArgs } = await Promise.resolve().then(() => require("./call-args-DAiQSDmD.cjs"));
407
- const { assertPublicMcpToolName, validatePublicMcpToolArguments } = await Promise.resolve().then(() => require("./tool-visibility-DZBAP62b.cjs")).then((n) => n.tool_visibility_exports);
423
+ const { assertPublicMcpToolName, validatePublicMcpToolArguments } = await Promise.resolve().then(() => require("./tool-visibility-C8F9Yoxy.cjs")).then((n) => n.tool_visibility_exports);
408
424
  const args = parseMcpCallArgs(rawArgs);
409
425
  assertPublicMcpToolName(tool);
410
426
  validatePublicMcpToolArguments(tool, args);
411
427
  if (tool === "wallet_balance") {
412
- const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
428
+ const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-BHfphgy9.cjs")).then((n) => n.tools_exports);
413
429
  console.log(await getWalletBalanceText());
414
430
  return;
415
431
  }
@@ -431,13 +447,13 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
431
447
  } catch (err) {
432
448
  const { isMissingUsageStatusToolError, primitiveBackendUsageStatus, usageStatusText } = await Promise.resolve().then(() => require("./usage-status-BdwwgYsu.cjs")).then((n) => n.usage_status_exports);
433
449
  if (!isMissingUsageStatusToolError(err)) throw err;
434
- const { resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-CqAzD519.cjs")).then((n) => n.client_exports);
450
+ const { resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-Ypw9BNbn.cjs")).then((n) => n.client_exports);
435
451
  console.log(usageStatusText(primitiveBackendUsageStatus(resolveGraphMcpEndpoint(config))));
436
452
  }
437
453
  return;
438
454
  }
439
455
  if (tool === "aml_address_risk") {
440
- const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-BFs_7U_Z.cjs"));
456
+ const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-Bou25cki.cjs"));
441
457
  const result = await addressRisk(client, {
442
458
  address: String(args["address"] ?? ""),
443
459
  network: String(args["network"] ?? ""),
@@ -456,32 +472,6 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
456
472
  process.exit(1);
457
473
  }
458
474
  }));
459
- program.command("viz").description("Generate a workspace visualization").argument("[source-id]", "Workspace graph report ID to render").option("--data <file>", "Raw transaction JSON file for ad-hoc visualization").option("-p, --port <number>", "Server port (defaults to the configured serverPort)").action(async (sourceId, opts) => {
460
- try {
461
- if (!sourceId && !opts.data) {
462
- console.error("Provide either a visualization source ID or --data <file.json>");
463
- process.exit(1);
464
- }
465
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DYiUgdzg.cjs")).then((n) => n.config_exports);
466
- const { resolveServerPort } = await Promise.resolve().then(() => require("./resolve-port-CbaEoODz.cjs"));
467
- const config = await loadConfig();
468
- const port = resolveServerPort(opts.port, config.serverPort);
469
- const { generateVisualization } = await Promise.resolve().then(() => require("./viz-BJ_kyRjI.cjs")).then((n) => n.viz_exports);
470
- const result = await generateVisualization({
471
- sourceId,
472
- dataFile: opts.data
473
- });
474
- const { startServer } = await Promise.resolve().then(() => require("./server-BjprY9Ef.cjs")).then((n) => n.server_exports);
475
- startServer(port);
476
- const url = `http://127.0.0.1:${port}/viz/${result.vizId}`;
477
- console.log(`Visualization: ${url}`);
478
- const open = (await import("open")).default;
479
- await open(url);
480
- } catch (err) {
481
- console.error(err.message);
482
- process.exit(1);
483
- }
484
- });
485
475
  program.parseAsync(process.argv).catch((err) => {
486
476
  console.error(err.message);
487
477
  process.exit(1);