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