chain-insights 0.19.0 → 0.22.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +44 -121
  2. package/bin/cli.js +4 -4
  3. package/bin/install.cjs +137 -113
  4. package/bin/mcp-proxy.cjs +7 -5
  5. package/dist/{action-log-Dfe88TwV.cjs → action-log-HniMMF7f.cjs} +1 -1
  6. package/dist/action-log-diTHyMbV.mjs.map +1 -1
  7. package/dist/active-BQopLul8.mjs.map +1 -1
  8. package/dist/{active-Bj6dohpc.cjs → active-Bc13hJIm.cjs} +1 -1
  9. package/dist/{app-CJwx_2Rr.mjs → app-7NRCqx_Q.mjs} +2 -2
  10. package/dist/app-7NRCqx_Q.mjs.map +1 -0
  11. package/dist/{app-D4Cm69ob.cjs → app-l9JE6bt3.cjs} +5 -5
  12. package/dist/{artifact-server-sJBFGcum.cjs → artifact-server-CH-asxF5.cjs} +3 -2
  13. package/dist/{artifact-server-D1D-_t5l.mjs → artifact-server-DoxJr0z8.mjs} +4 -3
  14. package/dist/artifact-server-DoxJr0z8.mjs.map +1 -0
  15. package/dist/{capabilities-CxvK7LKZ.mjs → capabilities-BZI6qROg.mjs} +2 -2
  16. package/dist/capabilities-BZI6qROg.mjs.map +1 -0
  17. package/dist/{capabilities-CZYijWbg.cjs → capabilities-CPcrxodx.cjs} +2 -2
  18. package/dist/cli.cjs +42 -216
  19. package/dist/cli.mjs +36 -210
  20. package/dist/cli.mjs.map +1 -1
  21. package/dist/{client-Bjxo7AEa.cjs → client-CqAzD519.cjs} +4 -4
  22. package/dist/{client-i3WtsKA4.mjs → client-D4aM4bzP.mjs} +4 -4
  23. package/dist/client-D4aM4bzP.mjs.map +1 -0
  24. package/dist/{config-DE0dUT3P.cjs → config-BVFf3v8-.cjs} +2 -2
  25. package/dist/{config-DA6KRx60.mjs → config-CnNMdt4M.mjs} +2 -2
  26. package/dist/config-CnNMdt4M.mjs.map +1 -0
  27. package/dist/graph-normalizer-BA3Rbd6l.mjs.map +1 -1
  28. package/dist/graph-reports-B6yoYbPq.mjs.map +1 -1
  29. package/dist/{graph-reports-DSHSp5HL.cjs → graph-reports-_gqzxvvs.cjs} +2 -2
  30. package/dist/{html-generator-Ui29DLSD.cjs → html-generator-B9f_GIi2.cjs} +4 -3
  31. package/dist/{html-generator-ClysZjfY.mjs → html-generator-D2BDzLED.mjs} +3 -2
  32. package/dist/{html-generator-ClysZjfY.mjs.map → html-generator-D2BDzLED.mjs.map} +1 -1
  33. package/dist/index.cjs +9 -9
  34. package/dist/index.d.cts +3 -0
  35. package/dist/index.d.cts.map +1 -1
  36. package/dist/index.d.mts +3 -0
  37. package/dist/index.d.mts.map +1 -1
  38. package/dist/index.mjs +9 -9
  39. package/dist/{init-BT3STWBv.mjs → init-Djhml4ih.mjs} +3 -3
  40. package/dist/init-Djhml4ih.mjs.map +1 -0
  41. package/dist/{init-BR4SRTAY.cjs → init-DvrKxK15.cjs} +3 -3
  42. package/dist/limits-D3Mn-gig.mjs.map +1 -1
  43. package/dist/mcp-endpoint-DbWtLcba.mjs.map +1 -1
  44. package/dist/mcp-proxy.cjs +19 -18
  45. package/dist/mcp-proxy.d.cts.map +1 -1
  46. package/dist/mcp-proxy.d.mts.map +1 -1
  47. package/dist/mcp-proxy.mjs +13 -12
  48. package/dist/mcp-proxy.mjs.map +1 -1
  49. package/dist/{merge-CJRZpuZ4.mjs → merge-BZw-pMPN.mjs} +2 -2
  50. package/dist/merge-BZw-pMPN.mjs.map +1 -0
  51. package/dist/{merge-B_5kxbGv.cjs → merge-C52eaAGU.cjs} +1 -1
  52. package/dist/{output-root-C1PFNCqb.cjs → output-root-BewoQaTx.cjs} +2 -2
  53. package/dist/{public-tools-CgiKgYgf.cjs → public-tools-BFs_7U_Z.cjs} +8 -7
  54. package/dist/{public-tools-B9_wXs2o.mjs → public-tools-BjqZGGAC.mjs} +7 -6
  55. package/dist/public-tools-BjqZGGAC.mjs.map +1 -0
  56. package/dist/{rolldown-runtime-DakpK96I.cjs → rolldown-runtime-C0BPl7ul.cjs} +1 -1
  57. package/dist/{schema-DF0aOXII.cjs → schema-BpeV3xDV.cjs} +5 -2
  58. package/dist/{schema-0BVyF-aL.mjs → schema-DOJA2nNi.mjs} +5 -2
  59. package/dist/schema-DOJA2nNi.mjs.map +1 -0
  60. package/dist/{schema-cache-DwDvPy4e.mjs → schema-cache-DJdU4MIP.mjs} +2 -2
  61. package/dist/{schema-cache-DwDvPy4e.mjs.map → schema-cache-DJdU4MIP.mjs.map} +1 -1
  62. package/dist/{schema-cache-CX0r2UQp.cjs → schema-cache-n7Gbhvsj.cjs} +2 -2
  63. package/dist/{server-ta1oyJ2a.cjs → server-CmvzYu7v.cjs} +4 -3
  64. package/dist/{server-BXj6BRI1.mjs → server-mDSRgk1X.mjs} +4 -3
  65. package/dist/server-mDSRgk1X.mjs.map +1 -0
  66. package/dist/tool-visibility-C0ALejXI.mjs.map +1 -1
  67. package/dist/{tool-visibility-DMIEexib.cjs → tool-visibility-DZBAP62b.cjs} +1 -1
  68. package/dist/{tools-CWwX4yth.mjs → tools-BKLnlBG1.mjs} +8 -6
  69. package/dist/tools-BKLnlBG1.mjs.map +1 -0
  70. package/dist/{tools-BPfUpCUR.cjs → tools-lPY6k-vJ.cjs} +8 -6
  71. package/dist/{topup-server-VGl8-Fz5.cjs → topup-server-DAqmAuu1.cjs} +23 -21
  72. package/dist/{topup-server-D2X7My7i.mjs → topup-server-rqI7bqem.mjs} +23 -21
  73. package/dist/topup-server-rqI7bqem.mjs.map +1 -0
  74. package/dist/update-CJUfGCxs.mjs.map +1 -1
  75. package/dist/{usage-status-H1xgCu99.cjs → usage-status-BdwwgYsu.cjs} +2 -2
  76. package/dist/{usage-status-D2uosC7s.mjs → usage-status-CHiOPA-2.mjs} +2 -2
  77. package/dist/usage-status-CHiOPA-2.mjs.map +1 -0
  78. package/dist/version-BA3J8hu4.mjs.map +1 -1
  79. package/dist/{viz-HSwLcKr6.cjs → viz-BJ_kyRjI.cjs} +7 -5
  80. package/dist/{viz-Cq1jSWSH.mjs → viz-Uh_EF-qB.mjs} +6 -4
  81. package/dist/viz-Uh_EF-qB.mjs.map +1 -0
  82. package/dist/{wallet-C2yVjcSY.cjs → wallet-BEvHrHi3.cjs} +3 -2
  83. package/dist/{wallet-BrTTnf7w.mjs → wallet-fMbhvKXT.mjs} +3 -2
  84. package/dist/wallet-fMbhvKXT.mjs.map +1 -0
  85. package/docs/architecture.md +18 -18
  86. package/docs/debugging.md +2 -42
  87. package/docs/development.md +0 -27
  88. package/docs/graph-query-compatibility.md +66 -57
  89. package/docs/graph-tools.md +6 -6
  90. package/docs/investigation-workspaces.md +0 -35
  91. package/docs/mcp-proxy.md +8 -9
  92. package/docs/search-limits.md +8 -8
  93. package/docs/stability.md +4 -5
  94. package/package.json +1 -5
  95. package/skills/chain-insights-cypher/SKILL.md +7 -7
  96. package/skills/chain-insights-cypher/agents/openai.yaml +3 -3
  97. package/skills/chain-insights-schema-bittensor/SKILL.md +26 -26
  98. package/skills/chain-insights-schema-evm/SKILL.md +37 -37
  99. package/dist/app-CJwx_2Rr.mjs.map +0 -1
  100. package/dist/artifact-server-D1D-_t5l.mjs.map +0 -1
  101. package/dist/capabilities-CxvK7LKZ.mjs.map +0 -1
  102. package/dist/cases-C1XewLdx.mjs +0 -155
  103. package/dist/cases-C1XewLdx.mjs.map +0 -1
  104. package/dist/cases-CVtc7Rf8.cjs +0 -160
  105. package/dist/client-i3WtsKA4.mjs.map +0 -1
  106. package/dist/config-CwIb-tav.mjs +0 -33
  107. package/dist/config-CwIb-tav.mjs.map +0 -1
  108. package/dist/config-Cy-qzx4W.cjs +0 -33
  109. package/dist/config-DA6KRx60.mjs.map +0 -1
  110. package/dist/init-9jY5rCcH.cjs +0 -24
  111. package/dist/init-BT3STWBv.mjs.map +0 -1
  112. package/dist/init-BiRfMQcA.mjs +0 -26
  113. package/dist/init-BiRfMQcA.mjs.map +0 -1
  114. package/dist/lock-Cs-a3Ng1.cjs +0 -38
  115. package/dist/lock-D_sWGS7W.mjs +0 -40
  116. package/dist/lock-D_sWGS7W.mjs.map +0 -1
  117. package/dist/merge-CJRZpuZ4.mjs.map +0 -1
  118. package/dist/paths-CffVTUCv.cjs +0 -31
  119. package/dist/paths-_3isihzD.mjs +0 -21
  120. package/dist/paths-_3isihzD.mjs.map +0 -1
  121. package/dist/public-tools-B9_wXs2o.mjs.map +0 -1
  122. package/dist/render-TmSq0f4f.cjs +0 -207
  123. package/dist/render-mxE0Tdsf.mjs +0 -206
  124. package/dist/render-mxE0Tdsf.mjs.map +0 -1
  125. package/dist/report-BFXFrJmj.mjs +0 -36
  126. package/dist/report-BFXFrJmj.mjs.map +0 -1
  127. package/dist/report-BwKQqOCR.cjs +0 -36
  128. package/dist/runner-CSss8Hvy.mjs +0 -33
  129. package/dist/runner-CSss8Hvy.mjs.map +0 -1
  130. package/dist/runner-aErdz2zn.cjs +0 -31
  131. package/dist/schema-0BVyF-aL.mjs.map +0 -1
  132. package/dist/server-BXj6BRI1.mjs.map +0 -1
  133. package/dist/tools-CWwX4yth.mjs.map +0 -1
  134. package/dist/topup-server-D2X7My7i.mjs.map +0 -1
  135. package/dist/usage-status-D2uosC7s.mjs.map +0 -1
  136. package/dist/viz-Cq1jSWSH.mjs.map +0 -1
  137. package/dist/wallet-BrTTnf7w.mjs.map +0 -1
  138. package/docs/monitoring.md +0 -277
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities-BZI6qROg.mjs","names":[],"sources":["../src/mcp/capabilities.ts"],"sourcesContent":["import type { InvestigatorConfig } from '../config/schema.js'\nimport { applyMcpAuthHeaders, resolveGraphMcpEndpoint } from './client.js'\n\nexport interface NetworkTopologyLayer {\n enabled: boolean\n coverage?: {\n from_block?: number\n to_block?: number\n from_timestamp?: string\n to_timestamp?: string\n chain_tip_block?: number\n blocks_behind_tip?: number\n }\n}\n\nexport interface NetworkLayerCapability {\n enabled: boolean\n live?: NetworkTopologyLayer\n archive?: NetworkTopologyLayer\n}\n\nexport interface NetworkCapability {\n network: string\n display_name?: string\n status: string\n default?: boolean\n layers: Record<string, NetworkLayerCapability>\n tools: Record<string, string>\n coverage?: {\n from_block?: number\n to_block?: number\n from_timestamp?: string\n to_timestamp?: string\n chain_tip_block?: number\n blocks_behind_tip?: number\n }\n freshness?: {\n last_processed_at?: string\n last_successful_sync_at?: string\n max_data_age_seconds?: number\n last_processing_duration_seconds?: number\n }\n}\n\nexport interface NetworkCapabilitiesDocument {\n schema: 'chain-insights.network-capabilities.v1'\n networks: NetworkCapability[]\n}\n\nexport const PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS = {\n aml_address_risk: 'available',\n graph_query: 'available',\n graph_query_batch: 'available',\n meta_network_capabilities: 'available',\n meta_usage_status: 'available',\n meta_help: 'available',\n wallet_balance: 'available',\n} as const\nconst AVAILABLE_TOOLS_PER_LINE = 3\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction advertisedNetwork(raw: unknown): NetworkCapability | null {\n if (!isRecord(raw) || typeof raw.network !== 'string' || raw.network.trim() === '') {\n return null\n }\n const network = raw.network.trim()\n const capability: NetworkCapability = {\n network,\n display_name:\n typeof raw.display_name === 'string' && raw.display_name.trim() !== ''\n ? raw.display_name\n : network,\n status: typeof raw.status === 'string' && raw.status.trim() !== '' ? raw.status : 'live',\n layers: {},\n tools: { ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS },\n }\n if (raw.default === true) capability.default = true\n if (raw.default === false) capability.default = false\n if (isRecord(raw.coverage)) capability.coverage = raw.coverage as NetworkCapability['coverage']\n if (isRecord(raw.freshness))\n capability.freshness = raw.freshness as NetworkCapability['freshness']\n return capability\n}\n\n/** Repeat GraphRAG's network list. CIA does not add, drop, or invent names. */\nexport function mirrorGraphNetworkCapabilities(document: {\n networks: unknown[]\n}): NetworkCapabilitiesDocument {\n return {\n schema: 'chain-insights.network-capabilities.v1',\n networks: document.networks\n .map((network) => advertisedNetwork(network))\n .filter((network): network is NetworkCapability => network !== null),\n }\n}\n\nfunction publicNetworkCapabilities(\n document: NetworkCapabilitiesDocument\n): NetworkCapabilitiesDocument {\n return mirrorGraphNetworkCapabilities(document)\n}\n\nfunction metadataNetworksUrl(endpoint: string): URL {\n const url = new URL(endpoint)\n url.pathname = '/metadata/networks'\n url.search = ''\n url.hash = ''\n return url\n}\n\nexport async function fetchNetworkCapabilities(\n config: Pick<InvestigatorConfig, 'graphMcpAuthToken' | 'graphMcpMode' | 'graphMcpEndpoint'>\n): Promise<NetworkCapabilitiesDocument> {\n const endpoint = resolveGraphMcpEndpoint(config)\n const request = metadataNetworksUrl(endpoint)\n const headers = new Headers()\n const token = config.graphMcpAuthToken?.trim()\n if (token) {\n applyMcpAuthHeaders(headers, token)\n }\n let response: Response\n try {\n response = await fetch(request, { headers })\n } catch (err) {\n throw new Error(`network capabilities unavailable at ${request}: ${(err as Error).message}`)\n }\n if (!response.ok) {\n throw new Error(`network capabilities unavailable at ${request}: HTTP ${response.status}`)\n }\n const parsed = (await response.json()) as NetworkCapabilitiesDocument\n if (\n parsed.schema !== 'chain-insights.network-capabilities.v1' ||\n !Array.isArray(parsed.networks)\n ) {\n throw new Error('network capabilities response has unsupported schema')\n }\n return publicNetworkCapabilities(parsed)\n}\n\nfunction availableTools(network: NetworkCapability): string[] {\n const effectiveTools = {\n ...(network.tools ?? {}),\n ...PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,\n }\n const tools = Object.entries(effectiveTools)\n .filter(([, status]) => status === 'available')\n .map(([name]) => name)\n return tools.sort()\n}\n\nfunction availableToolLines(network: NetworkCapability): string[] {\n const tools = availableTools(network)\n if (tools.length === 0) return ['none']\n const lines: string[] = []\n for (let index = 0; index < tools.length; index += AVAILABLE_TOOLS_PER_LINE) {\n lines.push(tools.slice(index, index + AVAILABLE_TOOLS_PER_LINE).join(', '))\n }\n return lines\n}\n\nfunction shortDate(value?: string): string {\n if (!value) return ''\n return value.slice(0, 10)\n}\n\nfunction datasetLabel(network: NetworkCapability): string {\n const coverage = network.coverage\n if (!coverage) return 'unknown'\n const blockRange =\n coverage.from_block !== undefined && coverage.to_block !== undefined\n ? `${coverage.from_block}..${coverage.to_block}`\n : 'blocks unknown'\n const dateRange =\n coverage.from_timestamp && coverage.to_timestamp\n ? `${shortDate(coverage.from_timestamp)}..${shortDate(coverage.to_timestamp)}`\n : ''\n if (blockRange === 'blocks unknown' && dateRange === '') return 'unknown'\n if (blockRange === 'blocks unknown') return dateRange\n if (dateRange === '') return blockRange\n return `${blockRange} / ${dateRange}`\n}\n\nexport function formatNetworkCapabilities(document: NetworkCapabilitiesDocument): string {\n if (document.networks.length === 0) return 'No supported networks advertised.'\n const headers = ['Network', 'Dataset', 'Available tools']\n const widths = [14, 38, 64]\n const row = (values: string[]) =>\n values.map((value, index) => value.padEnd(widths[index]!)).join(' ')\n const networkRows = document.networks.flatMap((network) => {\n const toolLines = availableToolLines(network)\n return toolLines.map((toolLine, index) =>\n row([\n index === 0 ? network.display_name || network.network : '',\n index === 0 ? datasetLabel(network) : '',\n toolLine,\n ])\n )\n })\n return [row(headers), widths.map((width) => '-'.repeat(width)).join(' '), ...networkRows].join(\n '\\n'\n )\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- const require_rolldown_runtime = require("./rolldown-runtime-DakpK96I.cjs");
2
- const require_client = require("./client-Bjxo7AEa.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
2
+ const require_client = require("./client-CqAzD519.cjs");
3
3
  //#region src/mcp/capabilities.ts
4
4
  var capabilities_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
5
5
  PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS: () => PUBLIC_CHAIN_INSIGHTS_TOOL_STATUS,
package/dist/cli.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_rolldown_runtime = require("./rolldown-runtime-DakpK96I.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
2
2
  const require_version = require("./version-CO9Or_YV.cjs");
3
3
  let commander = require("commander");
4
4
  let node_child_process = require("node:child_process");
@@ -50,9 +50,9 @@ function runInstaller(flag) {
50
50
  }
51
51
  }
52
52
  async function withGraphMcpClient(name, fn) {
53
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
53
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
54
54
  const config = await loadConfig();
55
- const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-Bjxo7AEa.cjs")).then((n) => n.client_exports);
55
+ const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-CqAzD519.cjs")).then((n) => n.client_exports);
56
56
  const paymentFetch = await createConfiguredGraphMcpFetch(config);
57
57
  const { Client } = await import("@modelcontextprotocol/sdk/client/index.js");
58
58
  const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
@@ -61,7 +61,7 @@ async function withGraphMcpClient(name, fn) {
61
61
  version: require_version.PACKAGE_VERSION
62
62
  });
63
63
  await client.connect(new StreamableHTTPClientTransport(new URL(resolveGraphMcpEndpoint(config)), { fetch: paymentFetch }));
64
- const { installActionLogging } = await Promise.resolve().then(() => require("./action-log-Dfe88TwV.cjs")).then((n) => n.action_log_exports);
64
+ const { installActionLogging } = await Promise.resolve().then(() => require("./action-log-HniMMF7f.cjs")).then((n) => n.action_log_exports);
65
65
  installActionLogging(client);
66
66
  try {
67
67
  return await fn(client, config);
@@ -70,8 +70,8 @@ async function withGraphMcpClient(name, fn) {
70
70
  }
71
71
  }
72
72
  async function printNetworkCapabilities(opts) {
73
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
74
- const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-CZYijWbg.cjs")).then((n) => n.capabilities_exports);
73
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
74
+ const { fetchNetworkCapabilities, formatNetworkCapabilities } = await Promise.resolve().then(() => require("./capabilities-CPcrxodx.cjs")).then((n) => n.capabilities_exports);
75
75
  const document = await fetchNetworkCapabilities(await loadConfig());
76
76
  if (opts.json) console.log(JSON.stringify(document, null, 2));
77
77
  else console.log(formatNetworkCapabilities(document));
@@ -86,13 +86,13 @@ program.command("networks").alias("network").description("List supported graph n
86
86
  });
87
87
  program.command("serve").description("Start local visualization server").option("-p, --port <number>", "Port to bind (defaults to the configured serverPort)").action(async (opts) => {
88
88
  try {
89
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
89
+ const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-BewoQaTx.cjs")).then((n) => n.output_root_exports);
90
90
  const workspaceRoot = requireWorkspaceRoot();
91
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
91
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
92
92
  const { resolveServerPort } = await Promise.resolve().then(() => require("./resolve-port-CbaEoODz.cjs"));
93
93
  const config = await loadConfig();
94
94
  const port = resolveServerPort(opts.port, config.serverPort);
95
- const { startServer } = await Promise.resolve().then(() => require("./server-ta1oyJ2a.cjs")).then((n) => n.server_exports);
95
+ const { startServer } = await Promise.resolve().then(() => require("./server-CmvzYu7v.cjs")).then((n) => n.server_exports);
96
96
  console.log(`Workspace: ${workspaceRoot}`);
97
97
  startServer(port);
98
98
  } catch (err) {
@@ -101,8 +101,8 @@ program.command("serve").description("Start local visualization server").option(
101
101
  }
102
102
  });
103
103
  program.command("status").description("Show toolkit status and configuration").action(async () => {
104
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
105
- const { findActiveWorkspace, activeDataDir } = await Promise.resolve().then(() => require("./active-Bj6dohpc.cjs")).then((n) => n.active_exports);
104
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
105
+ const { findActiveWorkspace, activeDataDir } = await Promise.resolve().then(() => require("./active-Bc13hJIm.cjs")).then((n) => n.active_exports);
106
106
  const config = await loadConfig();
107
107
  const workspace = findActiveWorkspace();
108
108
  const graphMcpStatus = config.graphMcpMode === "debug" && config.graphMcpAuthToken?.trim() ? "bearer access mode" : `${config.graphMcpMode} mode`;
@@ -139,7 +139,7 @@ program.command("update").description("Check npmjs for a newer Chain Insights re
139
139
  });
140
140
  program.command("debug").description("Configure Chain Insights Graph debug mode").addCommand(new commander.Command("on").description("Enable Chain Insights Graph debug mode without x402 payments").requiredOption("--token <token>", "Debug bearer token").option("--endpoint <url>", "Chain Insights Graph endpoint").action(async (opts) => {
141
141
  try {
142
- const { saveConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
142
+ const { saveConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
143
143
  await saveConfig({
144
144
  graphMcpMode: "debug",
145
145
  graphMcpAuthToken: opts.token,
@@ -154,7 +154,7 @@ program.command("debug").description("Configure Chain Insights Graph debug mode"
154
154
  }
155
155
  })).addCommand(new commander.Command("off").description("Disable Chain Insights Graph debug mode and use paid x402 calls").action(async () => {
156
156
  try {
157
- const { saveConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
157
+ const { saveConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
158
158
  await saveConfig({
159
159
  graphMcpMode: "paid",
160
160
  graphMcpAuthToken: ""
@@ -167,7 +167,7 @@ program.command("debug").description("Configure Chain Insights Graph debug mode"
167
167
  }
168
168
  })).addCommand(new commander.Command("status").description("Show Chain Insights Graph payment/debug mode").action(async () => {
169
169
  try {
170
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
170
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
171
171
  const config = await loadConfig();
172
172
  console.log(`Chain Insights Graph mode: ${config.graphMcpMode}`);
173
173
  console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
@@ -182,7 +182,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
182
182
  try {
183
183
  const normalizedKey = key.trim();
184
184
  if (!normalizedKey) throw new Error("Test access key is required");
185
- const { saveConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
185
+ const { saveConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
186
186
  await saveConfig({
187
187
  graphMcpMode: "debug",
188
188
  graphMcpAuthToken: normalizedKey,
@@ -197,7 +197,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
197
197
  }
198
198
  })).addCommand(new commander.Command("clear").description("Remove the Chain Insights Graph test access key and use paid x402 calls").action(async () => {
199
199
  try {
200
- const { saveConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
200
+ const { saveConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
201
201
  await saveConfig({
202
202
  graphMcpMode: "paid",
203
203
  graphMcpAuthToken: ""
@@ -210,7 +210,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
210
210
  }
211
211
  })).addCommand(new commander.Command("status").description("Show Chain Insights Graph test access key status").action(async () => {
212
212
  try {
213
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
213
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
214
214
  const config = await loadConfig();
215
215
  console.log(`Graph endpoint: ${config.graphMcpEndpoint}`);
216
216
  console.log(`Access key: ${config.graphMcpAuthToken?.trim() ? "configured" : "not configured"}`);
@@ -222,7 +222,7 @@ program.command("access-key").description("Configure Chain Insights Graph test a
222
222
  }));
223
223
  program.command("init").description("Initialize an investigation workspace").argument("[dir]", "Workspace directory to initialize", ".").option("--force", "Overwrite existing workspace files").action(async (dir, opts) => {
224
224
  try {
225
- const { initWorkspace } = await Promise.resolve().then(() => require("./init-BR4SRTAY.cjs"));
225
+ const { initWorkspace } = await Promise.resolve().then(() => require("./init-DvrKxK15.cjs"));
226
226
  const result = await initWorkspace({
227
227
  targetDir: dir,
228
228
  force: opts.force
@@ -244,8 +244,8 @@ program.command("setup").description("Configure external MCP clients").addComman
244
244
  runInstaller("--hermes");
245
245
  }));
246
246
  program.command("config").description("Read or write configuration values").addCommand(new commander.Command("get").argument("<key>", "Config key to read").action(async (key) => {
247
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
248
- const { CONFIG_KEYS } = await Promise.resolve().then(() => require("./schema-DF0aOXII.cjs")).then((n) => n.schema_exports);
247
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
248
+ const { CONFIG_KEYS } = await Promise.resolve().then(() => require("./schema-BpeV3xDV.cjs")).then((n) => n.schema_exports);
249
249
  if (!CONFIG_KEYS.includes(key)) {
250
250
  console.error(`Unknown config key: ${key}`);
251
251
  process.exit(1);
@@ -255,7 +255,7 @@ program.command("config").description("Read or write configuration values").addC
255
255
  })).addCommand(new commander.Command("set").argument("<key>", "Config key to write").argument("<value>", "Value to set").action(async (key, value) => {
256
256
  if (key === "walletPrivateKey") {
257
257
  try {
258
- const { setWalletPrivateKey } = await Promise.resolve().then(() => require("./wallet-C2yVjcSY.cjs")).then((n) => n.wallet_exports);
258
+ const { setWalletPrivateKey } = await Promise.resolve().then(() => require("./wallet-BEvHrHi3.cjs")).then((n) => n.wallet_exports);
259
259
  const address = await setWalletPrivateKey(value);
260
260
  console.log("Wallet private key encrypted and stored in ~/.chain-insights/wallet.json");
261
261
  console.log(`Wallet address: ${address}`);
@@ -265,8 +265,8 @@ program.command("config").description("Read or write configuration values").addC
265
265
  }
266
266
  return;
267
267
  }
268
- const { loadConfig, saveConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
269
- const { CONFIG_KEYS, DEFAULT_CONFIG } = await Promise.resolve().then(() => require("./schema-DF0aOXII.cjs")).then((n) => n.schema_exports);
268
+ const { loadConfig, saveConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
269
+ const { CONFIG_KEYS, DEFAULT_CONFIG } = await Promise.resolve().then(() => require("./schema-BpeV3xDV.cjs")).then((n) => n.schema_exports);
270
270
  const current = await loadConfig();
271
271
  if (!CONFIG_KEYS.includes(key)) {
272
272
  console.error(`Unknown config key: ${key}`);
@@ -281,7 +281,7 @@ program.command("config").description("Read or write configuration values").addC
281
281
  }));
282
282
  program.command("wallet").description("Manage the local Base USDC payment wallet").addCommand(new commander.Command("import").description("Import a Base payment wallet").argument("<private-key>", "0x-prefixed EVM private key").option("--force", "Replace an existing wallet (the previous key is backed up next to wallet.json)").action(async (privateKey, opts) => {
283
283
  try {
284
- const { setWalletPrivateKey, isWalletConfigured } = await Promise.resolve().then(() => require("./wallet-C2yVjcSY.cjs")).then((n) => n.wallet_exports);
284
+ const { setWalletPrivateKey, isWalletConfigured } = await Promise.resolve().then(() => require("./wallet-BEvHrHi3.cjs")).then((n) => n.wallet_exports);
285
285
  const replacing = opts.force === true && await isWalletConfigured();
286
286
  const address = await setWalletPrivateKey(privateKey, { force: opts.force });
287
287
  if (replacing) console.log("Previous wallet key backed up next to ~/.chain-insights/wallet.json");
@@ -293,7 +293,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
293
293
  }
294
294
  })).addCommand(new commander.Command("address").description("Print the local payment wallet address").action(async () => {
295
295
  try {
296
- const { getWalletAccount } = await Promise.resolve().then(() => require("./tools-BPfUpCUR.cjs")).then((n) => n.tools_exports);
296
+ const { getWalletAccount } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
297
297
  const account = await getWalletAccount();
298
298
  console.log(account.address);
299
299
  } catch (err) {
@@ -302,7 +302,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
302
302
  }
303
303
  })).addCommand(new commander.Command("balance").description("Show the local payment wallet Base USDC balance").action(async () => {
304
304
  try {
305
- const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-BPfUpCUR.cjs")).then((n) => n.tools_exports);
305
+ const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
306
306
  console.log(await getWalletBalanceText());
307
307
  } catch (err) {
308
308
  console.error(err.message);
@@ -310,7 +310,7 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
310
310
  }
311
311
  })).addCommand(new commander.Command("ready").description("Check and prepare the wallet for paid Chain Insights Graph calls").option("--check-only", "Only check readiness; do not submit the one-time payment setup").addOption(new commander.Option("--no-approve", "Deprecated alias for --check-only").hideHelp()).option("--payment-usdc <amount>", "USDC setup cap to prepare for paid calls", "1").addOption(new commander.Option("--approval-usdc <amount>", "Deprecated alias for --payment-usdc").hideHelp()).option("--json", "Print machine-readable readiness metadata").action(async (opts) => {
312
312
  try {
313
- const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await Promise.resolve().then(() => require("./tools-BPfUpCUR.cjs")).then((n) => n.tools_exports);
313
+ const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
314
314
  const result = await prepareWalletForPaidCalls({
315
315
  minimumApprovalUnits: parsePaymentApprovalUnits(opts.paymentUsdc ?? opts.approvalUsdc ?? "1"),
316
316
  approve: opts.checkOnly ? false : opts.approve !== false
@@ -326,8 +326,8 @@ program.command("wallet").description("Manage the local Base USDC payment wallet
326
326
  }
327
327
  })).addCommand(new commander.Command("topup").description("Open a local browser page to top up the payment wallet").option("--no-open", "Print the top-up URL without opening a browser").option("--json", "Print machine-readable top-up metadata").action(async (opts) => {
328
328
  try {
329
- const { buildTopupInfo, getWalletAccount } = await Promise.resolve().then(() => require("./tools-BPfUpCUR.cjs")).then((n) => n.tools_exports);
330
- const { startTopupServer } = await Promise.resolve().then(() => require("./topup-server-VGl8-Fz5.cjs")).then((n) => n.topup_server_exports);
329
+ const { buildTopupInfo, getWalletAccount } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
330
+ const { startTopupServer } = await Promise.resolve().then(() => require("./topup-server-DAqmAuu1.cjs")).then((n) => n.topup_server_exports);
331
331
  const account = await getWalletAccount();
332
332
  const url = await startTopupServer(account);
333
333
  const info = buildTopupInfo(account.address, url);
@@ -357,11 +357,11 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
357
357
  }
358
358
  })).addCommand(new commander.Command("tools").description("List available MCP tools (cached 24h)").option("--refresh", "Force refresh schema cache").action(async (opts) => {
359
359
  try {
360
- const { loadSchema, saveSchema } = await Promise.resolve().then(() => require("./schema-cache-CX0r2UQp.cjs"));
360
+ const { loadSchema, saveSchema } = await Promise.resolve().then(() => require("./schema-cache-n7Gbhvsj.cjs"));
361
361
  const { formatToolsTable } = await Promise.resolve().then(() => require("./format-9NLBykEL.cjs"));
362
- const { visibleRemoteTools } = await Promise.resolve().then(() => require("./tool-visibility-DMIEexib.cjs")).then((n) => n.tool_visibility_exports);
363
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
364
- const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-Bjxo7AEa.cjs")).then((n) => n.client_exports);
362
+ const { visibleRemoteTools } = await Promise.resolve().then(() => require("./tool-visibility-DZBAP62b.cjs")).then((n) => n.tool_visibility_exports);
363
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
364
+ const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-CqAzD519.cjs")).then((n) => n.client_exports);
365
365
  const config = await loadConfig();
366
366
  const graphMcpEndpoint = resolveGraphMcpEndpoint(config);
367
367
  let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint);
@@ -389,7 +389,7 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
389
389
  })).addCommand(new commander.Command("aml-address-risk").description("Screen an address for AML risk, exchange behavior, and optional comparison with another address").requiredOption("--address <address>", "Full blockchain address to screen").requiredOption("--network <network>", "Network to query. Run `cia mcp networks` for supported networks.").option("--compare-address <address>", "Optional second address to compare against the screened address").action(async (opts) => {
390
390
  try {
391
391
  await withGraphMcpClient("chain-insights-cli-aml-address-risk", async (client) => {
392
- const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-CgiKgYgf.cjs"));
392
+ const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-BFs_7U_Z.cjs"));
393
393
  const result = await addressRisk(client, {
394
394
  address: opts.address,
395
395
  network: opts.network,
@@ -404,12 +404,12 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
404
404
  })).addCommand(new commander.Command("call").description("Call an MCP tool directly (debug)").argument("<tool>", "Tool name to call").argument("[args...]", "Key=value arguments (e.g. address=0x1234... network=robinhood)").action(async (tool, rawArgs) => {
405
405
  try {
406
406
  const { parseMcpCallArgs } = await Promise.resolve().then(() => require("./call-args-DAiQSDmD.cjs"));
407
- const { assertPublicMcpToolName, validatePublicMcpToolArguments } = await Promise.resolve().then(() => require("./tool-visibility-DMIEexib.cjs")).then((n) => n.tool_visibility_exports);
407
+ const { assertPublicMcpToolName, validatePublicMcpToolArguments } = await Promise.resolve().then(() => require("./tool-visibility-DZBAP62b.cjs")).then((n) => n.tool_visibility_exports);
408
408
  const args = parseMcpCallArgs(rawArgs);
409
409
  assertPublicMcpToolName(tool);
410
410
  validatePublicMcpToolArguments(tool, args);
411
411
  if (tool === "wallet_balance") {
412
- const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-BPfUpCUR.cjs")).then((n) => n.tools_exports);
412
+ const { getWalletBalanceText } = await Promise.resolve().then(() => require("./tools-lPY6k-vJ.cjs")).then((n) => n.tools_exports);
413
413
  console.log(await getWalletBalanceText());
414
414
  return;
415
415
  }
@@ -429,15 +429,15 @@ program.command("mcp").description("Interact with the Chain Insights MCP endpoin
429
429
  arguments: {}
430
430
  }));
431
431
  } catch (err) {
432
- const { isMissingUsageStatusToolError, primitiveBackendUsageStatus, usageStatusText } = await Promise.resolve().then(() => require("./usage-status-H1xgCu99.cjs")).then((n) => n.usage_status_exports);
432
+ const { isMissingUsageStatusToolError, primitiveBackendUsageStatus, usageStatusText } = await Promise.resolve().then(() => require("./usage-status-BdwwgYsu.cjs")).then((n) => n.usage_status_exports);
433
433
  if (!isMissingUsageStatusToolError(err)) throw err;
434
- const { resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-Bjxo7AEa.cjs")).then((n) => n.client_exports);
434
+ const { resolveGraphMcpEndpoint } = await Promise.resolve().then(() => require("./client-CqAzD519.cjs")).then((n) => n.client_exports);
435
435
  console.log(usageStatusText(primitiveBackendUsageStatus(resolveGraphMcpEndpoint(config))));
436
436
  }
437
437
  return;
438
438
  }
439
439
  if (tool === "aml_address_risk") {
440
- const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-CgiKgYgf.cjs"));
440
+ const { addressRisk } = await Promise.resolve().then(() => require("./public-tools-BFs_7U_Z.cjs"));
441
441
  const result = await addressRisk(client, {
442
442
  address: String(args["address"] ?? ""),
443
443
  network: String(args["network"] ?? ""),
@@ -462,16 +462,16 @@ program.command("viz").description("Generate a workspace visualization").argumen
462
462
  console.error("Provide either a visualization source ID or --data <file.json>");
463
463
  process.exit(1);
464
464
  }
465
- const { loadConfig } = await Promise.resolve().then(() => require("./config-DE0dUT3P.cjs")).then((n) => n.config_exports);
465
+ const { loadConfig } = await Promise.resolve().then(() => require("./config-BVFf3v8-.cjs")).then((n) => n.config_exports);
466
466
  const { resolveServerPort } = await Promise.resolve().then(() => require("./resolve-port-CbaEoODz.cjs"));
467
467
  const config = await loadConfig();
468
468
  const port = resolveServerPort(opts.port, config.serverPort);
469
- const { generateVisualization } = await Promise.resolve().then(() => require("./viz-HSwLcKr6.cjs")).then((n) => n.viz_exports);
469
+ const { generateVisualization } = await Promise.resolve().then(() => require("./viz-BJ_kyRjI.cjs")).then((n) => n.viz_exports);
470
470
  const result = await generateVisualization({
471
471
  sourceId,
472
472
  dataFile: opts.data
473
473
  });
474
- const { startServer } = await Promise.resolve().then(() => require("./server-ta1oyJ2a.cjs")).then((n) => n.server_exports);
474
+ const { startServer } = await Promise.resolve().then(() => require("./server-CmvzYu7v.cjs")).then((n) => n.server_exports);
475
475
  startServer(port);
476
476
  const url = `http://127.0.0.1:${port}/viz/${result.vizId}`;
477
477
  console.log(`Visualization: ${url}`);
@@ -482,180 +482,6 @@ program.command("viz").description("Generate a workspace visualization").argumen
482
482
  process.exit(1);
483
483
  }
484
484
  });
485
- const MONITOR_EXIT_ISOLATED = 2;
486
- async function appendRunLog(workspaceRoot, doc) {
487
- const { monitorPaths } = await Promise.resolve().then(() => require("./paths-CffVTUCv.cjs")).then((n) => n.paths_exports);
488
- const { appendFile, mkdir } = await import("node:fs/promises");
489
- const { logsDir } = monitorPaths(workspaceRoot);
490
- await mkdir(logsDir, { recursive: true });
491
- await appendFile(`${logsDir}/monitor-runs.jsonl`, `${JSON.stringify(doc)}\n`, "utf8");
492
- }
493
- const monitor = program.command("monitor").description("Case tracking: per-case dossier rendering, one cron-safe pass at a time. Docs: docs/monitoring.md");
494
- monitor.command("run").description("One monitoring pass: render the dossier of every open case").action(async () => {
495
- try {
496
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
497
- const workspaceRoot = requireWorkspaceRoot();
498
- const { loadMonitorConfig } = await Promise.resolve().then(() => require("./config-Cy-qzx4W.cjs"));
499
- const { runMonitorOnce } = await Promise.resolve().then(() => require("./runner-aErdz2zn.cjs"));
500
- const { acquireRunLock } = await Promise.resolve().then(() => require("./lock-Cs-a3Ng1.cjs"));
501
- const lock = await acquireRunLock(workspaceRoot);
502
- if (!lock.acquired) {
503
- console.log(`[monitor] already running (pid ${lock.holderPid}); exiting`);
504
- return;
505
- }
506
- let exitCode = 0;
507
- try {
508
- const doc = await runMonitorOnce(void 0, workspaceRoot, await loadMonitorConfig(workspaceRoot), Date.now());
509
- await appendRunLog(workspaceRoot, doc);
510
- const failed = doc.cases.filter((c) => c.error);
511
- console.log(`[monitor] run ${doc.run_timestamp}: ${doc.cases.length} case(s)`);
512
- for (const cell of failed) console.error(`[monitor] ${cell.case_id} FAILED: ${cell.error}`);
513
- if (failed.length > 0) exitCode = MONITOR_EXIT_ISOLATED;
514
- } finally {
515
- await lock.release();
516
- }
517
- if (exitCode !== 0) process.exit(exitCode);
518
- } catch (err) {
519
- console.error(err.message);
520
- process.exit(1);
521
- }
522
- });
523
- 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) => {
524
- try {
525
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
526
- const workspaceRoot = requireWorkspaceRoot();
527
- const { loadMonitorConfig } = await Promise.resolve().then(() => require("./config-Cy-qzx4W.cjs"));
528
- const { renderCaseFromDoc, renderAllCasesFromDoc } = await Promise.resolve().then(() => require("./render-TmSq0f4f.cjs"));
529
- const config = await loadMonitorConfig(workspaceRoot);
530
- const outcomes = caseId ? [{
531
- case_id: caseId,
532
- ...await renderCaseFromDoc(workspaceRoot, caseId, config, Date.now(), { force: opts.force })
533
- }] : await renderAllCasesFromDoc(workspaceRoot, config, Date.now(), { force: opts.force });
534
- if (outcomes.length === 0) console.log("[render] no open cases");
535
- for (const o of outcomes) console.log(o.rendered ? `[render] ${o.case_id}: rendered` : `[render] ${o.case_id}: skipped (${o.skipped_reason})`);
536
- } catch (err) {
537
- console.error(err.message);
538
- process.exit(1);
539
- }
540
- });
541
- monitor.command("status").description("Show monitor status: open cases and last run").action(async () => {
542
- try {
543
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
544
- const workspaceRoot = requireWorkspaceRoot();
545
- const { statusText } = await Promise.resolve().then(() => require("./report-BwKQqOCR.cjs"));
546
- console.log(await statusText(workspaceRoot));
547
- } catch (err) {
548
- console.error(err.message);
549
- process.exit(1);
550
- }
551
- });
552
- 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) => {
553
- try {
554
- 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)`);
555
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
556
- const workspaceRoot = requireWorkspaceRoot();
557
- const { initVictimWorkspace } = await Promise.resolve().then(() => require("./init-9jY5rCcH.cjs"));
558
- const result = await initVictimWorkspace(workspaceRoot, {
559
- caseId: opts.caseId,
560
- network: opts.network,
561
- seeds: opts.seed,
562
- note: opts.note
563
- }, Date.now());
564
- console.log("Victim monitoring initialized.");
565
- console.log(` case: ${result.monitorCase.case_id} (stolen-funds, ${result.monitorCase.network}, ${result.monitorCase.seeds.length} seed(s))`);
566
- console.log(` config: ${result.configPath}`);
567
- console.log("");
568
- console.log("Next steps:");
569
- console.log(" cia monitor run # render the dossier for every open case");
570
- console.log(" Schedule it with cron, pm2, or your agent harness (docs/monitoring.md \"Scheduling\")");
571
- console.log(`Dossier after the first run: published/cases/${result.monitorCase.case_id}/dossier.md`);
572
- } catch (err) {
573
- console.error(err.message);
574
- process.exit(1);
575
- }
576
- });
577
- const monitorCase = monitor.command("case").description("Manage incident-centric monitor cases (stolen-funds, scam-topology)");
578
- 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 commander.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) => {
579
- try {
580
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
581
- const workspaceRoot = requireWorkspaceRoot();
582
- const { addCase } = await Promise.resolve().then(() => require("./cases-CVtc7Rf8.cjs"));
583
- const created = await addCase(workspaceRoot, {
584
- case_id: caseId,
585
- type: opts.type,
586
- network: opts.network,
587
- seeds: opts.seed,
588
- note: opts.note
589
- }, Date.now());
590
- console.log(`Case created: ${created.case_id} (${created.type}, ${created.network}, ${created.seeds.length} seed(s))`);
591
- } catch (err) {
592
- console.error(err.message);
593
- process.exit(1);
594
- }
595
- });
596
- monitorCase.command("list").description("List monitor cases (open only by default)").option("--all", "Include closed cases").action(async (opts) => {
597
- try {
598
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
599
- const workspaceRoot = requireWorkspaceRoot();
600
- const { listCases } = await Promise.resolve().then(() => require("./cases-CVtc7Rf8.cjs"));
601
- const cases = await listCases(workspaceRoot, { openOnly: !opts.all });
602
- if (cases.length === 0) {
603
- console.log("(no cases)");
604
- return;
605
- }
606
- console.log("case_id type network status seeds");
607
- for (const c of cases) console.log(`${c.case_id}\t${c.type}\t${c.network}\t${c.status}\t${c.seeds.join(",")}`);
608
- } catch (err) {
609
- console.error(err.message);
610
- process.exit(1);
611
- }
612
- });
613
- 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) => {
614
- try {
615
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
616
- const workspaceRoot = requireWorkspaceRoot();
617
- const { addCaseSeeds } = await Promise.resolve().then(() => require("./cases-CVtc7Rf8.cjs"));
618
- const { monitorCase: updated, added } = await addCaseSeeds(workspaceRoot, caseId, opts.address, Date.now(), { note: opts.note });
619
- if (added.length === 0) {
620
- console.log(`Case ${updated.case_id} unchanged: all ${opts.address.length} address(es) are already seeds (${updated.seeds.length} seed(s)).`);
621
- return;
622
- }
623
- console.log(`Case ${updated.case_id}: added ${added.length} seed(s) [${added.join(", ")}], now ${updated.seeds.length} seed(s).`);
624
- 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.");
625
- } catch (err) {
626
- console.error(err.message);
627
- process.exit(1);
628
- }
629
- });
630
- 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) => {
631
- try {
632
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
633
- const workspaceRoot = requireWorkspaceRoot();
634
- const { removeCaseSeeds } = await Promise.resolve().then(() => require("./cases-CVtc7Rf8.cjs"));
635
- const { monitorCase: updated, removed } = await removeCaseSeeds(workspaceRoot, caseId, opts.address, Date.now());
636
- if (removed.length === 0) {
637
- console.log(`Case ${updated.case_id} unchanged: none of the ${opts.address.length} address(es) is a seed (${updated.seeds.length} seed(s)).`);
638
- return;
639
- }
640
- console.log(`Case ${updated.case_id}: removed ${removed.length} seed(s) [${removed.join(", ")}], now ${updated.seeds.length} seed(s).`);
641
- } catch (err) {
642
- console.error(err.message);
643
- process.exit(1);
644
- }
645
- });
646
- monitorCase.command("close").description("Close a monitor case").argument("<case-id>", "Case identifier").action(async (caseId) => {
647
- try {
648
- const { requireWorkspaceRoot } = await Promise.resolve().then(() => require("./output-root-C1PFNCqb.cjs")).then((n) => n.output_root_exports);
649
- const workspaceRoot = requireWorkspaceRoot();
650
- const { closeCase } = await Promise.resolve().then(() => require("./cases-CVtc7Rf8.cjs"));
651
- const { monitorCase, alreadyClosed } = await closeCase(workspaceRoot, caseId, Date.now());
652
- if (alreadyClosed) console.warn(`Warning: case "${caseId}" is already closed (closed_at ${monitorCase.closed_at_timestamp}); nothing changed.`);
653
- else console.log(`Case closed: ${monitorCase.case_id}`);
654
- } catch (err) {
655
- console.error(err.message);
656
- process.exit(1);
657
- }
658
- });
659
485
  program.parseAsync(process.argv).catch((err) => {
660
486
  console.error(err.message);
661
487
  process.exit(1);