chain-insights 0.19.0 → 0.22.2

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 (138) hide show
  1. package/README.md +44 -121
  2. package/bin/cli.js +4 -4
  3. package/bin/install.cjs +137 -113
  4. package/bin/mcp-proxy.cjs +7 -5
  5. package/dist/{action-log-Dfe88TwV.cjs → action-log-HniMMF7f.cjs} +1 -1
  6. package/dist/action-log-diTHyMbV.mjs.map +1 -1
  7. package/dist/active-BQopLul8.mjs.map +1 -1
  8. package/dist/{active-Bj6dohpc.cjs → active-Bc13hJIm.cjs} +1 -1
  9. package/dist/{app-CJwx_2Rr.mjs → app-7NRCqx_Q.mjs} +2 -2
  10. package/dist/app-7NRCqx_Q.mjs.map +1 -0
  11. package/dist/{app-D4Cm69ob.cjs → app-l9JE6bt3.cjs} +5 -5
  12. package/dist/{artifact-server-sJBFGcum.cjs → artifact-server-CH-asxF5.cjs} +3 -2
  13. package/dist/{artifact-server-D1D-_t5l.mjs → artifact-server-DoxJr0z8.mjs} +4 -3
  14. package/dist/artifact-server-DoxJr0z8.mjs.map +1 -0
  15. package/dist/{capabilities-CxvK7LKZ.mjs → capabilities-BZI6qROg.mjs} +2 -2
  16. package/dist/capabilities-BZI6qROg.mjs.map +1 -0
  17. package/dist/{capabilities-CZYijWbg.cjs → capabilities-CPcrxodx.cjs} +2 -2
  18. package/dist/cli.cjs +42 -216
  19. package/dist/cli.mjs +36 -210
  20. package/dist/cli.mjs.map +1 -1
  21. package/dist/{client-Bjxo7AEa.cjs → client-CqAzD519.cjs} +4 -4
  22. package/dist/{client-i3WtsKA4.mjs → client-D4aM4bzP.mjs} +4 -4
  23. package/dist/client-D4aM4bzP.mjs.map +1 -0
  24. package/dist/{config-DE0dUT3P.cjs → config-BVFf3v8-.cjs} +2 -2
  25. package/dist/{config-DA6KRx60.mjs → config-CnNMdt4M.mjs} +2 -2
  26. package/dist/config-CnNMdt4M.mjs.map +1 -0
  27. package/dist/graph-normalizer-BA3Rbd6l.mjs.map +1 -1
  28. package/dist/graph-reports-B6yoYbPq.mjs.map +1 -1
  29. package/dist/{graph-reports-DSHSp5HL.cjs → graph-reports-_gqzxvvs.cjs} +2 -2
  30. package/dist/{html-generator-Ui29DLSD.cjs → html-generator-B9f_GIi2.cjs} +4 -3
  31. package/dist/{html-generator-ClysZjfY.mjs → html-generator-D2BDzLED.mjs} +3 -2
  32. package/dist/{html-generator-ClysZjfY.mjs.map → html-generator-D2BDzLED.mjs.map} +1 -1
  33. package/dist/index.cjs +9 -9
  34. package/dist/index.d.cts +3 -0
  35. package/dist/index.d.cts.map +1 -1
  36. package/dist/index.d.mts +3 -0
  37. package/dist/index.d.mts.map +1 -1
  38. package/dist/index.mjs +9 -9
  39. package/dist/{init-BT3STWBv.mjs → init-Djhml4ih.mjs} +3 -3
  40. package/dist/init-Djhml4ih.mjs.map +1 -0
  41. package/dist/{init-BR4SRTAY.cjs → init-DvrKxK15.cjs} +3 -3
  42. package/dist/limits-D3Mn-gig.mjs.map +1 -1
  43. package/dist/mcp-endpoint-DbWtLcba.mjs.map +1 -1
  44. package/dist/mcp-proxy.cjs +19 -18
  45. package/dist/mcp-proxy.d.cts.map +1 -1
  46. package/dist/mcp-proxy.d.mts.map +1 -1
  47. package/dist/mcp-proxy.mjs +13 -12
  48. package/dist/mcp-proxy.mjs.map +1 -1
  49. package/dist/{merge-CJRZpuZ4.mjs → merge-BZw-pMPN.mjs} +2 -2
  50. package/dist/merge-BZw-pMPN.mjs.map +1 -0
  51. package/dist/{merge-B_5kxbGv.cjs → merge-C52eaAGU.cjs} +1 -1
  52. package/dist/{output-root-C1PFNCqb.cjs → output-root-BewoQaTx.cjs} +2 -2
  53. package/dist/{public-tools-CgiKgYgf.cjs → public-tools-BFs_7U_Z.cjs} +8 -7
  54. package/dist/{public-tools-B9_wXs2o.mjs → public-tools-BjqZGGAC.mjs} +7 -6
  55. package/dist/public-tools-BjqZGGAC.mjs.map +1 -0
  56. package/dist/{rolldown-runtime-DakpK96I.cjs → rolldown-runtime-C0BPl7ul.cjs} +1 -1
  57. package/dist/{schema-DF0aOXII.cjs → schema-BpeV3xDV.cjs} +5 -2
  58. package/dist/{schema-0BVyF-aL.mjs → schema-DOJA2nNi.mjs} +5 -2
  59. package/dist/schema-DOJA2nNi.mjs.map +1 -0
  60. package/dist/{schema-cache-DwDvPy4e.mjs → schema-cache-DJdU4MIP.mjs} +2 -2
  61. package/dist/{schema-cache-DwDvPy4e.mjs.map → schema-cache-DJdU4MIP.mjs.map} +1 -1
  62. package/dist/{schema-cache-CX0r2UQp.cjs → schema-cache-n7Gbhvsj.cjs} +2 -2
  63. package/dist/{server-ta1oyJ2a.cjs → server-CmvzYu7v.cjs} +4 -3
  64. package/dist/{server-BXj6BRI1.mjs → server-mDSRgk1X.mjs} +4 -3
  65. package/dist/server-mDSRgk1X.mjs.map +1 -0
  66. package/dist/tool-visibility-C0ALejXI.mjs.map +1 -1
  67. package/dist/{tool-visibility-DMIEexib.cjs → tool-visibility-DZBAP62b.cjs} +1 -1
  68. package/dist/{tools-CWwX4yth.mjs → tools-BKLnlBG1.mjs} +8 -6
  69. package/dist/tools-BKLnlBG1.mjs.map +1 -0
  70. package/dist/{tools-BPfUpCUR.cjs → tools-lPY6k-vJ.cjs} +8 -6
  71. package/dist/{topup-server-VGl8-Fz5.cjs → topup-server-DAqmAuu1.cjs} +23 -21
  72. package/dist/{topup-server-D2X7My7i.mjs → topup-server-rqI7bqem.mjs} +23 -21
  73. package/dist/topup-server-rqI7bqem.mjs.map +1 -0
  74. package/dist/update-CJUfGCxs.mjs.map +1 -1
  75. package/dist/{usage-status-H1xgCu99.cjs → usage-status-BdwwgYsu.cjs} +2 -2
  76. package/dist/{usage-status-D2uosC7s.mjs → usage-status-CHiOPA-2.mjs} +2 -2
  77. package/dist/usage-status-CHiOPA-2.mjs.map +1 -0
  78. package/dist/version-BA3J8hu4.mjs.map +1 -1
  79. package/dist/{viz-HSwLcKr6.cjs → viz-BJ_kyRjI.cjs} +7 -5
  80. package/dist/{viz-Cq1jSWSH.mjs → viz-Uh_EF-qB.mjs} +6 -4
  81. package/dist/viz-Uh_EF-qB.mjs.map +1 -0
  82. package/dist/{wallet-C2yVjcSY.cjs → wallet-BEvHrHi3.cjs} +3 -2
  83. package/dist/{wallet-BrTTnf7w.mjs → wallet-fMbhvKXT.mjs} +3 -2
  84. package/dist/wallet-fMbhvKXT.mjs.map +1 -0
  85. package/docs/architecture.md +18 -18
  86. package/docs/debugging.md +2 -42
  87. package/docs/development.md +0 -27
  88. package/docs/graph-query-compatibility.md +66 -57
  89. package/docs/graph-tools.md +6 -6
  90. package/docs/investigation-workspaces.md +0 -35
  91. package/docs/mcp-proxy.md +8 -9
  92. package/docs/search-limits.md +8 -8
  93. package/docs/stability.md +4 -5
  94. package/package.json +1 -5
  95. package/skills/chain-insights-cypher/SKILL.md +7 -7
  96. package/skills/chain-insights-cypher/agents/openai.yaml +3 -3
  97. package/skills/chain-insights-schema-bittensor/SKILL.md +26 -26
  98. package/skills/chain-insights-schema-evm/SKILL.md +37 -37
  99. package/dist/app-CJwx_2Rr.mjs.map +0 -1
  100. package/dist/artifact-server-D1D-_t5l.mjs.map +0 -1
  101. package/dist/capabilities-CxvK7LKZ.mjs.map +0 -1
  102. package/dist/cases-C1XewLdx.mjs +0 -155
  103. package/dist/cases-C1XewLdx.mjs.map +0 -1
  104. package/dist/cases-CVtc7Rf8.cjs +0 -160
  105. package/dist/client-i3WtsKA4.mjs.map +0 -1
  106. package/dist/config-CwIb-tav.mjs +0 -33
  107. package/dist/config-CwIb-tav.mjs.map +0 -1
  108. package/dist/config-Cy-qzx4W.cjs +0 -33
  109. package/dist/config-DA6KRx60.mjs.map +0 -1
  110. package/dist/init-9jY5rCcH.cjs +0 -24
  111. package/dist/init-BT3STWBv.mjs.map +0 -1
  112. package/dist/init-BiRfMQcA.mjs +0 -26
  113. package/dist/init-BiRfMQcA.mjs.map +0 -1
  114. package/dist/lock-Cs-a3Ng1.cjs +0 -38
  115. package/dist/lock-D_sWGS7W.mjs +0 -40
  116. package/dist/lock-D_sWGS7W.mjs.map +0 -1
  117. package/dist/merge-CJRZpuZ4.mjs.map +0 -1
  118. package/dist/paths-CffVTUCv.cjs +0 -31
  119. package/dist/paths-_3isihzD.mjs +0 -21
  120. package/dist/paths-_3isihzD.mjs.map +0 -1
  121. package/dist/public-tools-B9_wXs2o.mjs.map +0 -1
  122. package/dist/render-TmSq0f4f.cjs +0 -207
  123. package/dist/render-mxE0Tdsf.mjs +0 -206
  124. package/dist/render-mxE0Tdsf.mjs.map +0 -1
  125. package/dist/report-BFXFrJmj.mjs +0 -36
  126. package/dist/report-BFXFrJmj.mjs.map +0 -1
  127. package/dist/report-BwKQqOCR.cjs +0 -36
  128. package/dist/runner-CSss8Hvy.mjs +0 -33
  129. package/dist/runner-CSss8Hvy.mjs.map +0 -1
  130. package/dist/runner-aErdz2zn.cjs +0 -31
  131. package/dist/schema-0BVyF-aL.mjs.map +0 -1
  132. package/dist/server-BXj6BRI1.mjs.map +0 -1
  133. package/dist/tools-CWwX4yth.mjs.map +0 -1
  134. package/dist/topup-server-D2X7My7i.mjs.map +0 -1
  135. package/dist/usage-status-D2uosC7s.mjs.map +0 -1
  136. package/dist/viz-Cq1jSWSH.mjs.map +0 -1
  137. package/dist/wallet-BrTTnf7w.mjs.map +0 -1
  138. package/docs/monitoring.md +0 -277
package/dist/cli.mjs CHANGED
@@ -48,9 +48,9 @@ function runInstaller(flag) {
48
48
  }
49
49
  }
50
50
  async function withGraphMcpClient(name, fn) {
51
- const { loadConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
51
+ const { loadConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
52
52
  const config = await loadConfig();
53
- const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-i3WtsKA4.mjs").then((n) => n.r);
53
+ const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-D4aM4bzP.mjs").then((n) => n.r);
54
54
  const paymentFetch = await createConfiguredGraphMcpFetch(config);
55
55
  const { Client } = await import("@modelcontextprotocol/sdk/client/index.js");
56
56
  const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
@@ -68,8 +68,8 @@ async function withGraphMcpClient(name, fn) {
68
68
  }
69
69
  }
70
70
  async function printNetworkCapabilities(opts) {
71
- const { loadConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
72
- const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import("./capabilities-CxvK7LKZ.mjs").then((n) => n.t);
71
+ const { loadConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
72
+ const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import("./capabilities-BZI6qROg.mjs").then((n) => n.t);
73
73
  const document = await fetchNetworkCapabilities(await loadConfig());
74
74
  if (opts.json) console.log(JSON.stringify(document, null, 2));
75
75
  else console.log(formatNetworkCapabilities(document));
@@ -86,11 +86,11 @@ program.command("serve").description("Start local visualization server").option(
86
86
  try {
87
87
  const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
88
88
  const workspaceRoot = requireWorkspaceRoot();
89
- const { loadConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
89
+ const { loadConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
90
90
  const { resolveServerPort } = await import("./resolve-port-DxPK7Ipx.mjs");
91
91
  const config = await loadConfig();
92
92
  const port = resolveServerPort(opts.port, config.serverPort);
93
- const { startServer } = await import("./server-BXj6BRI1.mjs").then((n) => n.t);
93
+ const { startServer } = await import("./server-mDSRgk1X.mjs").then((n) => n.t);
94
94
  console.log(`Workspace: ${workspaceRoot}`);
95
95
  startServer(port);
96
96
  } catch (err) {
@@ -99,7 +99,7 @@ program.command("serve").description("Start local visualization server").option(
99
99
  }
100
100
  });
101
101
  program.command("status").description("Show toolkit status and configuration").action(async () => {
102
- const { loadConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
102
+ const { loadConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
103
103
  const { findActiveWorkspace, activeDataDir } = await import("./active-BQopLul8.mjs").then((n) => n.t);
104
104
  const config = await loadConfig();
105
105
  const workspace = findActiveWorkspace();
@@ -137,7 +137,7 @@ program.command("update").description("Check npmjs for a newer Chain Insights re
137
137
  });
138
138
  program.command("debug").description("Configure Chain Insights Graph debug mode").addCommand(new 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) => {
139
139
  try {
140
- const { saveConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
140
+ const { saveConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
141
141
  await saveConfig({
142
142
  graphMcpMode: "debug",
143
143
  graphMcpAuthToken: opts.token,
@@ -152,7 +152,7 @@ program.command("debug").description("Configure Chain Insights Graph debug mode"
152
152
  }
153
153
  })).addCommand(new Command("off").description("Disable Chain Insights Graph debug mode and use paid x402 calls").action(async () => {
154
154
  try {
155
- const { saveConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
155
+ const { saveConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
156
156
  await saveConfig({
157
157
  graphMcpMode: "paid",
158
158
  graphMcpAuthToken: ""
@@ -165,7 +165,7 @@ program.command("debug").description("Configure Chain Insights Graph debug mode"
165
165
  }
166
166
  })).addCommand(new Command("status").description("Show Chain Insights Graph payment/debug mode").action(async () => {
167
167
  try {
168
- const { loadConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
168
+ const { loadConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
169
169
  const config = await loadConfig();
170
170
  console.log(`Chain Insights Graph mode: ${config.graphMcpMode}`);
171
171
  console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
@@ -180,7 +180,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
180
180
  try {
181
181
  const normalizedKey = key.trim();
182
182
  if (!normalizedKey) throw new Error("Test access key is required");
183
- const { saveConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
183
+ const { saveConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
184
184
  await saveConfig({
185
185
  graphMcpMode: "debug",
186
186
  graphMcpAuthToken: normalizedKey,
@@ -195,7 +195,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
195
195
  }
196
196
  })).addCommand(new Command("clear").description("Remove the Chain Insights Graph test access key and use paid x402 calls").action(async () => {
197
197
  try {
198
- const { saveConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
198
+ const { saveConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
199
199
  await saveConfig({
200
200
  graphMcpMode: "paid",
201
201
  graphMcpAuthToken: ""
@@ -208,7 +208,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
208
208
  }
209
209
  })).addCommand(new Command("status").description("Show Chain Insights Graph test access key status").action(async () => {
210
210
  try {
211
- const { loadConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
211
+ const { loadConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
212
212
  const config = await loadConfig();
213
213
  console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
214
214
  console.log(`Access key: ${config.graphMcpAuthToken?.trim() ? "configured" : "not configured"}`);
@@ -220,7 +220,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
220
220
  }));
221
221
  program.command("init").description("Initialize an investigation workspace").argument("[dir]", "Workspace directory to initialize", ".").option("--force", "Overwrite existing workspace files").action(async (dir, opts) => {
222
222
  try {
223
- const { initWorkspace } = await import("./init-BT3STWBv.mjs");
223
+ const { initWorkspace } = await import("./init-Djhml4ih.mjs");
224
224
  const result = await initWorkspace({
225
225
  targetDir: dir,
226
226
  force: opts.force
@@ -242,8 +242,8 @@ program.command("setup").description("Configure external MCP clients").addComman
242
242
  runInstaller("--hermes");
243
243
  }));
244
244
  program.command("config").description("Read or write configuration values").addCommand(new Command("get").argument("<key>", "Config key to read").action(async (key) => {
245
- const { loadConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
246
- const { CONFIG_KEYS } = await import("./schema-0BVyF-aL.mjs").then((n) => n.r);
245
+ const { loadConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
246
+ const { CONFIG_KEYS } = await import("./schema-DOJA2nNi.mjs").then((n) => n.r);
247
247
  if (!CONFIG_KEYS.includes(key)) {
248
248
  console.error(`Unknown config key: ${key}`);
249
249
  process.exit(1);
@@ -253,7 +253,7 @@ program.command("config").description("Read or write configuration values").addC
253
253
  })).addCommand(new Command("set").argument("<key>", "Config key to write").argument("<value>", "Value to set").action(async (key, value) => {
254
254
  if (key === "walletPrivateKey") {
255
255
  try {
256
- const { setWalletPrivateKey } = await import("./wallet-BrTTnf7w.mjs").then((n) => n.s);
256
+ const { setWalletPrivateKey } = await import("./wallet-fMbhvKXT.mjs").then((n) => n.s);
257
257
  const address = await setWalletPrivateKey(value);
258
258
  console.log("Wallet private key encrypted and stored in ~/.chain-insights/wallet.json");
259
259
  console.log(`Wallet address: ${address}`);
@@ -263,8 +263,8 @@ program.command("config").description("Read or write configuration values").addC
263
263
  }
264
264
  return;
265
265
  }
266
- const { loadConfig, saveConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
267
- const { CONFIG_KEYS, DEFAULT_CONFIG } = await import("./schema-0BVyF-aL.mjs").then((n) => n.r);
266
+ const { loadConfig, saveConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
267
+ const { CONFIG_KEYS, DEFAULT_CONFIG } = await import("./schema-DOJA2nNi.mjs").then((n) => n.r);
268
268
  const current = await loadConfig();
269
269
  if (!CONFIG_KEYS.includes(key)) {
270
270
  console.error(`Unknown config key: ${key}`);
@@ -279,7 +279,7 @@ program.command("config").description("Read or write configuration values").addC
279
279
  }));
280
280
  program.command("wallet").description("Manage the local Base USDC payment wallet").addCommand(new 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) => {
281
281
  try {
282
- const { setWalletPrivateKey, isWalletConfigured } = await import("./wallet-BrTTnf7w.mjs").then((n) => n.s);
282
+ const { setWalletPrivateKey, isWalletConfigured } = await import("./wallet-fMbhvKXT.mjs").then((n) => n.s);
283
283
  const replacing = opts.force === true && await isWalletConfigured();
284
284
  const address = await setWalletPrivateKey(privateKey, { force: opts.force });
285
285
  if (replacing) console.log("Previous wallet key backed up next to ~/.chain-insights/wallet.json");
@@ -291,7 +291,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
291
291
  }
292
292
  })).addCommand(new Command("address").description("Print the local payment wallet address").action(async () => {
293
293
  try {
294
- const { getWalletAccount } = await import("./tools-CWwX4yth.mjs").then((n) => n.p);
294
+ const { getWalletAccount } = await import("./tools-BKLnlBG1.mjs").then((n) => n.p);
295
295
  const account = await getWalletAccount();
296
296
  console.log(account.address);
297
297
  } catch (err) {
@@ -300,7 +300,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
300
300
  }
301
301
  })).addCommand(new Command("balance").description("Show the local payment wallet Base USDC balance").action(async () => {
302
302
  try {
303
- const { getWalletBalanceText } = await import("./tools-CWwX4yth.mjs").then((n) => n.p);
303
+ const { getWalletBalanceText } = await import("./tools-BKLnlBG1.mjs").then((n) => n.p);
304
304
  console.log(await getWalletBalanceText());
305
305
  } catch (err) {
306
306
  console.error(err.message);
@@ -308,7 +308,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
308
308
  }
309
309
  })).addCommand(new 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 Option("--no-approve", "Deprecated alias for --check-only").hideHelp()).option("--payment-usdc <amount>", "USDC setup cap to prepare for paid calls", "1").addOption(new Option("--approval-usdc <amount>", "Deprecated alias for --payment-usdc").hideHelp()).option("--json", "Print machine-readable readiness metadata").action(async (opts) => {
310
310
  try {
311
- const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await import("./tools-CWwX4yth.mjs").then((n) => n.p);
311
+ const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await import("./tools-BKLnlBG1.mjs").then((n) => n.p);
312
312
  const result = await prepareWalletForPaidCalls({
313
313
  minimumApprovalUnits: parsePaymentApprovalUnits(opts.paymentUsdc ?? opts.approvalUsdc ?? "1"),
314
314
  approve: opts.checkOnly ? false : opts.approve !== false
@@ -324,8 +324,8 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
324
324
  }
325
325
  })).addCommand(new 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) => {
326
326
  try {
327
- const { buildTopupInfo, getWalletAccount } = await import("./tools-CWwX4yth.mjs").then((n) => n.p);
328
- const { startTopupServer } = await import("./topup-server-D2X7My7i.mjs").then((n) => n.r);
327
+ const { buildTopupInfo, getWalletAccount } = await import("./tools-BKLnlBG1.mjs").then((n) => n.p);
328
+ const { startTopupServer } = await import("./topup-server-rqI7bqem.mjs").then((n) => n.r);
329
329
  const account = await getWalletAccount();
330
330
  const url = await startTopupServer(account);
331
331
  const info = buildTopupInfo(account.address, url);
@@ -355,11 +355,11 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
355
355
  }
356
356
  })).addCommand(new Command("tools").description("List available MCP tools (cached 24h)").option("--refresh", "Force refresh schema cache").action(async (opts) => {
357
357
  try {
358
- const { loadSchema, saveSchema } = await import("./schema-cache-DwDvPy4e.mjs");
358
+ const { loadSchema, saveSchema } = await import("./schema-cache-DJdU4MIP.mjs");
359
359
  const { formatToolsTable } = await import("./format-Bq94jSyw.mjs");
360
360
  const { visibleRemoteTools } = await import("./tool-visibility-C0ALejXI.mjs").then((n) => n.i);
361
- const { loadConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
362
- const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-i3WtsKA4.mjs").then((n) => n.r);
361
+ const { loadConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
362
+ const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-D4aM4bzP.mjs").then((n) => n.r);
363
363
  const config = await loadConfig();
364
364
  const graphMcpEndpoint = resolveGraphMcpEndpoint(config);
365
365
  let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint);
@@ -387,7 +387,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
387
387
  })).addCommand(new 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) => {
388
388
  try {
389
389
  await withGraphMcpClient("chain-insights-cli-aml-address-risk", async (client) => {
390
- const { addressRisk } = await import("./public-tools-B9_wXs2o.mjs");
390
+ const { addressRisk } = await import("./public-tools-BjqZGGAC.mjs");
391
391
  const result = await addressRisk(client, {
392
392
  address: opts.address,
393
393
  network: opts.network,
@@ -407,7 +407,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
407
407
  assertPublicMcpToolName(tool);
408
408
  validatePublicMcpToolArguments(tool, args);
409
409
  if (tool === "wallet_balance") {
410
- const { getWalletBalanceText } = await import("./tools-CWwX4yth.mjs").then((n) => n.p);
410
+ const { getWalletBalanceText } = await import("./tools-BKLnlBG1.mjs").then((n) => n.p);
411
411
  console.log(await getWalletBalanceText());
412
412
  return;
413
413
  }
@@ -427,15 +427,15 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
427
427
  arguments: {}
428
428
  }));
429
429
  } catch (err) {
430
- const { isMissingUsageStatusToolError, primitiveBackendUsageStatus, usageStatusText } = await import("./usage-status-D2uosC7s.mjs").then((n) => n.n);
430
+ const { isMissingUsageStatusToolError, primitiveBackendUsageStatus, usageStatusText } = await import("./usage-status-CHiOPA-2.mjs").then((n) => n.n);
431
431
  if (!isMissingUsageStatusToolError(err)) throw err;
432
- const { resolveGraphMcpEndpoint } = await import("./client-i3WtsKA4.mjs").then((n) => n.r);
432
+ const { resolveGraphMcpEndpoint } = await import("./client-D4aM4bzP.mjs").then((n) => n.r);
433
433
  console.log(usageStatusText(primitiveBackendUsageStatus(resolveGraphMcpEndpoint(config))));
434
434
  }
435
435
  return;
436
436
  }
437
437
  if (tool === "aml_address_risk") {
438
- const { addressRisk } = await import("./public-tools-B9_wXs2o.mjs");
438
+ const { addressRisk } = await import("./public-tools-BjqZGGAC.mjs");
439
439
  const result = await addressRisk(client, {
440
440
  address: String(args["address"] ?? ""),
441
441
  network: String(args["network"] ?? ""),
@@ -460,16 +460,16 @@ program.command("viz").description("Generate a workspace visualization").argumen
460
460
  console.error("Provide either a visualization source ID or --data <file.json>");
461
461
  process.exit(1);
462
462
  }
463
- const { loadConfig } = await import("./config-DA6KRx60.mjs").then((n) => n.t);
463
+ const { loadConfig } = await import("./config-CnNMdt4M.mjs").then((n) => n.t);
464
464
  const { resolveServerPort } = await import("./resolve-port-DxPK7Ipx.mjs");
465
465
  const config = await loadConfig();
466
466
  const port = resolveServerPort(opts.port, config.serverPort);
467
- const { generateVisualization } = await import("./viz-Cq1jSWSH.mjs").then((n) => n.n);
467
+ const { generateVisualization } = await import("./viz-Uh_EF-qB.mjs").then((n) => n.n);
468
468
  const result = await generateVisualization({
469
469
  sourceId,
470
470
  dataFile: opts.data
471
471
  });
472
- const { startServer } = await import("./server-BXj6BRI1.mjs").then((n) => n.t);
472
+ const { startServer } = await import("./server-mDSRgk1X.mjs").then((n) => n.t);
473
473
  startServer(port);
474
474
  const url = `http://127.0.0.1:${port}/viz/${result.vizId}`;
475
475
  console.log(`Visualization: ${url}`);
@@ -480,180 +480,6 @@ program.command("viz").description("Generate a workspace visualization").argumen
480
480
  process.exit(1);
481
481
  }
482
482
  });
483
- const MONITOR_EXIT_ISOLATED = 2;
484
- async function appendRunLog(workspaceRoot, doc) {
485
- const { monitorPaths } = await import("./paths-_3isihzD.mjs").then((n) => n.n);
486
- const { appendFile, mkdir } = await import("node:fs/promises");
487
- const { logsDir } = monitorPaths(workspaceRoot);
488
- await mkdir(logsDir, { recursive: true });
489
- await appendFile(`${logsDir}/monitor-runs.jsonl`, `${JSON.stringify(doc)}\n`, "utf8");
490
- }
491
- const monitor = program.command("monitor").description("Case tracking: per-case dossier rendering, one cron-safe pass at a time. Docs: docs/monitoring.md");
492
- monitor.command("run").description("One monitoring pass: render the dossier of every open case").action(async () => {
493
- try {
494
- const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
495
- const workspaceRoot = requireWorkspaceRoot();
496
- const { loadMonitorConfig } = await import("./config-CwIb-tav.mjs");
497
- const { runMonitorOnce } = await import("./runner-CSss8Hvy.mjs");
498
- const { acquireRunLock } = await import("./lock-D_sWGS7W.mjs");
499
- const lock = await acquireRunLock(workspaceRoot);
500
- if (!lock.acquired) {
501
- console.log(`[monitor] already running (pid ${lock.holderPid}); exiting`);
502
- return;
503
- }
504
- let exitCode = 0;
505
- try {
506
- const doc = await runMonitorOnce(void 0, workspaceRoot, await loadMonitorConfig(workspaceRoot), Date.now());
507
- await appendRunLog(workspaceRoot, doc);
508
- const failed = doc.cases.filter((c) => c.error);
509
- console.log(`[monitor] run ${doc.run_timestamp}: ${doc.cases.length} case(s)`);
510
- for (const cell of failed) console.error(`[monitor] ${cell.case_id} FAILED: ${cell.error}`);
511
- if (failed.length > 0) exitCode = MONITOR_EXIT_ISOLATED;
512
- } finally {
513
- await lock.release();
514
- }
515
- if (exitCode !== 0) process.exit(exitCode);
516
- } catch (err) {
517
- console.error(err.message);
518
- process.exit(1);
519
- }
520
- });
521
- monitor.command("render").description("Render the human-readable case dossier, seed notes and timeline from the case document (no re-trace)").argument("[case_id]", "Render one case instead of all open cases").option("--force", "Re-render even when the case document is unchanged").action(async (caseId, opts) => {
522
- try {
523
- const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
524
- const workspaceRoot = requireWorkspaceRoot();
525
- const { loadMonitorConfig } = await import("./config-CwIb-tav.mjs");
526
- const { renderCaseFromDoc, renderAllCasesFromDoc } = await import("./render-mxE0Tdsf.mjs");
527
- const config = await loadMonitorConfig(workspaceRoot);
528
- const outcomes = caseId ? [{
529
- case_id: caseId,
530
- ...await renderCaseFromDoc(workspaceRoot, caseId, config, Date.now(), { force: opts.force })
531
- }] : await renderAllCasesFromDoc(workspaceRoot, config, Date.now(), { force: opts.force });
532
- if (outcomes.length === 0) console.log("[render] no open cases");
533
- for (const o of outcomes) console.log(o.rendered ? `[render] ${o.case_id}: rendered` : `[render] ${o.case_id}: skipped (${o.skipped_reason})`);
534
- } catch (err) {
535
- console.error(err.message);
536
- process.exit(1);
537
- }
538
- });
539
- monitor.command("status").description("Show monitor status: open cases and last run").action(async () => {
540
- try {
541
- const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
542
- const workspaceRoot = requireWorkspaceRoot();
543
- const { statusText } = await import("./report-BFXFrJmj.mjs");
544
- console.log(await statusText(workspaceRoot));
545
- } catch (err) {
546
- console.error(err.message);
547
- process.exit(1);
548
- }
549
- });
550
- monitor.command("init").description("Bootstrap a monitor profile in this workspace (victim: stolen-funds case tracking)").argument("<profile>", "Profile to initialize; only \"victim\" is supported (operators write config.json directly)").requiredOption("--case-id <id>", "Case identifier (lowercase letters, digits, hyphens)").requiredOption("--network <network>", "Network for the case. Run `cia networks` for supported networks.").requiredOption("--seed <addresses...>", "Stolen-funds seed address(es) — usually the drained wallet(s)").option("--note <text>", "Optional free-text note").action(async (profile, opts) => {
551
- try {
552
- if (profile !== "victim") throw new Error(`unknown init profile "${profile}" — only "victim" is supported (operator workspaces write .chain-insights/monitor/config.json directly; see docs/monitoring.md)`);
553
- const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
554
- const workspaceRoot = requireWorkspaceRoot();
555
- const { initVictimWorkspace } = await import("./init-BiRfMQcA.mjs");
556
- const result = await initVictimWorkspace(workspaceRoot, {
557
- caseId: opts.caseId,
558
- network: opts.network,
559
- seeds: opts.seed,
560
- note: opts.note
561
- }, Date.now());
562
- console.log("Victim monitoring initialized.");
563
- console.log(` case: ${result.monitorCase.case_id} (stolen-funds, ${result.monitorCase.network}, ${result.monitorCase.seeds.length} seed(s))`);
564
- console.log(` config: ${result.configPath}`);
565
- console.log("");
566
- console.log("Next steps:");
567
- console.log(" cia monitor run # render the dossier for every open case");
568
- console.log(" Schedule it with cron, pm2, or your agent harness (docs/monitoring.md \"Scheduling\")");
569
- console.log(`Dossier after the first run: published/cases/${result.monitorCase.case_id}/dossier.md`);
570
- } catch (err) {
571
- console.error(err.message);
572
- process.exit(1);
573
- }
574
- });
575
- const monitorCase = monitor.command("case").description("Manage incident-centric monitor cases (stolen-funds, scam-topology)");
576
- monitorCase.command("add").description("Register a new monitor case with one or more seed addresses").argument("<case-id>", "Case identifier (lowercase letters, digits, hyphens)").addOption(new Option("--type <type>", "Case type").choices(["stolen-funds", "scam-topology"]).makeOptionMandatory()).requiredOption("--network <network>", "Network for this case. Run `cia mcp networks` for supported networks.").requiredOption("--seed <addresses...>", "Seed address(es) for the case").option("--note <text>", "Optional free-text note").action(async (caseId, opts) => {
577
- try {
578
- const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
579
- const workspaceRoot = requireWorkspaceRoot();
580
- const { addCase } = await import("./cases-C1XewLdx.mjs");
581
- const created = await addCase(workspaceRoot, {
582
- case_id: caseId,
583
- type: opts.type,
584
- network: opts.network,
585
- seeds: opts.seed,
586
- note: opts.note
587
- }, Date.now());
588
- console.log(`Case created: ${created.case_id} (${created.type}, ${created.network}, ${created.seeds.length} seed(s))`);
589
- } catch (err) {
590
- console.error(err.message);
591
- process.exit(1);
592
- }
593
- });
594
- monitorCase.command("list").description("List monitor cases (open only by default)").option("--all", "Include closed cases").action(async (opts) => {
595
- try {
596
- const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
597
- const workspaceRoot = requireWorkspaceRoot();
598
- const { listCases } = await import("./cases-C1XewLdx.mjs");
599
- const cases = await listCases(workspaceRoot, { openOnly: !opts.all });
600
- if (cases.length === 0) {
601
- console.log("(no cases)");
602
- return;
603
- }
604
- console.log("case_id type network status seeds");
605
- for (const c of cases) console.log(`${c.case_id}\t${c.type}\t${c.network}\t${c.status}\t${c.seeds.join(",")}`);
606
- } catch (err) {
607
- console.error(err.message);
608
- process.exit(1);
609
- }
610
- });
611
- monitorCase.command("add-seed").description("Add seed address(es) to an OPEN case. Idempotent; the next run widens the corridor without reporting the newly visible addresses as movements.").argument("<case-id>", "Case identifier").requiredOption("--address <addresses...>", "Address(es) to add as case seeds").option("--note <text>", "Why the case is being widened (recorded on the seed event)").action(async (caseId, opts) => {
612
- try {
613
- const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
614
- const workspaceRoot = requireWorkspaceRoot();
615
- const { addCaseSeeds } = await import("./cases-C1XewLdx.mjs");
616
- const { monitorCase: updated, added } = await addCaseSeeds(workspaceRoot, caseId, opts.address, Date.now(), { note: opts.note });
617
- if (added.length === 0) {
618
- console.log(`Case ${updated.case_id} unchanged: all ${opts.address.length} address(es) are already seeds (${updated.seeds.length} seed(s)).`);
619
- return;
620
- }
621
- console.log(`Case ${updated.case_id}: added ${added.length} seed(s) [${added.join(", ")}], now ${updated.seeds.length} seed(s).`);
622
- console.log("The next `cia monitor run` re-traces the wider corridor. Addresses that appear only because of these seeds are recorded as scope_expansion, not as movements.");
623
- } catch (err) {
624
- console.error(err.message);
625
- process.exit(1);
626
- }
627
- });
628
- monitorCase.command("remove-seed").description("Remove seed address(es) from an OPEN case. Idempotent; a case may never be left with zero seeds.").argument("<case-id>", "Case identifier").requiredOption("--address <addresses...>", "Address(es) to remove from the case seeds").action(async (caseId, opts) => {
629
- try {
630
- const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
631
- const workspaceRoot = requireWorkspaceRoot();
632
- const { removeCaseSeeds } = await import("./cases-C1XewLdx.mjs");
633
- const { monitorCase: updated, removed } = await removeCaseSeeds(workspaceRoot, caseId, opts.address, Date.now());
634
- if (removed.length === 0) {
635
- console.log(`Case ${updated.case_id} unchanged: none of the ${opts.address.length} address(es) is a seed (${updated.seeds.length} seed(s)).`);
636
- return;
637
- }
638
- console.log(`Case ${updated.case_id}: removed ${removed.length} seed(s) [${removed.join(", ")}], now ${updated.seeds.length} seed(s).`);
639
- } catch (err) {
640
- console.error(err.message);
641
- process.exit(1);
642
- }
643
- });
644
- monitorCase.command("close").description("Close a monitor case").argument("<case-id>", "Case identifier").action(async (caseId) => {
645
- try {
646
- const { requireWorkspaceRoot } = await import("./output-root-BK4pdjyz.mjs").then((n) => n.t);
647
- const workspaceRoot = requireWorkspaceRoot();
648
- const { closeCase } = await import("./cases-C1XewLdx.mjs");
649
- const { monitorCase, alreadyClosed } = await closeCase(workspaceRoot, caseId, Date.now());
650
- if (alreadyClosed) console.warn(`Warning: case "${caseId}" is already closed (closed_at ${monitorCase.closed_at_timestamp}); nothing changed.`);
651
- else console.log(`Case closed: ${monitorCase.case_id}`);
652
- } catch (err) {
653
- console.error(err.message);
654
- process.exit(1);
655
- }
656
- });
657
483
  program.parseAsync(process.argv).catch((err) => {
658
484
  console.error(err.message);
659
485
  process.exit(1);