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.
Files changed (130) hide show
  1. package/README.md +29 -18
  2. package/dist/{active-Dv7Tu-O4.cjs → active-BVr55kvW.cjs} +1 -1
  3. package/dist/{active-BSrxLKwn.mjs → active-ByNgjuAg.mjs} +2 -2
  4. package/dist/{active-BSrxLKwn.mjs.map → active-ByNgjuAg.mjs.map} +1 -1
  5. package/dist/{app-BjjuQM0B.mjs → app-DdWQF_zb.mjs} +4 -4
  6. package/dist/{app-BjjuQM0B.mjs.map → app-DdWQF_zb.mjs.map} +1 -1
  7. package/dist/{app-Dq1TdB6p.cjs → app-DxlQE_P5.cjs} +4 -4
  8. package/dist/{artifact-server-Dxz5YbuQ.mjs → artifact-server-4DiMvwhC.mjs} +2 -2
  9. package/dist/{artifact-server-Dxz5YbuQ.mjs.map → artifact-server-4DiMvwhC.mjs.map} +1 -1
  10. package/dist/{artifact-server-DoxJ7fCx.cjs → artifact-server-B-3ho4bk.cjs} +1 -2
  11. package/dist/{call-args-Lk_wOJxd.mjs → call-args-DPXdX3_D.mjs} +1 -1
  12. package/dist/{call-args-Lk_wOJxd.mjs.map → call-args-DPXdX3_D.mjs.map} +1 -1
  13. package/dist/{capabilities-DliMBim-.mjs → capabilities-BShqspb-.mjs} +2 -2
  14. package/dist/{capabilities-DliMBim-.mjs.map → capabilities-BShqspb-.mjs.map} +1 -1
  15. package/dist/{capabilities-CB97WMA5.cjs → capabilities-Bm0JDbV7.cjs} +1 -1
  16. package/dist/cases-c0iV-XLI.cjs +9 -0
  17. package/dist/cases-qjPtbnUd.mjs +6 -0
  18. package/dist/cli.cjs +64 -64
  19. package/dist/cli.mjs +63 -63
  20. package/dist/cli.mjs.map +1 -1
  21. package/dist/{client-D4Bq0rp9.mjs → client-D4_hd4AP.mjs} +23 -9
  22. package/dist/client-D4_hd4AP.mjs.map +1 -0
  23. package/dist/{client-D4fZgIaO.cjs → client-DPc2eyVN.cjs} +27 -7
  24. package/dist/{config-BwrBYmiC.mjs → config-9KYXaAv-.mjs} +3 -3
  25. package/dist/{config-BwrBYmiC.mjs.map → config-9KYXaAv-.mjs.map} +1 -1
  26. package/dist/{config-Bmdl5hdk.cjs → config-BhYbhLDI.cjs} +2 -2
  27. package/dist/{dossier-BsroDgD3.mjs → dossier-Bl0NkJKC.mjs} +3 -3
  28. package/dist/{dossier-BsroDgD3.mjs.map → dossier-Bl0NkJKC.mjs.map} +1 -1
  29. package/dist/{dossier-DtxREpPm.cjs → dossier-Br62hCG7.cjs} +3 -3
  30. package/dist/{evidence-BGcdKxuV.cjs → evidence-CvEesemA.cjs} +3 -3
  31. package/dist/{evidence-BhvFW-y_.mjs → evidence-D96PTzOQ.mjs} +3 -3
  32. package/dist/{evidence-BhvFW-y_.mjs.map → evidence-D96PTzOQ.mjs.map} +1 -1
  33. package/dist/{format-Ce1RObVl.mjs → format-Bq94jSyw.mjs} +1 -1
  34. package/dist/{format-Ce1RObVl.mjs.map → format-Bq94jSyw.mjs.map} +1 -1
  35. package/dist/{frontmatter-D8wWCeOa.mjs → frontmatter-D0ccQnUM.mjs} +1 -1
  36. package/dist/{frontmatter-D8wWCeOa.mjs.map → frontmatter-D0ccQnUM.mjs.map} +1 -1
  37. package/dist/{graph-normalizer-Cv9yK9Pg.mjs → graph-normalizer-CXP06jKh.mjs} +1 -1
  38. package/dist/{graph-normalizer-Cv9yK9Pg.mjs.map → graph-normalizer-CXP06jKh.mjs.map} +1 -1
  39. package/dist/{graph-reports-DU05YCei.cjs → graph-reports-B3mkLP8Z.cjs} +3 -3
  40. package/dist/{graph-reports-C4TBjCkM.mjs → graph-reports-BDELxmpi.mjs} +3 -3
  41. package/dist/{graph-reports-C4TBjCkM.mjs.map → graph-reports-BDELxmpi.mjs.map} +1 -1
  42. package/dist/{html-generator-V6Bp0uRb.mjs → html-generator-AowOmzyi.mjs} +2 -2
  43. package/dist/{html-generator-V6Bp0uRb.mjs.map → html-generator-AowOmzyi.mjs.map} +1 -1
  44. package/dist/{html-generator-CAv81IWH.cjs → html-generator-Bx3UcLTB.cjs} +1 -1
  45. package/dist/index.cjs +8 -8
  46. package/dist/index.d.cts.map +1 -1
  47. package/dist/index.d.mts.map +1 -1
  48. package/dist/index.mjs +8 -8
  49. package/dist/{init-BjuFt54X.cjs → init-BvpZtFiT.cjs} +4 -5
  50. package/dist/{init-CaOsHTIo.mjs → init-CZbZegIW.mjs} +4 -5
  51. package/dist/init-CZbZegIW.mjs.map +1 -0
  52. package/dist/mcp-proxy.cjs +75 -38
  53. package/dist/mcp-proxy.d.cts.map +1 -1
  54. package/dist/mcp-proxy.d.mts.map +1 -1
  55. package/dist/mcp-proxy.mjs +74 -37
  56. package/dist/mcp-proxy.mjs.map +1 -1
  57. package/dist/{output-root-CmWM7aV2.mjs → output-root-BRhzhhXZ.mjs} +3 -3
  58. package/dist/{output-root-CmWM7aV2.mjs.map → output-root-BRhzhhXZ.mjs.map} +1 -1
  59. package/dist/{output-root-CFYms3ad.cjs → output-root-YIbl6PwF.cjs} +2 -2
  60. package/dist/{parser-BUIWW1OH.cjs → parser-BXLAHYnZ.cjs} +1 -1
  61. package/dist/{parser-DO0_SssG.mjs → parser-CJfMsOl6.mjs} +1 -1
  62. package/dist/{parser-DO0_SssG.mjs.map → parser-CJfMsOl6.mjs.map} +1 -1
  63. package/dist/{public-tools-D4UI-Zb0.mjs → public-tools-D6Q5MTcO.mjs} +7 -7
  64. package/dist/{public-tools-D4UI-Zb0.mjs.map → public-tools-D6Q5MTcO.mjs.map} +1 -1
  65. package/dist/{public-tools-XSpkz2ky.cjs → public-tools-V7ON7goq.cjs} +7 -7
  66. package/dist/{resolver-zYbu4wDV.cjs → resolver-BUU7ZgW-.cjs} +1 -1
  67. package/dist/{resolver-C2ZS7oC8.mjs → resolver-D7VBb0uB.mjs} +1 -1
  68. package/dist/{resolver-C2ZS7oC8.mjs.map → resolver-D7VBb0uB.mjs.map} +1 -1
  69. package/dist/{runner-BhUHbiHG.mjs → runner-BatyCxv7.mjs} +7 -7
  70. package/dist/{runner-BhUHbiHG.mjs.map → runner-BatyCxv7.mjs.map} +1 -1
  71. package/dist/{runner-1Eq55OYb.cjs → runner-CCA7SJ7X.cjs} +6 -7
  72. package/dist/{schema-8d0rVIdZ.mjs → schema-BbQVXp36.mjs} +2 -2
  73. package/dist/{schema-8d0rVIdZ.mjs.map → schema-BbQVXp36.mjs.map} +1 -1
  74. package/dist/{schema-4XpzDFQM.cjs → schema-DN-KLkYN.cjs} +1 -1
  75. package/dist/{schema-cache-CgWRCN2N.cjs → schema-cache-CJk1EL3L.cjs} +1 -1
  76. package/dist/{schema-cache-9CksD7tX.mjs → schema-cache-DwDvPy4e.mjs} +1 -1
  77. package/dist/{schema-cache-9CksD7tX.mjs.map → schema-cache-DwDvPy4e.mjs.map} +1 -1
  78. package/dist/{selector-xjm6NTHI.mjs → selector-CTUiQrzI.mjs} +2 -2
  79. package/dist/{selector-xjm6NTHI.mjs.map → selector-CTUiQrzI.mjs.map} +1 -1
  80. package/dist/{selector-CkFcTXzz.cjs → selector-DBS2jYH4.cjs} +1 -1
  81. package/dist/{server-BkM5xrXb.mjs → server-BDlbmGbL.mjs} +3 -3
  82. package/dist/{server-BkM5xrXb.mjs.map → server-BDlbmGbL.mjs.map} +1 -1
  83. package/dist/{server-DXowbpfi.cjs → server-C3y1gQmZ.cjs} +2 -2
  84. package/dist/{session-CcTgYxsj.mjs → session-Bha3zFrx.mjs} +3 -3
  85. package/dist/{session-CcTgYxsj.mjs.map → session-Bha3zFrx.mjs.map} +1 -1
  86. package/dist/{session-BpNylyuJ.cjs → session-DwyikazY.cjs} +3 -3
  87. package/dist/{setup-DOpKPrlx.cjs → setup-CDha4B9s.cjs} +1 -1
  88. package/dist/{setup-DyrWHuwQ.mjs → setup-yXK8agdn.mjs} +1 -1
  89. package/dist/{setup-DyrWHuwQ.mjs.map → setup-yXK8agdn.mjs.map} +1 -1
  90. package/dist/{store-BoWE-Gtl.mjs → store-BT2SCcQr.mjs} +5 -5
  91. package/dist/{store-BoWE-Gtl.mjs.map → store-BT2SCcQr.mjs.map} +1 -1
  92. package/dist/{store-BiUhQOIf.cjs → store-DogLawSj.cjs} +5 -5
  93. package/dist/{tool-visibility-3Z_KvO9Q.mjs → tool-visibility-BHRFLXuU.mjs} +2 -2
  94. package/dist/{tool-visibility-3Z_KvO9Q.mjs.map → tool-visibility-BHRFLXuU.mjs.map} +1 -1
  95. package/dist/{tool-visibility-CwgY205r.cjs → tool-visibility-iAVQV3t0.cjs} +1 -1
  96. package/dist/{tools-f_vJUZAF.cjs → tools-DY8h0WbE.cjs} +2 -2
  97. package/dist/{tools-Cp2jAAAb.mjs → tools-Py6SXg6J.mjs} +3 -3
  98. package/dist/{tools-Cp2jAAAb.mjs.map → tools-Py6SXg6J.mjs.map} +1 -1
  99. package/dist/{topup-server-DUjyFftI.mjs → topup-server-6MH7q73X.mjs} +5 -5
  100. package/dist/{topup-server-DUjyFftI.mjs.map → topup-server-6MH7q73X.mjs.map} +1 -1
  101. package/dist/{topup-server-BZuQifvh.cjs → topup-server-DjUjhNjv.cjs} +4 -4
  102. package/dist/{version-1gP19Lhi.mjs → version-BA3J8hu4.mjs} +1 -1
  103. package/dist/{version-1gP19Lhi.mjs.map → version-BA3J8hu4.mjs.map} +1 -1
  104. package/dist/{version-BNGtdpmH.cjs → version-CO9Or_YV.cjs} +0 -1
  105. package/dist/{data-extractor-BNGj7ECT.cjs → viz-Da9YWN_I.cjs} +37 -8
  106. package/dist/{data-extractor-DFzsa5CS.mjs → viz-DkJyqlUu.mjs} +35 -6
  107. package/dist/viz-DkJyqlUu.mjs.map +1 -0
  108. package/dist/{wallet-BMelXBYP.mjs → wallet-D8IqFRKY.mjs} +2 -2
  109. package/dist/{wallet-BMelXBYP.mjs.map → wallet-D8IqFRKY.mjs.map} +1 -1
  110. package/dist/{wallet-RnvvSpV2.cjs → wallet-TAlNMvIM.cjs} +1 -1
  111. package/docs/architecture.md +1 -2
  112. package/docs/graph-tools.md +3 -3
  113. package/package.json +24 -4
  114. package/skills/chain-insights-investigation/SKILL.md +9 -9
  115. package/skills/chain-insights-trace-funds/SKILL.md +3 -3
  116. package/skills/test-chain-insights-graphrag-mcp/SKILL.md +1 -1
  117. package/dist/cases-By7INiOa.mjs +0 -6
  118. package/dist/cases-CDcNU91B.cjs +0 -9
  119. package/dist/client-D4Bq0rp9.mjs.map +0 -1
  120. package/dist/data-extractor-DFzsa5CS.mjs.map +0 -1
  121. package/dist/init-CaOsHTIo.mjs.map +0 -1
  122. package/dist/viz-BlCJe6Tk.mjs +0 -35
  123. package/dist/viz-BlCJe6Tk.mjs.map +0 -1
  124. package/dist/viz-ClezVXrJ.cjs +0 -44
  125. /package/dist/{call-args-DQA2QcRA.cjs → call-args-CcUV6gFS.cjs} +0 -0
  126. /package/dist/{chunk-CZWwpsFl.cjs → chunk-DakpK96I.cjs} +0 -0
  127. /package/dist/{format-DOrPvXEr.cjs → format-9NLBykEL.cjs} +0 -0
  128. /package/dist/{frontmatter-DgAuai7E.cjs → frontmatter-Dvqa5HX6.cjs} +0 -0
  129. /package/dist/{graph-normalizer-DeIj6Ses.cjs → graph-normalizer-DbjlbMpz.cjs} +0 -0
  130. /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-1gP19Lhi.mjs";
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-xjm6NTHI.mjs");
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-BSrxLKwn.mjs").then((n) => n.n);
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-By7INiOa.mjs");
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-BwrBYmiC.mjs").then((n) => n.t);
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-D4Bq0rp9.mjs").then((n) => n.t);
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-BwrBYmiC.mjs").then((n) => n.t);
94
- const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import("./capabilities-DliMBim-.mjs");
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-CmWM7aV2.mjs").then((n) => n.t);
109
+ const { requireWorkspaceRoot } = await import("./output-root-BRhzhhXZ.mjs").then((n) => n.t);
110
110
  const workspaceRoot = requireWorkspaceRoot();
111
- const { startServer } = await import("./server-BkM5xrXb.mjs").then((n) => n.t);
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-BwrBYmiC.mjs").then((n) => n.t);
121
- const { findActiveWorkspace, activeDataDir } = await import("./active-BSrxLKwn.mjs").then((n) => n.n);
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-BwrBYmiC.mjs").then((n) => n.t);
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-BwrBYmiC.mjs").then((n) => n.t);
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-BwrBYmiC.mjs").then((n) => n.t);
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-BwrBYmiC.mjs").then((n) => n.t);
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-BwrBYmiC.mjs").then((n) => n.t);
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-BwrBYmiC.mjs").then((n) => n.t);
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-CaOsHTIo.mjs");
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-DyrWHuwQ.mjs");
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-BwrBYmiC.mjs").then((n) => n.t);
252
- const { CONFIG_KEYS } = await import("./schema-8d0rVIdZ.mjs").then((n) => n.r);
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-BMelXBYP.mjs").then((n) => n.s);
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-BwrBYmiC.mjs").then((n) => n.t);
273
- const { CONFIG_KEYS, DEFAULT_CONFIG } = await import("./schema-8d0rVIdZ.mjs").then((n) => n.r);
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-Cp2jAAAb.mjs").then((n) => n.s);
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-Cp2jAAAb.mjs").then((n) => n.s);
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-Cp2jAAAb.mjs").then((n) => n.s);
306
- const { startTopupServer } = await import("./topup-server-DUjyFftI.mjs").then((n) => n.r);
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-9CksD7tX.mjs");
337
- const { formatToolsTable } = await import("./format-Ce1RObVl.mjs");
338
- const { visibleRemoteTools } = await import("./tool-visibility-3Z_KvO9Q.mjs").then((n) => n.n);
339
- const { loadConfig } = await import("./config-BwrBYmiC.mjs").then((n) => n.t);
340
- const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import("./client-D4Bq0rp9.mjs").then((n) => n.t);
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-D4UI-Zb0.mjs");
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-CmWM7aV2.mjs").then((n) => n.t);
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-D4UI-Zb0.mjs");
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-CmWM7aV2.mjs").then((n) => n.t);
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-D4UI-Zb0.mjs");
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-Lk_wOJxd.mjs");
452
- const { assertPublicMcpToolName } = await import("./tool-visibility-3Z_KvO9Q.mjs").then((n) => n.n);
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-D4UI-Zb0.mjs");
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-D4UI-Zb0.mjs");
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-D4UI-Zb0.mjs");
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-By7INiOa.mjs");
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-BoWE-Gtl.mjs");
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-By7INiOa.mjs");
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-By7INiOa.mjs");
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-By7INiOa.mjs");
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-By7INiOa.mjs");
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-By7INiOa.mjs");
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-By7INiOa.mjs");
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-By7INiOa.mjs");
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-By7INiOa.mjs");
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-By7INiOa.mjs");
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-C2ZS7oC8.mjs");
669
+ const { resolvePlaybookContent } = await import("./resolver-D7VBb0uB.mjs");
670
670
  const markdown = await resolvePlaybookContent(name);
671
- const { PlaybookParser } = await import("./parser-DO0_SssG.mjs");
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-BhUHbiHG.mjs");
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-C2ZS7oC8.mjs");
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-C2ZS7oC8.mjs");
709
- const { PlaybookParser } = await import("./parser-DO0_SssG.mjs");
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-BlCJe6Tk.mjs").then((n) => n.n);
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-BkM5xrXb.mjs").then((n) => n.t);
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}`;