chain-insights 0.2.16 → 0.2.18
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 +29 -18
- package/dist/{active-Dv7Tu-O4.cjs → active-BVr55kvW.cjs} +1 -1
- package/dist/{active-BSrxLKwn.mjs → active-ByNgjuAg.mjs} +2 -2
- package/dist/{active-BSrxLKwn.mjs.map → active-ByNgjuAg.mjs.map} +1 -1
- package/dist/{app-BjjuQM0B.mjs → app-DdWQF_zb.mjs} +4 -4
- package/dist/{app-BjjuQM0B.mjs.map → app-DdWQF_zb.mjs.map} +1 -1
- package/dist/{app-Dq1TdB6p.cjs → app-DxlQE_P5.cjs} +4 -4
- package/dist/{artifact-server-Dxz5YbuQ.mjs → artifact-server-4DiMvwhC.mjs} +2 -2
- package/dist/{artifact-server-Dxz5YbuQ.mjs.map → artifact-server-4DiMvwhC.mjs.map} +1 -1
- package/dist/{artifact-server-DoxJ7fCx.cjs → artifact-server-B-3ho4bk.cjs} +1 -2
- package/dist/{call-args-Lk_wOJxd.mjs → call-args-DPXdX3_D.mjs} +1 -1
- package/dist/{call-args-Lk_wOJxd.mjs.map → call-args-DPXdX3_D.mjs.map} +1 -1
- package/dist/{capabilities-DliMBim-.mjs → capabilities-BShqspb-.mjs} +2 -2
- package/dist/{capabilities-DliMBim-.mjs.map → capabilities-BShqspb-.mjs.map} +1 -1
- package/dist/{capabilities-CB97WMA5.cjs → capabilities-Bm0JDbV7.cjs} +1 -1
- package/dist/cases-c0iV-XLI.cjs +9 -0
- package/dist/cases-qjPtbnUd.mjs +6 -0
- package/dist/cli.cjs +64 -64
- package/dist/cli.mjs +63 -63
- package/dist/cli.mjs.map +1 -1
- package/dist/{client-D4Bq0rp9.mjs → client-D4_hd4AP.mjs} +23 -9
- package/dist/client-D4_hd4AP.mjs.map +1 -0
- package/dist/{client-D4fZgIaO.cjs → client-DPc2eyVN.cjs} +27 -7
- package/dist/{config-BwrBYmiC.mjs → config-9KYXaAv-.mjs} +3 -3
- package/dist/{config-BwrBYmiC.mjs.map → config-9KYXaAv-.mjs.map} +1 -1
- package/dist/{config-Bmdl5hdk.cjs → config-BhYbhLDI.cjs} +2 -2
- package/dist/{dossier-BsroDgD3.mjs → dossier-Bl0NkJKC.mjs} +3 -3
- package/dist/{dossier-BsroDgD3.mjs.map → dossier-Bl0NkJKC.mjs.map} +1 -1
- package/dist/{dossier-DtxREpPm.cjs → dossier-Br62hCG7.cjs} +3 -3
- package/dist/{evidence-BGcdKxuV.cjs → evidence-CvEesemA.cjs} +3 -3
- package/dist/{evidence-BhvFW-y_.mjs → evidence-D96PTzOQ.mjs} +3 -3
- package/dist/{evidence-BhvFW-y_.mjs.map → evidence-D96PTzOQ.mjs.map} +1 -1
- package/dist/{format-Ce1RObVl.mjs → format-Bq94jSyw.mjs} +1 -1
- package/dist/{format-Ce1RObVl.mjs.map → format-Bq94jSyw.mjs.map} +1 -1
- package/dist/{frontmatter-D8wWCeOa.mjs → frontmatter-D0ccQnUM.mjs} +1 -1
- package/dist/{frontmatter-D8wWCeOa.mjs.map → frontmatter-D0ccQnUM.mjs.map} +1 -1
- package/dist/{graph-normalizer-Cv9yK9Pg.mjs → graph-normalizer-CXP06jKh.mjs} +1 -1
- package/dist/{graph-normalizer-Cv9yK9Pg.mjs.map → graph-normalizer-CXP06jKh.mjs.map} +1 -1
- package/dist/{graph-reports-DU05YCei.cjs → graph-reports-B3mkLP8Z.cjs} +3 -3
- package/dist/{graph-reports-C4TBjCkM.mjs → graph-reports-BDELxmpi.mjs} +3 -3
- package/dist/{graph-reports-C4TBjCkM.mjs.map → graph-reports-BDELxmpi.mjs.map} +1 -1
- package/dist/{html-generator-V6Bp0uRb.mjs → html-generator-AowOmzyi.mjs} +2 -2
- package/dist/{html-generator-V6Bp0uRb.mjs.map → html-generator-AowOmzyi.mjs.map} +1 -1
- package/dist/{html-generator-CAv81IWH.cjs → html-generator-Bx3UcLTB.cjs} +1 -1
- package/dist/index.cjs +8 -8
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +8 -8
- package/dist/{init-BjuFt54X.cjs → init-BvpZtFiT.cjs} +4 -5
- package/dist/{init-CaOsHTIo.mjs → init-CZbZegIW.mjs} +4 -5
- package/dist/init-CZbZegIW.mjs.map +1 -0
- package/dist/mcp-proxy.cjs +75 -38
- package/dist/mcp-proxy.d.cts.map +1 -1
- package/dist/mcp-proxy.d.mts.map +1 -1
- package/dist/mcp-proxy.mjs +74 -37
- package/dist/mcp-proxy.mjs.map +1 -1
- package/dist/{output-root-CmWM7aV2.mjs → output-root-BRhzhhXZ.mjs} +3 -3
- package/dist/{output-root-CmWM7aV2.mjs.map → output-root-BRhzhhXZ.mjs.map} +1 -1
- package/dist/{output-root-CFYms3ad.cjs → output-root-YIbl6PwF.cjs} +2 -2
- package/dist/{parser-BUIWW1OH.cjs → parser-BXLAHYnZ.cjs} +1 -1
- package/dist/{parser-DO0_SssG.mjs → parser-CJfMsOl6.mjs} +1 -1
- package/dist/{parser-DO0_SssG.mjs.map → parser-CJfMsOl6.mjs.map} +1 -1
- package/dist/{public-tools-D4UI-Zb0.mjs → public-tools-D6Q5MTcO.mjs} +7 -7
- package/dist/{public-tools-D4UI-Zb0.mjs.map → public-tools-D6Q5MTcO.mjs.map} +1 -1
- package/dist/{public-tools-XSpkz2ky.cjs → public-tools-V7ON7goq.cjs} +7 -7
- package/dist/{resolver-zYbu4wDV.cjs → resolver-BUU7ZgW-.cjs} +1 -1
- package/dist/{resolver-C2ZS7oC8.mjs → resolver-D7VBb0uB.mjs} +1 -1
- package/dist/{resolver-C2ZS7oC8.mjs.map → resolver-D7VBb0uB.mjs.map} +1 -1
- package/dist/{runner-BhUHbiHG.mjs → runner-BatyCxv7.mjs} +7 -7
- package/dist/{runner-BhUHbiHG.mjs.map → runner-BatyCxv7.mjs.map} +1 -1
- package/dist/{runner-1Eq55OYb.cjs → runner-CCA7SJ7X.cjs} +6 -7
- package/dist/{schema-8d0rVIdZ.mjs → schema-BbQVXp36.mjs} +2 -2
- package/dist/{schema-8d0rVIdZ.mjs.map → schema-BbQVXp36.mjs.map} +1 -1
- package/dist/{schema-4XpzDFQM.cjs → schema-DN-KLkYN.cjs} +1 -1
- package/dist/{schema-cache-CgWRCN2N.cjs → schema-cache-CJk1EL3L.cjs} +1 -1
- package/dist/{schema-cache-9CksD7tX.mjs → schema-cache-DwDvPy4e.mjs} +1 -1
- package/dist/{schema-cache-9CksD7tX.mjs.map → schema-cache-DwDvPy4e.mjs.map} +1 -1
- package/dist/{selector-xjm6NTHI.mjs → selector-CTUiQrzI.mjs} +2 -2
- package/dist/{selector-xjm6NTHI.mjs.map → selector-CTUiQrzI.mjs.map} +1 -1
- package/dist/{selector-CkFcTXzz.cjs → selector-DBS2jYH4.cjs} +1 -1
- package/dist/{server-BkM5xrXb.mjs → server-BDlbmGbL.mjs} +3 -3
- package/dist/{server-BkM5xrXb.mjs.map → server-BDlbmGbL.mjs.map} +1 -1
- package/dist/{server-DXowbpfi.cjs → server-C3y1gQmZ.cjs} +2 -2
- package/dist/{session-CcTgYxsj.mjs → session-Bha3zFrx.mjs} +3 -3
- package/dist/{session-CcTgYxsj.mjs.map → session-Bha3zFrx.mjs.map} +1 -1
- package/dist/{session-BpNylyuJ.cjs → session-DwyikazY.cjs} +3 -3
- package/dist/{setup-DOpKPrlx.cjs → setup-CDha4B9s.cjs} +1 -1
- package/dist/{setup-DyrWHuwQ.mjs → setup-yXK8agdn.mjs} +1 -1
- package/dist/{setup-DyrWHuwQ.mjs.map → setup-yXK8agdn.mjs.map} +1 -1
- package/dist/{store-BoWE-Gtl.mjs → store-BT2SCcQr.mjs} +5 -5
- package/dist/{store-BoWE-Gtl.mjs.map → store-BT2SCcQr.mjs.map} +1 -1
- package/dist/{store-BiUhQOIf.cjs → store-DogLawSj.cjs} +5 -5
- package/dist/{tool-visibility-3Z_KvO9Q.mjs → tool-visibility-BHRFLXuU.mjs} +2 -2
- package/dist/{tool-visibility-3Z_KvO9Q.mjs.map → tool-visibility-BHRFLXuU.mjs.map} +1 -1
- package/dist/{tool-visibility-CwgY205r.cjs → tool-visibility-iAVQV3t0.cjs} +1 -1
- package/dist/{tools-f_vJUZAF.cjs → tools-DY8h0WbE.cjs} +2 -2
- package/dist/{tools-Cp2jAAAb.mjs → tools-Py6SXg6J.mjs} +3 -3
- package/dist/{tools-Cp2jAAAb.mjs.map → tools-Py6SXg6J.mjs.map} +1 -1
- package/dist/{topup-server-DUjyFftI.mjs → topup-server-6MH7q73X.mjs} +5 -5
- package/dist/{topup-server-DUjyFftI.mjs.map → topup-server-6MH7q73X.mjs.map} +1 -1
- package/dist/{topup-server-BZuQifvh.cjs → topup-server-DjUjhNjv.cjs} +4 -4
- package/dist/{version-1gP19Lhi.mjs → version-BA3J8hu4.mjs} +1 -1
- package/dist/{version-1gP19Lhi.mjs.map → version-BA3J8hu4.mjs.map} +1 -1
- package/dist/{version-BNGtdpmH.cjs → version-CO9Or_YV.cjs} +0 -1
- package/dist/{data-extractor-BNGj7ECT.cjs → viz-Da9YWN_I.cjs} +37 -8
- package/dist/{data-extractor-DFzsa5CS.mjs → viz-DkJyqlUu.mjs} +35 -6
- package/dist/viz-DkJyqlUu.mjs.map +1 -0
- package/dist/{wallet-BMelXBYP.mjs → wallet-D8IqFRKY.mjs} +2 -2
- package/dist/{wallet-BMelXBYP.mjs.map → wallet-D8IqFRKY.mjs.map} +1 -1
- package/dist/{wallet-RnvvSpV2.cjs → wallet-TAlNMvIM.cjs} +1 -1
- package/docs/architecture.md +1 -2
- package/docs/graph-tools.md +3 -3
- package/package.json +24 -4
- package/skills/chain-insights-investigation/SKILL.md +9 -9
- package/skills/chain-insights-trace-funds/SKILL.md +3 -3
- package/skills/test-chain-insights-graphrag-mcp/SKILL.md +1 -1
- package/dist/cases-By7INiOa.mjs +0 -6
- package/dist/cases-CDcNU91B.cjs +0 -9
- package/dist/client-D4Bq0rp9.mjs.map +0 -1
- package/dist/data-extractor-DFzsa5CS.mjs.map +0 -1
- package/dist/init-CaOsHTIo.mjs.map +0 -1
- package/dist/viz-BlCJe6Tk.mjs +0 -35
- package/dist/viz-BlCJe6Tk.mjs.map +0 -1
- package/dist/viz-ClezVXrJ.cjs +0 -44
- /package/dist/{call-args-DQA2QcRA.cjs → call-args-CcUV6gFS.cjs} +0 -0
- /package/dist/{chunk-CZWwpsFl.cjs → chunk-DakpK96I.cjs} +0 -0
- /package/dist/{format-DOrPvXEr.cjs → format-9NLBykEL.cjs} +0 -0
- /package/dist/{frontmatter-DgAuai7E.cjs → frontmatter-Dvqa5HX6.cjs} +0 -0
- /package/dist/{graph-normalizer-DeIj6Ses.cjs → graph-normalizer-DbjlbMpz.cjs} +0 -0
- /package/dist/{rolldown-runtime-wcPFST8Q.mjs → rolldown-runtime-D7D4PA-g.mjs} +0 -0
package/dist/cli.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as PACKAGE_VERSION, t as PACKAGE_INFO } from "./version-
|
|
1
|
+
import { n as PACKAGE_VERSION, t as PACKAGE_INFO } from "./version-BA3J8hu4.mjs";
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { execFileSync } from "node:child_process";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
@@ -24,16 +24,16 @@ if (rawArgs[0] === "mcp" && rawArgs[1] === "trace-funds") {
|
|
|
24
24
|
process.exit(1);
|
|
25
25
|
}
|
|
26
26
|
async function resolveCaseSelector(input) {
|
|
27
|
-
const { resolveCaseSelector } = await import("./selector-
|
|
27
|
+
const { resolveCaseSelector } = await import("./selector-CTUiQrzI.mjs");
|
|
28
28
|
return resolveCaseSelector(input);
|
|
29
29
|
}
|
|
30
30
|
async function scopeCasesToInvocationDir() {
|
|
31
31
|
if (process.env["CHAIN_INSIGHTS_CASES_ROOT"]?.trim()) return;
|
|
32
|
-
const { activeCasesRoot } = await import("./active-
|
|
32
|
+
const { activeCasesRoot } = await import("./active-ByNgjuAg.mjs").then((n) => n.n);
|
|
33
33
|
process.env["CHAIN_INSIGHTS_CASES_ROOT"] = activeCasesRoot();
|
|
34
34
|
}
|
|
35
35
|
async function showCaseContext(caseSelector) {
|
|
36
|
-
const { CaseStore } = await import("./cases-
|
|
36
|
+
const { CaseStore } = await import("./cases-qjPtbnUd.mjs");
|
|
37
37
|
const caseId = await resolveCaseSelector(caseSelector);
|
|
38
38
|
const ctx = await CaseStore.loadContext(caseId);
|
|
39
39
|
console.log(`\n=== Case: ${ctx.case.id} ===`);
|
|
@@ -69,9 +69,9 @@ function optionalScamTopologyActivityPolicy(value) {
|
|
|
69
69
|
throw new Error("activity_policy must be one of: node_relative_only, global_incident_only");
|
|
70
70
|
}
|
|
71
71
|
async function withGraphMcpClient(name, fn) {
|
|
72
|
-
const { loadConfig } = await import("./config-
|
|
72
|
+
const { loadConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
73
73
|
const config = await loadConfig();
|
|
74
|
-
const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-
|
|
74
|
+
const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-D4_hd4AP.mjs").then((n) => n.n);
|
|
75
75
|
const paymentFetch = await createConfiguredGraphMcpFetch(config);
|
|
76
76
|
const { Client } = await import("@modelcontextprotocol/sdk/client/index.js");
|
|
77
77
|
const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
@@ -90,8 +90,8 @@ function printMcpTextContent(result) {
|
|
|
90
90
|
for (const item of result.content ?? []) if (item.type === "text") console.log(item.text);
|
|
91
91
|
}
|
|
92
92
|
async function printNetworkCapabilities(opts) {
|
|
93
|
-
const { loadConfig } = await import("./config-
|
|
94
|
-
const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import("./capabilities-
|
|
93
|
+
const { loadConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
94
|
+
const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import("./capabilities-BShqspb-.mjs");
|
|
95
95
|
const document = await fetchNetworkCapabilities(await loadConfig());
|
|
96
96
|
if (opts.json) console.log(JSON.stringify(document, null, 2));
|
|
97
97
|
else console.log(formatNetworkCapabilities(document));
|
|
@@ -106,9 +106,9 @@ program.command("networks").alias("network").description("List supported graph n
|
|
|
106
106
|
});
|
|
107
107
|
program.command("serve").description("Start local visualization server").option("-p, --port <number>", "Port to bind (default: 4321)", "4321").action(async (opts) => {
|
|
108
108
|
try {
|
|
109
|
-
const { requireWorkspaceRoot } = await import("./output-root-
|
|
109
|
+
const { requireWorkspaceRoot } = await import("./output-root-BRhzhhXZ.mjs").then((n) => n.t);
|
|
110
110
|
const workspaceRoot = requireWorkspaceRoot();
|
|
111
|
-
const { startServer } = await import("./server-
|
|
111
|
+
const { startServer } = await import("./server-BDlbmGbL.mjs").then((n) => n.t);
|
|
112
112
|
console.log(`Workspace: ${workspaceRoot}`);
|
|
113
113
|
startServer(parseInt(opts.port, 10));
|
|
114
114
|
} catch (err) {
|
|
@@ -117,8 +117,8 @@ program.command("serve").description("Start local visualization server").option(
|
|
|
117
117
|
}
|
|
118
118
|
});
|
|
119
119
|
program.command("status").description("Show toolkit status and configuration").action(async () => {
|
|
120
|
-
const { loadConfig } = await import("./config-
|
|
121
|
-
const { findActiveWorkspace, activeDataDir } = await import("./active-
|
|
120
|
+
const { loadConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
121
|
+
const { findActiveWorkspace, activeDataDir } = await import("./active-ByNgjuAg.mjs").then((n) => n.n);
|
|
122
122
|
const config = await loadConfig();
|
|
123
123
|
const workspace = findActiveWorkspace();
|
|
124
124
|
const graphMcpStatus = config.graphMcpMode === "debug" && config.graphMcpAuthToken?.trim() ? "bearer access mode" : `${config.graphMcpMode} mode`;
|
|
@@ -130,7 +130,7 @@ program.command("status").description("Show toolkit status and configuration").a
|
|
|
130
130
|
});
|
|
131
131
|
program.command("debug").description("Configure Graph MCP debug mode").addCommand(new Command("on").description("Enable Graph MCP debug mode without x402 payments").requiredOption("--token <token>", "Debug bearer token").option("--endpoint <url>", "Graph MCP endpoint").action(async (opts) => {
|
|
132
132
|
try {
|
|
133
|
-
const { saveConfig } = await import("./config-
|
|
133
|
+
const { saveConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
134
134
|
await saveConfig({
|
|
135
135
|
graphMcpMode: "debug",
|
|
136
136
|
graphMcpAuthToken: opts.token,
|
|
@@ -145,7 +145,7 @@ program.command("debug").description("Configure Graph MCP debug mode").addComman
|
|
|
145
145
|
}
|
|
146
146
|
})).addCommand(new Command("off").description("Disable Graph MCP debug mode and use paid x402 calls").action(async () => {
|
|
147
147
|
try {
|
|
148
|
-
const { saveConfig } = await import("./config-
|
|
148
|
+
const { saveConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
149
149
|
await saveConfig({
|
|
150
150
|
graphMcpMode: "paid",
|
|
151
151
|
graphMcpAuthToken: ""
|
|
@@ -158,7 +158,7 @@ program.command("debug").description("Configure Graph MCP debug mode").addComman
|
|
|
158
158
|
}
|
|
159
159
|
})).addCommand(new Command("status").description("Show Graph MCP payment/debug mode").action(async () => {
|
|
160
160
|
try {
|
|
161
|
-
const { loadConfig } = await import("./config-
|
|
161
|
+
const { loadConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
162
162
|
const config = await loadConfig();
|
|
163
163
|
console.log(`Graph MCP mode: ${config.graphMcpMode}`);
|
|
164
164
|
console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
|
|
@@ -173,7 +173,7 @@ program.command("access-key").description("Configure Graph MCP test access key m
|
|
|
173
173
|
try {
|
|
174
174
|
const normalizedKey = key.trim();
|
|
175
175
|
if (!normalizedKey) throw new Error("Test access key is required");
|
|
176
|
-
const { saveConfig } = await import("./config-
|
|
176
|
+
const { saveConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
177
177
|
await saveConfig({
|
|
178
178
|
graphMcpMode: "debug",
|
|
179
179
|
graphMcpAuthToken: normalizedKey,
|
|
@@ -188,7 +188,7 @@ program.command("access-key").description("Configure Graph MCP test access key m
|
|
|
188
188
|
}
|
|
189
189
|
})).addCommand(new Command("clear").description("Remove the Graph MCP test access key and use paid x402 calls").action(async () => {
|
|
190
190
|
try {
|
|
191
|
-
const { saveConfig } = await import("./config-
|
|
191
|
+
const { saveConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
192
192
|
await saveConfig({
|
|
193
193
|
graphMcpMode: "paid",
|
|
194
194
|
graphMcpAuthToken: ""
|
|
@@ -201,7 +201,7 @@ program.command("access-key").description("Configure Graph MCP test access key m
|
|
|
201
201
|
}
|
|
202
202
|
})).addCommand(new Command("status").description("Show Graph MCP test access key status").action(async () => {
|
|
203
203
|
try {
|
|
204
|
-
const { loadConfig } = await import("./config-
|
|
204
|
+
const { loadConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
205
205
|
const config = await loadConfig();
|
|
206
206
|
console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
|
|
207
207
|
console.log(`Access key: ${config.graphMcpAuthToken?.trim() ? "configured" : "not configured"}`);
|
|
@@ -213,7 +213,7 @@ program.command("access-key").description("Configure Graph MCP test access key m
|
|
|
213
213
|
}));
|
|
214
214
|
program.command("init").description("Initialize an investigation workspace").argument("[dir]", "Workspace directory to initialize", ".").option("--force", "Overwrite existing workspace files").action(async (dir, opts) => {
|
|
215
215
|
try {
|
|
216
|
-
const { initWorkspace } = await import("./init-
|
|
216
|
+
const { initWorkspace } = await import("./init-CZbZegIW.mjs");
|
|
217
217
|
const result = await initWorkspace({
|
|
218
218
|
targetDir: dir,
|
|
219
219
|
force: opts.force
|
|
@@ -227,7 +227,7 @@ program.command("init").description("Initialize an investigation workspace").arg
|
|
|
227
227
|
});
|
|
228
228
|
program.command("setup").description("Configure external MCP clients").addCommand(new Command("claude-desktop").alias("claude").description("Install or update the Claude Desktop MCP server entry").option("--config <path>", "Path to claude_desktop_config.json").option("--dry-run", "Print the intended change without writing files").action(async (opts) => {
|
|
229
229
|
try {
|
|
230
|
-
const { setupClaudeDesktop } = await import("./setup-
|
|
230
|
+
const { setupClaudeDesktop } = await import("./setup-yXK8agdn.mjs");
|
|
231
231
|
const result = await setupClaudeDesktop({
|
|
232
232
|
configPath: opts.config,
|
|
233
233
|
dryRun: opts.dryRun
|
|
@@ -248,8 +248,8 @@ program.command("setup").description("Configure external MCP clients").addComman
|
|
|
248
248
|
}
|
|
249
249
|
}));
|
|
250
250
|
program.command("config").description("Read or write configuration values").addCommand(new Command("get").argument("<key>", "Config key to read").action(async (key) => {
|
|
251
|
-
const { loadConfig } = await import("./config-
|
|
252
|
-
const { CONFIG_KEYS } = await import("./schema-
|
|
251
|
+
const { loadConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
252
|
+
const { CONFIG_KEYS } = await import("./schema-BbQVXp36.mjs").then((n) => n.r);
|
|
253
253
|
if (!CONFIG_KEYS.includes(key)) {
|
|
254
254
|
console.error(`Unknown config key: ${key}`);
|
|
255
255
|
process.exit(1);
|
|
@@ -259,7 +259,7 @@ program.command("config").description("Read or write configuration values").addC
|
|
|
259
259
|
})).addCommand(new Command("set").argument("<key>", "Config key to write").argument("<value>", "Value to set").action(async (key, value) => {
|
|
260
260
|
if (key === "walletPrivateKey") {
|
|
261
261
|
try {
|
|
262
|
-
const { setWalletPrivateKey } = await import("./wallet-
|
|
262
|
+
const { setWalletPrivateKey } = await import("./wallet-D8IqFRKY.mjs").then((n) => n.s);
|
|
263
263
|
const address = await setWalletPrivateKey(value);
|
|
264
264
|
console.log("Wallet private key encrypted and stored in ~/.chain-insights/wallet.json");
|
|
265
265
|
console.log(`Wallet address: ${address}`);
|
|
@@ -269,8 +269,8 @@ program.command("config").description("Read or write configuration values").addC
|
|
|
269
269
|
}
|
|
270
270
|
return;
|
|
271
271
|
}
|
|
272
|
-
const { loadConfig, saveConfig } = await import("./config-
|
|
273
|
-
const { CONFIG_KEYS, DEFAULT_CONFIG } = await import("./schema-
|
|
272
|
+
const { loadConfig, saveConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
273
|
+
const { CONFIG_KEYS, DEFAULT_CONFIG } = await import("./schema-BbQVXp36.mjs").then((n) => n.r);
|
|
274
274
|
const current = await loadConfig();
|
|
275
275
|
if (!CONFIG_KEYS.includes(key)) {
|
|
276
276
|
console.error(`Unknown config key: ${key}`);
|
|
@@ -285,7 +285,7 @@ program.command("config").description("Read or write configuration values").addC
|
|
|
285
285
|
}));
|
|
286
286
|
program.command("wallet").description("Manage the local Base USDC payment wallet").addCommand(new Command("address").description("Print the local payment wallet address").action(async () => {
|
|
287
287
|
try {
|
|
288
|
-
const { getWalletAccount } = await import("./tools-
|
|
288
|
+
const { getWalletAccount } = await import("./tools-Py6SXg6J.mjs").then((n) => n.s);
|
|
289
289
|
const account = await getWalletAccount();
|
|
290
290
|
console.log(account.address);
|
|
291
291
|
} catch (err) {
|
|
@@ -294,7 +294,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
|
|
|
294
294
|
}
|
|
295
295
|
})).addCommand(new Command("balance").description("Show the local payment wallet Base USDC balance").action(async () => {
|
|
296
296
|
try {
|
|
297
|
-
const { getWalletBalanceText } = await import("./tools-
|
|
297
|
+
const { getWalletBalanceText } = await import("./tools-Py6SXg6J.mjs").then((n) => n.s);
|
|
298
298
|
console.log(await getWalletBalanceText());
|
|
299
299
|
} catch (err) {
|
|
300
300
|
console.error(err.message);
|
|
@@ -302,8 +302,8 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
|
|
|
302
302
|
}
|
|
303
303
|
})).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) => {
|
|
304
304
|
try {
|
|
305
|
-
const { buildTopupInfo, getWalletAccount } = await import("./tools-
|
|
306
|
-
const { startTopupServer } = await import("./topup-server-
|
|
305
|
+
const { buildTopupInfo, getWalletAccount } = await import("./tools-Py6SXg6J.mjs").then((n) => n.s);
|
|
306
|
+
const { startTopupServer } = await import("./topup-server-6MH7q73X.mjs").then((n) => n.r);
|
|
307
307
|
const account = await getWalletAccount();
|
|
308
308
|
const url = await startTopupServer(account);
|
|
309
309
|
const info = buildTopupInfo(account.address, url);
|
|
@@ -333,11 +333,11 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
333
333
|
}
|
|
334
334
|
})).addCommand(new Command("tools").description("List available MCP tools (cached 24h)").option("--refresh", "Force refresh schema cache").action(async (opts) => {
|
|
335
335
|
try {
|
|
336
|
-
const { loadSchema, saveSchema } = await import("./schema-cache-
|
|
337
|
-
const { formatToolsTable } = await import("./format-
|
|
338
|
-
const { visibleRemoteTools } = await import("./tool-visibility-
|
|
339
|
-
const { loadConfig } = await import("./config-
|
|
340
|
-
const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-
|
|
336
|
+
const { loadSchema, saveSchema } = await import("./schema-cache-DwDvPy4e.mjs");
|
|
337
|
+
const { formatToolsTable } = await import("./format-Bq94jSyw.mjs");
|
|
338
|
+
const { visibleRemoteTools } = await import("./tool-visibility-BHRFLXuU.mjs").then((n) => n.n);
|
|
339
|
+
const { loadConfig } = await import("./config-9KYXaAv-.mjs").then((n) => n.t);
|
|
340
|
+
const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-D4_hd4AP.mjs").then((n) => n.n);
|
|
341
341
|
const config = await loadConfig();
|
|
342
342
|
const graphMcpEndpoint = resolveGraphMcpEndpoint(config);
|
|
343
343
|
let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint);
|
|
@@ -376,7 +376,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
376
376
|
}));
|
|
377
377
|
return;
|
|
378
378
|
}
|
|
379
|
-
const { addressRisk } = await import("./public-tools-
|
|
379
|
+
const { addressRisk } = await import("./public-tools-D6Q5MTcO.mjs");
|
|
380
380
|
const result = await addressRisk(client, {
|
|
381
381
|
address: opts.address,
|
|
382
382
|
network: opts.network,
|
|
@@ -390,7 +390,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
390
390
|
}
|
|
391
391
|
})).addCommand(new Command("track-funds").description("Trace trusted/victim addresses and optional known untrusted/scammer addresses").requiredOption("--trusted-addresses <addresses>", "Comma-separated full trusted/victim addresses, max 5").requiredOption("--network <network>", "Network to query. Run `cia mcp networks` for supported networks.").option("--untrusted-addresses <addresses>", "Comma-separated full known untrusted/scammer addresses, max 5").option("--case <id>", "Case ID to attach compact evidence pointers").option("--max-hops <number>", "Maximum trace hops, 1-5").option("--per-address-limit <number>", "Maximum exchange paths/results per address, 1-10").option("--min-amount-sum <number>", "Minimum r.amount_sum for traced edges").option("--remote", "Force remote MCP tool call instead of local Chain Insights recipe").action(async (opts) => {
|
|
392
392
|
try {
|
|
393
|
-
const { requireWorkspaceRoot } = await import("./output-root-
|
|
393
|
+
const { requireWorkspaceRoot } = await import("./output-root-BRhzhhXZ.mjs").then((n) => n.t);
|
|
394
394
|
requireWorkspaceRoot();
|
|
395
395
|
await withGraphMcpClient("chain-insights-cli-track-funds", async (client, config) => {
|
|
396
396
|
if (opts.remote) {
|
|
@@ -404,7 +404,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
404
404
|
}));
|
|
405
405
|
return;
|
|
406
406
|
}
|
|
407
|
-
const { trackFunds } = await import("./public-tools-
|
|
407
|
+
const { trackFunds } = await import("./public-tools-D6Q5MTcO.mjs");
|
|
408
408
|
const caseId = opts.case ? await resolveCaseSelector(opts.case) : void 0;
|
|
409
409
|
const result = await trackFunds(client, config, {
|
|
410
410
|
trustedAddresses: opts.trustedAddresses,
|
|
@@ -424,10 +424,10 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
424
424
|
}
|
|
425
425
|
})).addCommand(new Command("scam-topology").description("Build victim-incident scam topology and ML-ready scam labels").requiredOption("--network <network>", "Network to query. Run `cia mcp networks` for supported networks.").requiredOption("--victim-address <address>", "Full victim/source address that anchors the incident").requiredOption("--incident-timestamp-ms <milliseconds>", "Earliest known incident transfer timestamp in milliseconds").option("--max-hops <number>", "Maximum trace hops, default 16, max 64").option("--activity-policy <mode>", "Traversal activity policy: node_relative_only or global_incident_only", "node_relative_only").option("--case <id>", "Case ID to attach compact evidence pointers").action(async (opts) => {
|
|
426
426
|
try {
|
|
427
|
-
const { requireWorkspaceRoot } = await import("./output-root-
|
|
427
|
+
const { requireWorkspaceRoot } = await import("./output-root-BRhzhhXZ.mjs").then((n) => n.t);
|
|
428
428
|
requireWorkspaceRoot();
|
|
429
429
|
await withGraphMcpClient("chain-insights-cli-scam-topology", async (client, config) => {
|
|
430
|
-
const { scamTopology } = await import("./public-tools-
|
|
430
|
+
const { scamTopology } = await import("./public-tools-D6Q5MTcO.mjs");
|
|
431
431
|
const incidentTimestampMs = optionalNumber(opts.incidentTimestampMs);
|
|
432
432
|
if (incidentTimestampMs === void 0) throw new Error("incident-timestamp-ms is required");
|
|
433
433
|
const caseId = opts.case ? await resolveCaseSelector(opts.case) : void 0;
|
|
@@ -448,13 +448,13 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
448
448
|
}
|
|
449
449
|
})).addCommand(new Command("call").description("Call an MCP tool directly (debug)").argument("<tool>", "Tool name to call").argument("[args...]", "Key=value arguments (e.g. address=0x1234 chain=ethereum)").action(async (tool, rawArgs) => {
|
|
450
450
|
try {
|
|
451
|
-
const { parseMcpCallArgs } = await import("./call-args-
|
|
452
|
-
const { assertPublicMcpToolName } = await import("./tool-visibility-
|
|
451
|
+
const { parseMcpCallArgs } = await import("./call-args-DPXdX3_D.mjs");
|
|
452
|
+
const { assertPublicMcpToolName } = await import("./tool-visibility-BHRFLXuU.mjs").then((n) => n.n);
|
|
453
453
|
const args = parseMcpCallArgs(rawArgs);
|
|
454
454
|
assertPublicMcpToolName(tool);
|
|
455
455
|
await withGraphMcpClient("chain-insights-cli-call", async (client, config) => {
|
|
456
456
|
if (tool === "address_risk") {
|
|
457
|
-
const { addressRisk } = await import("./public-tools-
|
|
457
|
+
const { addressRisk } = await import("./public-tools-D6Q5MTcO.mjs");
|
|
458
458
|
const result = await addressRisk(client, {
|
|
459
459
|
address: String(args["address"] ?? ""),
|
|
460
460
|
network: String(args["network"] ?? ""),
|
|
@@ -464,7 +464,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
464
464
|
return;
|
|
465
465
|
}
|
|
466
466
|
if (tool === "track_funds") {
|
|
467
|
-
const { trackFunds } = await import("./public-tools-
|
|
467
|
+
const { trackFunds } = await import("./public-tools-D6Q5MTcO.mjs");
|
|
468
468
|
const result = await trackFunds(client, config, {
|
|
469
469
|
trustedAddresses: args["trusted_addresses"] ?? "",
|
|
470
470
|
untrustedAddresses: args["untrusted_addresses"],
|
|
@@ -479,7 +479,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
|
|
|
479
479
|
return;
|
|
480
480
|
}
|
|
481
481
|
if (tool === "scam_topology") {
|
|
482
|
-
const { scamTopology } = await import("./public-tools-
|
|
482
|
+
const { scamTopology } = await import("./public-tools-D6Q5MTcO.mjs");
|
|
483
483
|
const victimAddress = String(args["victim_address"] ?? "").trim();
|
|
484
484
|
if (!victimAddress) throw new Error("victim_address is required");
|
|
485
485
|
const incidentTimestampMs = optionalNumberArg(args["incident_timestamp_ms"], "incident_timestamp_ms");
|
|
@@ -511,14 +511,14 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
511
511
|
}).addCommand(new Command("open").description("Open a new investigation case").argument("<name>", "Case name (e.g. \"Tornado Mixer Investigation\")").option("--tags <tags>", "Comma-separated tags (e.g. aml,mixer,defi)", "").option("--description <desc>", "Brief description of the investigation", "").action(async (name, opts) => {
|
|
512
512
|
try {
|
|
513
513
|
if (/^[1-9]\d*$/.test(name.trim())) throw new Error("Numeric case names look like list selectors. Use a descriptive case name, e.g. `cia case open \"Tracking stolen funds from <address>\"`.");
|
|
514
|
-
const { CaseStore } = await import("./cases-
|
|
514
|
+
const { CaseStore } = await import("./cases-qjPtbnUd.mjs");
|
|
515
515
|
const tags = opts.tags ? opts.tags.split(",").map((t) => t.trim()).filter(Boolean) : [];
|
|
516
516
|
const c = await CaseStore.create({
|
|
517
517
|
name,
|
|
518
518
|
tags,
|
|
519
519
|
description: opts.description
|
|
520
520
|
});
|
|
521
|
-
const { casesRoot } = await import("./store-
|
|
521
|
+
const { casesRoot } = await import("./store-BT2SCcQr.mjs");
|
|
522
522
|
console.log(`Case opened: ${c.id}`);
|
|
523
523
|
console.log(`Directory: ${path.join(casesRoot(), c.id)}/`);
|
|
524
524
|
console.log(`Status: ${c.status}`);
|
|
@@ -528,7 +528,7 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
528
528
|
}
|
|
529
529
|
})).addCommand(new Command("activate").description("Activate a case (set status to active)").argument("<case-id>", "Case ID to activate").action(async (caseSelector) => {
|
|
530
530
|
try {
|
|
531
|
-
const { CaseStore } = await import("./cases-
|
|
531
|
+
const { CaseStore } = await import("./cases-qjPtbnUd.mjs");
|
|
532
532
|
const caseId = await resolveCaseSelector(caseSelector);
|
|
533
533
|
const c = await CaseStore.setStatus(caseId, "active");
|
|
534
534
|
console.log(`Case ${c.id} is now: active`);
|
|
@@ -538,7 +538,7 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
538
538
|
}
|
|
539
539
|
})).addCommand(new Command("suspend").description("Suspend a case (set status to suspended)").argument("<case-id>", "Case ID to suspend").action(async (caseSelector) => {
|
|
540
540
|
try {
|
|
541
|
-
const { CaseStore } = await import("./cases-
|
|
541
|
+
const { CaseStore } = await import("./cases-qjPtbnUd.mjs");
|
|
542
542
|
const caseId = await resolveCaseSelector(caseSelector);
|
|
543
543
|
const c = await CaseStore.setStatus(caseId, "suspended");
|
|
544
544
|
console.log(`Case ${c.id} is now: suspended`);
|
|
@@ -548,7 +548,7 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
548
548
|
}
|
|
549
549
|
})).addCommand(new Command("close").description("Close a case permanently").argument("<case-id>", "Case ID to close").action(async (caseSelector) => {
|
|
550
550
|
try {
|
|
551
|
-
const { CaseStore } = await import("./cases-
|
|
551
|
+
const { CaseStore } = await import("./cases-qjPtbnUd.mjs");
|
|
552
552
|
const caseId = await resolveCaseSelector(caseSelector);
|
|
553
553
|
const c = await CaseStore.setStatus(caseId, "closed");
|
|
554
554
|
console.log(`Case ${c.id} is now: closed`);
|
|
@@ -558,7 +558,7 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
558
558
|
}
|
|
559
559
|
})).addCommand(new Command("list").description("List all investigation cases").option("--status <status>", "Filter by status (open|active|suspended|closed)").action(async (opts) => {
|
|
560
560
|
try {
|
|
561
|
-
const { CaseStore } = await import("./cases-
|
|
561
|
+
const { CaseStore } = await import("./cases-qjPtbnUd.mjs");
|
|
562
562
|
const cases = await CaseStore.list();
|
|
563
563
|
const filtered = opts.status ? cases.filter((c) => c.status === opts.status) : cases;
|
|
564
564
|
if (filtered.length === 0) {
|
|
@@ -572,7 +572,7 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
572
572
|
}
|
|
573
573
|
})).addCommand(new Command("evidence").description("Manage case evidence").addCommand(new Command("add").description("Add evidence to a case from an MCP query result").argument("<case-id>", "Case ID to add evidence to").option("--source <tool>", "MCP tool name that produced this evidence", "manual").option("--content <text>", "Evidence content (MCP response or notes)", "").option("--query-params <params>", "Query parameters used (e.g. address=0x1234)", "").action(async (caseSelector, opts) => {
|
|
574
574
|
try {
|
|
575
|
-
const { EvidenceStore } = await import("./cases-
|
|
575
|
+
const { EvidenceStore } = await import("./cases-qjPtbnUd.mjs");
|
|
576
576
|
const caseId = await resolveCaseSelector(caseSelector);
|
|
577
577
|
const result = await EvidenceStore.append(caseId, {
|
|
578
578
|
source: opts.source,
|
|
@@ -587,7 +587,7 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
587
587
|
}
|
|
588
588
|
})).addCommand(new Command("verify").description("Verify evidence manifest integrity for a case").argument("<case-id>", "Case ID to verify").action(async (caseSelector) => {
|
|
589
589
|
try {
|
|
590
|
-
const { EvidenceStore } = await import("./cases-
|
|
590
|
+
const { EvidenceStore } = await import("./cases-qjPtbnUd.mjs");
|
|
591
591
|
const caseId = await resolveCaseSelector(caseSelector);
|
|
592
592
|
const result = await EvidenceStore.verifyManifest(caseId);
|
|
593
593
|
if (result.ok) console.log(`Manifest OK — ${result.count} evidence file(s) verified`);
|
|
@@ -601,7 +601,7 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
601
601
|
}
|
|
602
602
|
}))).addCommand(new Command("dossier").description("Manage entity dossiers for a case").addCommand(new Command("update").description("Append a finding to an entity dossier").argument("<case-id>", "Case ID").argument("<address>", "Entity address or identifier").option("--finding <text>", "Finding to append to the dossier", "").option("--type <type>", "Entity type (eoa|contract|exchange|mixer|unknown)", "unknown").action(async (caseSelector, address, opts) => {
|
|
603
603
|
try {
|
|
604
|
-
const { DossierStore } = await import("./cases-
|
|
604
|
+
const { DossierStore } = await import("./cases-qjPtbnUd.mjs");
|
|
605
605
|
const caseId = await resolveCaseSelector(caseSelector);
|
|
606
606
|
const entityType = [
|
|
607
607
|
"eoa",
|
|
@@ -618,7 +618,7 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
618
618
|
}
|
|
619
619
|
}))).addCommand(new Command("session").description("Manage investigation sessions").addCommand(new Command("start").description("Start a new investigation session for a case").argument("<case-id>", "Case ID").argument("[title...]", "Optional session title").action(async (caseSelector, titleParts) => {
|
|
620
620
|
try {
|
|
621
|
-
const { SessionStore } = await import("./cases-
|
|
621
|
+
const { SessionStore } = await import("./cases-qjPtbnUd.mjs");
|
|
622
622
|
const caseId = await resolveCaseSelector(caseSelector);
|
|
623
623
|
const title = titleParts.join(" ").trim();
|
|
624
624
|
const s = await SessionStore.start(caseId, title ? { title } : {});
|
|
@@ -629,7 +629,7 @@ const caseCommand = new Command("case").description("Manage investigation cases"
|
|
|
629
629
|
}
|
|
630
630
|
})).addCommand(new Command("end").description("End the current session with findings and next steps").argument("<case-id>", "Case ID").option("--findings <text>", "Key findings from this session", "").option("--next-steps <text>", "Next steps for the investigation", "").action(async (caseSelector, opts) => {
|
|
631
631
|
try {
|
|
632
|
-
const { SessionStore } = await import("./cases-
|
|
632
|
+
const { SessionStore } = await import("./cases-qjPtbnUd.mjs");
|
|
633
633
|
const caseId = await resolveCaseSelector(caseSelector);
|
|
634
634
|
await SessionStore.end(caseId, {
|
|
635
635
|
findings: opts.findings,
|
|
@@ -666,9 +666,9 @@ program.command("playbook").description("Run and manage investigation playbooks"
|
|
|
666
666
|
}
|
|
667
667
|
resolvedParams[key] = kv.slice(eq + 1);
|
|
668
668
|
}
|
|
669
|
-
const { resolvePlaybookContent } = await import("./resolver-
|
|
669
|
+
const { resolvePlaybookContent } = await import("./resolver-D7VBb0uB.mjs");
|
|
670
670
|
const markdown = await resolvePlaybookContent(name);
|
|
671
|
-
const { PlaybookParser } = await import("./parser-
|
|
671
|
+
const { PlaybookParser } = await import("./parser-CJfMsOl6.mjs");
|
|
672
672
|
const definition = PlaybookParser.parse(markdown, resolvedParams);
|
|
673
673
|
for (const spec of definition.params) if (spec.required && !resolvedParams[spec.name] && !spec.default) {
|
|
674
674
|
console.error(`Missing required param: ${spec.name}. Pass with: -p ${spec.name}=<value>`);
|
|
@@ -679,7 +679,7 @@ program.command("playbook").description("Run and manage investigation playbooks"
|
|
|
679
679
|
console.error(`Invalid --from value: "${opts.from}". Must be a positive integer.`);
|
|
680
680
|
process.exit(1);
|
|
681
681
|
}
|
|
682
|
-
const { PlaybookRunner } = await import("./runner-
|
|
682
|
+
const { PlaybookRunner } = await import("./runner-BatyCxv7.mjs");
|
|
683
683
|
await PlaybookRunner.run(definition, {
|
|
684
684
|
caseId: opts.case,
|
|
685
685
|
from: fromN,
|
|
@@ -692,7 +692,7 @@ program.command("playbook").description("Run and manage investigation playbooks"
|
|
|
692
692
|
}
|
|
693
693
|
})).addCommand(new Command("list").description("List available playbooks (built-in and user-defined)").action(async () => {
|
|
694
694
|
try {
|
|
695
|
-
const { listPlaybooks } = await import("./resolver-
|
|
695
|
+
const { listPlaybooks } = await import("./resolver-D7VBb0uB.mjs");
|
|
696
696
|
const playbooks = await listPlaybooks();
|
|
697
697
|
if (playbooks.length === 0) {
|
|
698
698
|
console.log("No playbooks found.");
|
|
@@ -705,8 +705,8 @@ program.command("playbook").description("Run and manage investigation playbooks"
|
|
|
705
705
|
}
|
|
706
706
|
})).addCommand(new Command("show").description("Show steps for a playbook without executing").argument("<name>", "Playbook name").action(async (name) => {
|
|
707
707
|
try {
|
|
708
|
-
const { resolvePlaybookContent } = await import("./resolver-
|
|
709
|
-
const { PlaybookParser } = await import("./parser-
|
|
708
|
+
const { resolvePlaybookContent } = await import("./resolver-D7VBb0uB.mjs");
|
|
709
|
+
const { PlaybookParser } = await import("./parser-CJfMsOl6.mjs");
|
|
710
710
|
const markdown = await resolvePlaybookContent(name);
|
|
711
711
|
const definition = PlaybookParser.parse(markdown, {});
|
|
712
712
|
console.log(`Playbook: ${definition.name} v${definition.version}`);
|
|
@@ -729,12 +729,12 @@ program.command("viz").description("Generate money flow visualization").argument
|
|
|
729
729
|
console.error("Provide either a case ID or --data <file.json>");
|
|
730
730
|
process.exit(1);
|
|
731
731
|
}
|
|
732
|
-
const { generateVisualization } = await import("./viz-
|
|
732
|
+
const { generateVisualization } = await import("./viz-DkJyqlUu.mjs").then((n) => n.n);
|
|
733
733
|
const result = await generateVisualization({
|
|
734
734
|
caseId,
|
|
735
735
|
dataFile: opts.data
|
|
736
736
|
});
|
|
737
|
-
const { startServer } = await import("./server-
|
|
737
|
+
const { startServer } = await import("./server-BDlbmGbL.mjs").then((n) => n.t);
|
|
738
738
|
const port = parseInt(opts.port, 10);
|
|
739
739
|
startServer(port);
|
|
740
740
|
const url = `http://127.0.0.1:${port}/viz/${result.vizId}`;
|