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.
- package/README.md +44 -121
- package/bin/cli.js +4 -4
- package/bin/install.cjs +137 -113
- package/bin/mcp-proxy.cjs +7 -5
- package/dist/{action-log-Dfe88TwV.cjs → action-log-HniMMF7f.cjs} +1 -1
- package/dist/action-log-diTHyMbV.mjs.map +1 -1
- package/dist/active-BQopLul8.mjs.map +1 -1
- package/dist/{active-Bj6dohpc.cjs → active-Bc13hJIm.cjs} +1 -1
- package/dist/{app-CJwx_2Rr.mjs → app-7NRCqx_Q.mjs} +2 -2
- package/dist/app-7NRCqx_Q.mjs.map +1 -0
- package/dist/{app-D4Cm69ob.cjs → app-l9JE6bt3.cjs} +5 -5
- package/dist/{artifact-server-sJBFGcum.cjs → artifact-server-CH-asxF5.cjs} +3 -2
- package/dist/{artifact-server-D1D-_t5l.mjs → artifact-server-DoxJr0z8.mjs} +4 -3
- package/dist/artifact-server-DoxJr0z8.mjs.map +1 -0
- package/dist/{capabilities-CxvK7LKZ.mjs → capabilities-BZI6qROg.mjs} +2 -2
- package/dist/capabilities-BZI6qROg.mjs.map +1 -0
- package/dist/{capabilities-CZYijWbg.cjs → capabilities-CPcrxodx.cjs} +2 -2
- package/dist/cli.cjs +42 -216
- package/dist/cli.mjs +36 -210
- package/dist/cli.mjs.map +1 -1
- package/dist/{client-Bjxo7AEa.cjs → client-CqAzD519.cjs} +4 -4
- package/dist/{client-i3WtsKA4.mjs → client-D4aM4bzP.mjs} +4 -4
- package/dist/client-D4aM4bzP.mjs.map +1 -0
- package/dist/{config-DE0dUT3P.cjs → config-BVFf3v8-.cjs} +2 -2
- package/dist/{config-DA6KRx60.mjs → config-CnNMdt4M.mjs} +2 -2
- package/dist/config-CnNMdt4M.mjs.map +1 -0
- package/dist/graph-normalizer-BA3Rbd6l.mjs.map +1 -1
- package/dist/graph-reports-B6yoYbPq.mjs.map +1 -1
- package/dist/{graph-reports-DSHSp5HL.cjs → graph-reports-_gqzxvvs.cjs} +2 -2
- package/dist/{html-generator-Ui29DLSD.cjs → html-generator-B9f_GIi2.cjs} +4 -3
- package/dist/{html-generator-ClysZjfY.mjs → html-generator-D2BDzLED.mjs} +3 -2
- package/dist/{html-generator-ClysZjfY.mjs.map → html-generator-D2BDzLED.mjs.map} +1 -1
- package/dist/index.cjs +9 -9
- package/dist/index.d.cts +3 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +9 -9
- package/dist/{init-BT3STWBv.mjs → init-Djhml4ih.mjs} +3 -3
- package/dist/init-Djhml4ih.mjs.map +1 -0
- package/dist/{init-BR4SRTAY.cjs → init-DvrKxK15.cjs} +3 -3
- package/dist/limits-D3Mn-gig.mjs.map +1 -1
- package/dist/mcp-endpoint-DbWtLcba.mjs.map +1 -1
- package/dist/mcp-proxy.cjs +19 -18
- package/dist/mcp-proxy.d.cts.map +1 -1
- package/dist/mcp-proxy.d.mts.map +1 -1
- package/dist/mcp-proxy.mjs +13 -12
- package/dist/mcp-proxy.mjs.map +1 -1
- package/dist/{merge-CJRZpuZ4.mjs → merge-BZw-pMPN.mjs} +2 -2
- package/dist/merge-BZw-pMPN.mjs.map +1 -0
- package/dist/{merge-B_5kxbGv.cjs → merge-C52eaAGU.cjs} +1 -1
- package/dist/{output-root-C1PFNCqb.cjs → output-root-BewoQaTx.cjs} +2 -2
- package/dist/{public-tools-CgiKgYgf.cjs → public-tools-BFs_7U_Z.cjs} +8 -7
- package/dist/{public-tools-B9_wXs2o.mjs → public-tools-BjqZGGAC.mjs} +7 -6
- package/dist/public-tools-BjqZGGAC.mjs.map +1 -0
- package/dist/{rolldown-runtime-DakpK96I.cjs → rolldown-runtime-C0BPl7ul.cjs} +1 -1
- package/dist/{schema-DF0aOXII.cjs → schema-BpeV3xDV.cjs} +5 -2
- package/dist/{schema-0BVyF-aL.mjs → schema-DOJA2nNi.mjs} +5 -2
- package/dist/schema-DOJA2nNi.mjs.map +1 -0
- package/dist/{schema-cache-DwDvPy4e.mjs → schema-cache-DJdU4MIP.mjs} +2 -2
- package/dist/{schema-cache-DwDvPy4e.mjs.map → schema-cache-DJdU4MIP.mjs.map} +1 -1
- package/dist/{schema-cache-CX0r2UQp.cjs → schema-cache-n7Gbhvsj.cjs} +2 -2
- package/dist/{server-ta1oyJ2a.cjs → server-CmvzYu7v.cjs} +4 -3
- package/dist/{server-BXj6BRI1.mjs → server-mDSRgk1X.mjs} +4 -3
- package/dist/server-mDSRgk1X.mjs.map +1 -0
- package/dist/tool-visibility-C0ALejXI.mjs.map +1 -1
- package/dist/{tool-visibility-DMIEexib.cjs → tool-visibility-DZBAP62b.cjs} +1 -1
- package/dist/{tools-CWwX4yth.mjs → tools-BKLnlBG1.mjs} +8 -6
- package/dist/tools-BKLnlBG1.mjs.map +1 -0
- package/dist/{tools-BPfUpCUR.cjs → tools-lPY6k-vJ.cjs} +8 -6
- package/dist/{topup-server-VGl8-Fz5.cjs → topup-server-DAqmAuu1.cjs} +23 -21
- package/dist/{topup-server-D2X7My7i.mjs → topup-server-rqI7bqem.mjs} +23 -21
- package/dist/topup-server-rqI7bqem.mjs.map +1 -0
- package/dist/update-CJUfGCxs.mjs.map +1 -1
- package/dist/{usage-status-H1xgCu99.cjs → usage-status-BdwwgYsu.cjs} +2 -2
- package/dist/{usage-status-D2uosC7s.mjs → usage-status-CHiOPA-2.mjs} +2 -2
- package/dist/usage-status-CHiOPA-2.mjs.map +1 -0
- package/dist/version-BA3J8hu4.mjs.map +1 -1
- package/dist/{viz-HSwLcKr6.cjs → viz-BJ_kyRjI.cjs} +7 -5
- package/dist/{viz-Cq1jSWSH.mjs → viz-Uh_EF-qB.mjs} +6 -4
- package/dist/viz-Uh_EF-qB.mjs.map +1 -0
- package/dist/{wallet-C2yVjcSY.cjs → wallet-BEvHrHi3.cjs} +3 -2
- package/dist/{wallet-BrTTnf7w.mjs → wallet-fMbhvKXT.mjs} +3 -2
- package/dist/wallet-fMbhvKXT.mjs.map +1 -0
- package/docs/architecture.md +18 -18
- package/docs/debugging.md +2 -42
- package/docs/development.md +0 -27
- package/docs/graph-query-compatibility.md +66 -57
- package/docs/graph-tools.md +6 -6
- package/docs/investigation-workspaces.md +0 -35
- package/docs/mcp-proxy.md +8 -9
- package/docs/search-limits.md +8 -8
- package/docs/stability.md +4 -5
- package/package.json +1 -5
- package/skills/chain-insights-cypher/SKILL.md +7 -7
- package/skills/chain-insights-cypher/agents/openai.yaml +3 -3
- package/skills/chain-insights-schema-bittensor/SKILL.md +26 -26
- package/skills/chain-insights-schema-evm/SKILL.md +37 -37
- package/dist/app-CJwx_2Rr.mjs.map +0 -1
- package/dist/artifact-server-D1D-_t5l.mjs.map +0 -1
- package/dist/capabilities-CxvK7LKZ.mjs.map +0 -1
- package/dist/cases-C1XewLdx.mjs +0 -155
- package/dist/cases-C1XewLdx.mjs.map +0 -1
- package/dist/cases-CVtc7Rf8.cjs +0 -160
- package/dist/client-i3WtsKA4.mjs.map +0 -1
- package/dist/config-CwIb-tav.mjs +0 -33
- package/dist/config-CwIb-tav.mjs.map +0 -1
- package/dist/config-Cy-qzx4W.cjs +0 -33
- package/dist/config-DA6KRx60.mjs.map +0 -1
- package/dist/init-9jY5rCcH.cjs +0 -24
- package/dist/init-BT3STWBv.mjs.map +0 -1
- package/dist/init-BiRfMQcA.mjs +0 -26
- package/dist/init-BiRfMQcA.mjs.map +0 -1
- package/dist/lock-Cs-a3Ng1.cjs +0 -38
- package/dist/lock-D_sWGS7W.mjs +0 -40
- package/dist/lock-D_sWGS7W.mjs.map +0 -1
- package/dist/merge-CJRZpuZ4.mjs.map +0 -1
- package/dist/paths-CffVTUCv.cjs +0 -31
- package/dist/paths-_3isihzD.mjs +0 -21
- package/dist/paths-_3isihzD.mjs.map +0 -1
- package/dist/public-tools-B9_wXs2o.mjs.map +0 -1
- package/dist/render-TmSq0f4f.cjs +0 -207
- package/dist/render-mxE0Tdsf.mjs +0 -206
- package/dist/render-mxE0Tdsf.mjs.map +0 -1
- package/dist/report-BFXFrJmj.mjs +0 -36
- package/dist/report-BFXFrJmj.mjs.map +0 -1
- package/dist/report-BwKQqOCR.cjs +0 -36
- package/dist/runner-CSss8Hvy.mjs +0 -33
- package/dist/runner-CSss8Hvy.mjs.map +0 -1
- package/dist/runner-aErdz2zn.cjs +0 -31
- package/dist/schema-0BVyF-aL.mjs.map +0 -1
- package/dist/server-BXj6BRI1.mjs.map +0 -1
- package/dist/tools-CWwX4yth.mjs.map +0 -1
- package/dist/topup-server-D2X7My7i.mjs.map +0 -1
- package/dist/usage-status-D2uosC7s.mjs.map +0 -1
- package/dist/viz-Cq1jSWSH.mjs.map +0 -1
- package/dist/wallet-BrTTnf7w.mjs.map +0 -1
- 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-
|
|
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-
|
|
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-
|
|
72
|
-
const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import("./capabilities-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
246
|
-
const { CONFIG_KEYS } = await import("./schema-
|
|
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-
|
|
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-
|
|
267
|
-
const { CONFIG_KEYS, DEFAULT_CONFIG } = await import("./schema-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
328
|
-
const { startTopupServer } = await import("./topup-server-
|
|
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-
|
|
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-
|
|
362
|
-
const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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);
|