chain-insights 0.3.9 → 0.3.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -52
- package/dist/{active-ByNgjuAg.mjs → active-BQopLul8.mjs} +6 -8
- package/dist/active-BQopLul8.mjs.map +1 -0
- package/dist/{active-BVr55kvW.cjs → active-XWv72R1X.cjs} +4 -12
- package/dist/{app-BxojXjtB.cjs → app-DBrqk_iP.cjs} +12 -28
- package/dist/{app-CRd39JJ8.mjs → app-DXwILI_a.mjs} +13 -28
- package/dist/app-DXwILI_a.mjs.map +1 -0
- package/dist/{artifact-server-CP6LXQ9d.mjs → artifact-server-CcmLBv1j.mjs} +2 -2
- package/dist/{artifact-server-CP6LXQ9d.mjs.map → artifact-server-CcmLBv1j.mjs.map} +1 -1
- package/dist/{artifact-server-XbN16DwU.cjs → artifact-server-v0WgTPFT.cjs} +1 -1
- package/dist/{capabilities-BCvkTkIu.mjs → capabilities-CM72SErE.mjs} +2 -2
- package/dist/{capabilities-BCvkTkIu.mjs.map → capabilities-CM72SErE.mjs.map} +1 -1
- package/dist/{capabilities-DOa6EFO-.cjs → capabilities-DGeF-oHc.cjs} +1 -1
- package/dist/cli.cjs +149 -405
- package/dist/cli.mjs +149 -405
- package/dist/cli.mjs.map +1 -1
- package/dist/{client-Y_zqKqJT.cjs → client-BY-56ojr.cjs} +0 -17
- package/dist/{client-BgmHjBHQ.mjs → client-ytTO0mcZ.mjs} +2 -13
- package/dist/{client-BgmHjBHQ.mjs.map → client-ytTO0mcZ.mjs.map} +1 -1
- package/dist/{config-Drgc2HuF.mjs → config-C6zM8Xir.mjs} +3 -3
- package/dist/{config-Drgc2HuF.mjs.map → config-C6zM8Xir.mjs.map} +1 -1
- package/dist/{config-BwVx19Og.cjs → config-CkW404Cs.cjs} +2 -2
- package/dist/{graph-reports-BDELxmpi.mjs → graph-reports-CEq-Mvx0.mjs} +2 -2
- package/dist/{graph-reports-BDELxmpi.mjs.map → graph-reports-CEq-Mvx0.mjs.map} +1 -1
- package/dist/{graph-reports-B3mkLP8Z.cjs → graph-reports-CkglRtg4.cjs} +1 -1
- package/dist/{html-generator-Bx3UcLTB.cjs → html-generator-BFKafL8y.cjs} +5 -6
- package/dist/{html-generator-AowOmzyi.mjs → html-generator-D4fX71hI.mjs} +6 -6
- package/dist/html-generator-D4fX71hI.mjs.map +1 -0
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +1 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/{init-CKQ6F07J.mjs → init-BGDvGreX.mjs} +52 -55
- package/dist/init-BGDvGreX.mjs.map +1 -0
- package/dist/{init-Dhw8F23z.cjs → init-Cuw9TznI.cjs} +51 -54
- package/dist/{mcp-endpoint-DHs1cRFH.mjs → mcp-endpoint-QQ5Lbqc2.mjs} +5 -2
- package/dist/mcp-endpoint-QQ5Lbqc2.mjs.map +1 -0
- package/dist/{mcp-endpoint-BaV8h_lq.cjs → mcp-endpoint-cQIZSjkK.cjs} +4 -1
- package/dist/mcp-proxy.cjs +650 -771
- package/dist/mcp-proxy.d.cts.map +1 -1
- package/dist/mcp-proxy.d.mts.map +1 -1
- package/dist/mcp-proxy.mjs +651 -772
- package/dist/mcp-proxy.mjs.map +1 -1
- package/dist/{output-root-BRhzhhXZ.mjs → output-root-BK4pdjyz.mjs} +6 -3
- package/dist/output-root-BK4pdjyz.mjs.map +1 -0
- package/dist/{output-root-YIbl6PwF.cjs → output-root-DI0tzA0X.cjs} +5 -2
- package/dist/{public-tools-BY3PTw6x.cjs → public-tools-BREojpU7.cjs} +1244 -426
- package/dist/{public-tools-CvlZcysd.mjs → public-tools-brHmHGYm.mjs} +1240 -428
- package/dist/public-tools-brHmHGYm.mjs.map +1 -0
- package/dist/{schema-BFEWhzg7.mjs → schema-D_qwaQA5.mjs} +2 -2
- package/dist/{schema-BFEWhzg7.mjs.map → schema-D_qwaQA5.mjs.map} +1 -1
- package/dist/{schema-Vl9yuOFO.cjs → schema-Dr6JXSOF.cjs} +1 -1
- package/dist/{server-BXLX2j_A.mjs → server-BK4bfOiv.mjs} +2 -2
- package/dist/{server-BXLX2j_A.mjs.map → server-BK4bfOiv.mjs.map} +1 -1
- package/dist/{server-BqVdWath.cjs → server-ColyTG1t.cjs} +1 -1
- package/dist/templates/graph.html +1 -1
- package/dist/{tool-visibility-Buq7YdUZ.cjs → tool-visibility--QPgrRE5.cjs} +5 -1
- package/dist/{tool-visibility-BpyZHRBi.mjs → tool-visibility-nr6XqO1F.mjs} +6 -2
- package/dist/tool-visibility-nr6XqO1F.mjs.map +1 -0
- package/dist/viz-BBvY-wXz.cjs +210 -0
- package/dist/viz-D8umSF-t.mjs +199 -0
- package/dist/viz-D8umSF-t.mjs.map +1 -0
- package/docs/architecture.md +4 -3
- package/docs/contributing.md +12 -6
- package/docs/graph-tools.md +93 -68
- package/docs/investigation-workspaces.md +38 -124
- package/docs/mcp-proxy.md +23 -34
- package/package.json +2 -2
- package/skills/chain-insights-address-risk/SKILL.md +92 -0
- package/skills/chain-insights-bittensor-cypher/SKILL.md +2 -22
- package/skills/chain-insights-developer-experience/SKILL.md +8 -28
- package/skills/chain-insights-exposure-analysis/SKILL.md +83 -0
- package/skills/chain-insights-investigation/SKILL.md +59 -211
- package/skills/chain-insights-investigation/agents/openai.yaml +1 -1
- package/skills/chain-insights-investigation/scripts/run-target-uat.sh +37 -55
- package/skills/chain-insights-trace-funds/SKILL.md +14 -14
- package/skills/ci-status/SKILL.md +9 -15
- package/skills/test-chain-insights-graphrag-mcp/SKILL.md +5 -4
- package/skills/test-chain-insights-graphrag-mcp/scripts/run-uat.sh +272 -18
- package/dist/active-ByNgjuAg.mjs.map +0 -1
- package/dist/app-CRd39JJ8.mjs.map +0 -1
- package/dist/canvas-Cn-maEIh.mjs +0 -203
- package/dist/canvas-Cn-maEIh.mjs.map +0 -1
- package/dist/canvas-p-oKCMjc.cjs +0 -251
- package/dist/cases-Bz_9XKEw.cjs +0 -19
- package/dist/cases-TVcAifxu.mjs +0 -16
- package/dist/cases-TVcAifxu.mjs.map +0 -1
- package/dist/data-extractor-B4nHw1wZ.mjs +0 -336
- package/dist/data-extractor-B4nHw1wZ.mjs.map +0 -1
- package/dist/data-extractor-DS4rzy3M.cjs +0 -353
- package/dist/dossier-BXy57V4-.cjs +0 -88
- package/dist/dossier-Bjpcbcxa.mjs +0 -78
- package/dist/dossier-Bjpcbcxa.mjs.map +0 -1
- package/dist/evidence-CvEesemA.cjs +0 -200
- package/dist/evidence-D96PTzOQ.mjs +0 -195
- package/dist/evidence-D96PTzOQ.mjs.map +0 -1
- package/dist/export-CBhcJuZ6.mjs +0 -394
- package/dist/export-CBhcJuZ6.mjs.map +0 -1
- package/dist/export-D4v4-6F4.cjs +0 -394
- package/dist/frontmatter-D0ccQnUM.mjs +0 -26
- package/dist/frontmatter-D0ccQnUM.mjs.map +0 -1
- package/dist/frontmatter-Dvqa5HX6.cjs +0 -35
- package/dist/html-generator-AowOmzyi.mjs.map +0 -1
- package/dist/init-CKQ6F07J.mjs.map +0 -1
- package/dist/mcp-endpoint-DHs1cRFH.mjs.map +0 -1
- package/dist/output-root-BRhzhhXZ.mjs.map +0 -1
- package/dist/parser-BXLAHYnZ.cjs +0 -182
- package/dist/parser-CJfMsOl6.mjs +0 -182
- package/dist/parser-CJfMsOl6.mjs.map +0 -1
- package/dist/public-tools-CvlZcysd.mjs.map +0 -1
- package/dist/resolver-2jXNtWQO.mjs +0 -184
- package/dist/resolver-2jXNtWQO.mjs.map +0 -1
- package/dist/resolver-CZdQwKvh.cjs +0 -186
- package/dist/runner-CVnjpqc-.mjs +0 -149
- package/dist/runner-CVnjpqc-.mjs.map +0 -1
- package/dist/runner-bLy0pTr_.cjs +0 -147
- package/dist/selector-BvXM9jbe.mjs +0 -12
- package/dist/selector-BvXM9jbe.mjs.map +0 -1
- package/dist/selector-Dps_ZFxq.cjs +0 -10
- package/dist/session-BT7VpbAd.cjs +0 -127
- package/dist/session-DROyhebe.mjs +0 -117
- package/dist/session-DROyhebe.mjs.map +0 -1
- package/dist/store-C2B_AssI.mjs +0 -231
- package/dist/store-C2B_AssI.mjs.map +0 -1
- package/dist/store-CQhU8dz8.cjs +0 -242
- package/dist/tool-visibility-BpyZHRBi.mjs.map +0 -1
- package/dist/vault-B2y78Ypu.cjs +0 -560
- package/dist/vault-z35Dohdq.mjs +0 -560
- package/dist/vault-z35Dohdq.mjs.map +0 -1
- package/dist/viz-D1620cBX.cjs +0 -44
- package/dist/viz-DB5XFG1z.mjs +0 -35
- package/dist/viz-DB5XFG1z.mjs.map +0 -1
- package/docs/knowledge-exports.md +0 -204
- package/docs/obsidian-vault.md +0 -130
- package/skills/ci-case/SKILL.md +0 -43
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["import { Command, Option } from 'commander'\nimport { execFileSync } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\nimport path from 'node:path'\nimport { PACKAGE_INFO, PACKAGE_VERSION } from './version.js'\n\n// Resolve bin/install.cjs relative to this file's location in dist/\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\nconst installerPath = path.resolve(__dirname, '..', 'bin', 'install.cjs')\n\nconst program = new Command()\n\nprogram\n .name('chain-insights')\n .description('AML investigation toolkit for blockchain analysis')\n .version(PACKAGE_INFO.version)\n .option('--claude', 'Install Claude Code skills globally to ~/.claude/skills/')\n .option('--codex', 'Install Codex skills globally to ~/.codex/skills/ and register MCP')\n .option('--hermes', 'Install Hermes skills globally to ~/.hermes/skills/chain-insights/ and register MCP')\n\n// Handle installer flags when invoked with no subcommand (bare `chain-insights --claude`)\nconst rawArgs = process.argv.slice(2)\nconst installerFlags = rawArgs.filter(a => a === '--claude' || a === '--codex' || a === '--hermes')\nif (installerFlags.length > 0 && !rawArgs.some(a => !a.startsWith('-'))) {\n try {\n execFileSync(process.execPath, [installerPath, ...installerFlags], { stdio: 'inherit' })\n } catch (err) {\n console.error('Installation failed:', (err as Error).message)\n process.exit(1)\n }\n process.exit(0)\n}\n\nif (rawArgs[0] === 'mcp' && ['trace-funds', 'track-funds', 'scam-topology'].includes(rawArgs[1] ?? '')) {\n console.error(`error: unknown command '${rawArgs[1]}'`)\n process.exit(1)\n}\n\nasync function resolveCaseSelector(input: string): Promise<string> {\n const { resolveCaseSelector } = await import('./cases/selector.js')\n return resolveCaseSelector(input)\n}\n\nasync function scopeCasesToInvocationDir(): Promise<void> {\n if (process.env['CHAIN_INSIGHTS_CASES_ROOT']?.trim()) return\n const { activeCasesRoot } = await import('./workspace/active.js')\n process.env['CHAIN_INSIGHTS_CASES_ROOT'] = activeCasesRoot()\n}\n\nasync function showCaseContext(caseSelector: string): Promise<void> {\n const { CaseStore } = await import('./cases/index.js')\n const caseId = await resolveCaseSelector(caseSelector)\n const ctx = await CaseStore.loadContext(caseId)\n console.log(`\\n=== Case: ${ctx.case.id} ===`)\n console.log(`Name: ${ctx.case.name}`)\n console.log(`Status: ${ctx.case.status}`)\n console.log(`Tags: ${ctx.case.tags.join(', ') || 'none'}`)\n console.log(`Evidence files: ${ctx.evidenceCount}`)\n console.log(`Dossiers: ${ctx.dossierSummaries.length}`)\n if (ctx.lastSession) {\n console.log(`\\n--- Last Session (${ctx.lastSession.sessionId}) ---`)\n console.log(ctx.lastSession.body.slice(0, 500))\n } else {\n console.log('\\nNo previous sessions.')\n }\n if (ctx.dossierSummaries.length > 0) {\n console.log('\\n--- Entity Dossiers ---')\n for (const d of ctx.dossierSummaries) {\n console.log(` ${d.address} [${d.type}] tags: ${d.riskTags || 'none'}`)\n }\n }\n}\n\nfunction optionalNumber(value: string | undefined): number | undefined {\n if (value === undefined) return undefined\n const parsed = Number(value)\n if (!Number.isFinite(parsed)) throw new Error(`Invalid number: ${value}`)\n return parsed\n}\n\nfunction optionalNumberArg(value: unknown, name: string): number | undefined {\n if (value === undefined) return undefined\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string') return optionalNumber(value)\n throw new Error(`Invalid number for ${name}: ${String(value)}`)\n}\n\nasync function withGraphMcpClient<T>(name: string, fn: (client: import('@modelcontextprotocol/sdk/client/index.js').Client, config: Awaited<ReturnType<typeof import('./config/index.js').loadConfig>>) => Promise<T>): Promise<T> {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } = await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name, version: PACKAGE_VERSION })\n await client.connect(new StreamableHTTPClientTransport(new URL(resolveGraphMcpEndpoint(config)), { fetch: paymentFetch }))\n try {\n return await fn(client, config)\n } finally {\n await client.close()\n }\n}\n\nfunction printMcpTextContent(result: { content?: Array<{ type: string; text?: string }> }): void {\n for (const item of result.content ?? []) {\n if (item.type === 'text') console.log(item.text)\n }\n}\n\nasync function printNetworkCapabilities(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n if (opts.json) {\n console.log(JSON.stringify(document, null, 2))\n } else {\n console.log(formatNetworkCapabilities(document))\n }\n}\n\nprogram\n .command('networks')\n .alias('network')\n .description('List supported graph networks, capability layers, retention, and freshness')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkCapabilities(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('serve')\n .description('Start local visualization server')\n .option('-p, --port <number>', 'Port to bind (default: 4321)', '4321')\n .action(async (opts: { port: string }) => {\n try {\n const { requireWorkspaceRoot } = await import('./workspace/output-root.js')\n const workspaceRoot = requireWorkspaceRoot()\n const { startServer } = await import('./server/index.js')\n console.log(`Workspace: ${workspaceRoot}`)\n startServer(parseInt(opts.port, 10))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('status')\n .description('Show toolkit status and configuration')\n .action(async () => {\n const { loadConfig } = await import('./config/index.js')\n const { findActiveWorkspace, activeDataDir } = await import('./workspace/active.js')\n const config = await loadConfig()\n const workspace = findActiveWorkspace()\n const graphMcpStatus = config.graphMcpMode === 'debug' && config.graphMcpAuthToken?.trim()\n ? 'bearer access mode'\n : `${config.graphMcpMode} mode`\n console.log('Config: ', activeDataDir(config.dataDir))\n if (workspace) console.log('Workspace:', workspace.root)\n console.log('Server: ', `http://127.0.0.1:${config.serverPort}`)\n console.log('Graph MCP:', graphMcpStatus)\n console.log('Graph endpoint:', config.graphMcpEndpoint)\n })\n\nprogram\n .command('update')\n .description('Check npmjs for a newer Chain Insights release and update this CLI')\n .option('--check', 'Only check for a newer release')\n .option('--dry-run', 'Print the update command without running it')\n .action(async (opts: { check?: boolean; dryRun?: boolean }) => {\n try {\n const { checkForUpdate, runPackageUpdate } = await import('./update.js')\n const result = await checkForUpdate()\n if (result.error) {\n throw new Error(`Could not check npmjs for updates: ${result.error}`)\n }\n if (!result.updateAvailable || !result.latestVersion) {\n console.log(`Chain Insights is up to date (${result.currentVersion}).`)\n return\n }\n\n console.log(`Chain Insights ${result.latestVersion} is available (current ${result.currentVersion}).`)\n if (opts.check) {\n console.log(`Run: ${result.updateCommand}`)\n return\n }\n if (opts.dryRun) {\n console.log(`Would run: ${result.updateCommand}`)\n return\n }\n\n console.log(`Running: ${result.updateCommand}`)\n runPackageUpdate(result.packageName)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('obsidian')\n .description('Manage the local Obsidian investigation vault')\n .addCommand(\n new Command('open')\n .description('Open the current Chain Insights vault in Obsidian')\n .argument('[path]', 'Workspace path to open as an Obsidian vault')\n .action(async (workspacePath?: string) => {\n try {\n const { findActiveWorkspace } = await import('./workspace/active.js')\n const workspace = workspacePath ? path.resolve(workspacePath) : findActiveWorkspace()?.root\n if (!workspace) {\n console.error('No Chain Insights workspace found. Run: cia init .')\n process.exit(1)\n }\n const open = (await import('open')).default\n await open(workspace, { app: { name: 'obsidian' }, wait: false })\n } catch (err) {\n console.error((err as Error).message)\n console.error('Open Obsidian manually and choose \"Open folder as vault\" for this workspace.')\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('debug')\n .description('Configure Graph MCP debug mode')\n .addCommand(\n new Command('on')\n .description('Enable Graph MCP debug mode without x402 payments')\n .requiredOption('--token <token>', 'Debug bearer token')\n .option('--endpoint <url>', 'Graph MCP endpoint')\n .action(async (opts: { token: string; endpoint?: string }) => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({\n graphMcpMode: 'debug',\n graphMcpAuthToken: opts.token,\n ...(opts.endpoint ? { graphMcpEndpoint: opts.endpoint } : {}),\n })\n console.log('Graph MCP debug mode enabled')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled for Graph MCP calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('off')\n .description('Disable Graph MCP debug mode and use paid x402 calls')\n .action(async () => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({ graphMcpMode: 'paid', graphMcpAuthToken: '' })\n console.log('Graph MCP debug mode disabled')\n console.log('Payments: enabled for Graph MCP calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('status')\n .description('Show Graph MCP payment/debug mode')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Graph MCP mode: ${config.graphMcpMode}`)\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(`Debug token: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`)\n console.log(`Payments: ${config.graphMcpMode === 'debug' ? 'disabled' : 'enabled'}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('access-key')\n .description('Configure Graph MCP test access key mode')\n .addCommand(\n new Command('set')\n .description('Use a Graph MCP test access key without x402 payments')\n .argument('<key>', 'Test access key')\n .option('--endpoint <url>', 'Graph MCP endpoint')\n .action(async (key: string, opts: { endpoint?: string }) => {\n try {\n const normalizedKey = key.trim()\n if (!normalizedKey) throw new Error('Test access key is required')\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({\n graphMcpMode: 'debug',\n graphMcpAuthToken: normalizedKey,\n ...(opts.endpoint ? { graphMcpEndpoint: opts.endpoint } : {}),\n })\n console.log('Graph MCP test access key configured')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled when the server accepts this key')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('clear')\n .description('Remove the Graph MCP test access key and use paid x402 calls')\n .action(async () => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({ graphMcpMode: 'paid', graphMcpAuthToken: '' })\n console.log('Graph MCP test access key cleared')\n console.log('Payments: enabled for Graph MCP calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('status')\n .description('Show Graph MCP test access key status')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(`Access key: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`)\n console.log(`Payments: ${config.graphMcpAuthToken?.trim() ? 'disabled when accepted by server' : 'enabled'}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('init')\n .description('Initialize an investigation workspace')\n .argument('[dir]', 'Workspace directory to initialize', '.')\n .option('--force', 'Overwrite existing workspace files')\n .action(async (dir: string, opts: { force?: boolean }) => {\n try {\n const { initWorkspace } = await import('./workspace/init.js')\n const result = await initWorkspace({ targetDir: dir, force: opts.force })\n console.log(`Workspace initialized: ${result.workspaceRoot}`)\n console.log(`Files written: ${result.filesWritten.length}`)\n const { maybePromptForUpdate } = await import('./update.js')\n await maybePromptForUpdate()\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('setup')\n .description('Configure external MCP clients')\n .addCommand(\n new Command('claude-desktop')\n .alias('claude')\n .description('Install or update the Claude Desktop MCP server entry')\n .option('--config <path>', 'Path to claude_desktop_config.json')\n .option('--dry-run', 'Print the intended change without writing files')\n .action(async (opts: { config?: string; dryRun?: boolean }) => {\n try {\n const { setupClaudeDesktop } = await import('./claude-desktop/setup.js')\n const result = await setupClaudeDesktop({\n configPath: opts.config,\n dryRun: opts.dryRun,\n })\n\n console.log(`Claude Desktop config: ${result.configPath}`)\n console.log('MCP server: chain-insights')\n console.log(`Command: ${result.command}`)\n console.log(`Args: ${result.args.join(' ')}`)\n if (result.dryRun) {\n console.log(`Dry run: ${result.changed ? 'would update config' : 'already up to date'}`)\n } else if (result.changed) {\n console.log(`Updated: yes`)\n if (result.backupPath) console.log(`Backup: ${result.backupPath}`)\n } else {\n console.log('Updated: already up to date')\n }\n console.log('Reload required: quit and reopen Claude Desktop; it does not hot-reload MCP config.')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('config')\n .description('Read or write configuration values')\n .addCommand(\n new Command('get')\n .argument('<key>', 'Config key to read')\n .action(async (key: string) => {\n const { loadConfig } = await import('./config/index.js')\n const { CONFIG_KEYS } = await import('./config/schema.js')\n if (!CONFIG_KEYS.includes(key as typeof CONFIG_KEYS[number])) {\n console.error(`Unknown config key: ${key}`)\n process.exit(1)\n }\n const config = await loadConfig()\n const value = (config as Record<string, unknown>)[key]\n console.log(value ?? '')\n })\n )\n .addCommand(\n new Command('set')\n .argument('<key>', 'Config key to write')\n .argument('<value>', 'Value to set')\n .action(async (key: string, value: string) => {\n // D-01: walletPrivateKey is intercepted before saveConfig — the raw private key\n // must NEVER be written to config.json.\n if (key === 'walletPrivateKey') {\n try {\n const { setWalletPrivateKey } = await import('./wallet/index.js')\n const address = await setWalletPrivateKey(value)\n console.log('Wallet private key encrypted and stored in ~/.chain-insights/wallet.json')\n console.log(`Wallet address: ${address}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n return // MUST return — walletPrivateKey must never reach saveConfig or config.json\n }\n const { loadConfig, saveConfig } = await import('./config/index.js')\n const { CONFIG_KEYS, DEFAULT_CONFIG } = await import('./config/schema.js')\n const current = await loadConfig()\n if (!CONFIG_KEYS.includes(key as typeof CONFIG_KEYS[number])) {\n console.error(`Unknown config key: ${key}`)\n process.exit(1)\n }\n const existing = (current as Record<string, unknown>)[key]\n const defaultValue = (DEFAULT_CONFIG as Record<string, unknown>)[key]\n const coerced = typeof existing === 'number' || typeof defaultValue === 'number' ? Number(value) : value\n await saveConfig({ [key]: coerced } as Parameters<typeof saveConfig>[0])\n const displayed = key.toLowerCase().includes('token') ? '[redacted]' : coerced\n console.log(`Set ${key} = ${displayed}`)\n })\n )\n\nprogram\n .command('wallet')\n .description('Manage the local Base USDC payment wallet')\n .addCommand(\n new Command('import')\n .description('Import a Base payment wallet')\n .argument('<private-key>', '0x-prefixed EVM private key')\n .action(async (privateKey: string) => {\n try {\n const { setWalletPrivateKey } = await import('./wallet/index.js')\n const address = await setWalletPrivateKey(privateKey)\n console.log(`Wallet imported: ${address}`)\n console.log('Next: run `chain-insights wallet ready`')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('address')\n .description('Print the local payment wallet address')\n .action(async () => {\n try {\n const { getWalletAccount } = await import('./wallet/tools.js')\n const account = await getWalletAccount()\n console.log(account.address)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('balance')\n .description('Show the local payment wallet Base USDC balance')\n .action(async () => {\n try {\n const { getWalletBalanceText } = await import('./wallet/tools.js')\n console.log(await getWalletBalanceText())\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('ready')\n .description('Check and prepare the wallet for paid GraphRAG MCP calls')\n .option('--check-only', 'Only check readiness; do not submit the one-time payment setup')\n .addOption(new Option('--no-approve', 'Deprecated alias for --check-only').hideHelp())\n .option('--payment-usdc <amount>', 'USDC setup cap to prepare for paid calls', '1')\n .addOption(new Option('--approval-usdc <amount>', 'Deprecated alias for --payment-usdc').hideHelp())\n .option('--json', 'Print machine-readable readiness metadata')\n .action(async (opts: { checkOnly?: boolean; approve?: boolean; paymentUsdc?: string; approvalUsdc?: string; json?: boolean }) => {\n try {\n const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await import('./wallet/tools.js')\n const minimumApprovalUnits = parsePaymentApprovalUnits(opts.paymentUsdc ?? opts.approvalUsdc ?? '1')\n const result = await prepareWalletForPaidCalls({\n minimumApprovalUnits,\n approve: opts.checkOnly ? false : opts.approve !== false,\n })\n\n if (opts.json) {\n console.log(JSON.stringify(result, (_key, value) => (\n typeof value === 'bigint' ? value.toString() : value\n ), 2))\n return\n }\n\n console.log(formatWalletReadiness(result.readiness, result.approval))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('topup')\n .description('Open a local browser page to top up the payment wallet')\n .option('--no-open', 'Print the top-up URL without opening a browser')\n .option('--json', 'Print machine-readable top-up metadata')\n .action(async (opts: { open?: boolean; json?: boolean }) => {\n try {\n const { buildTopupInfo, getWalletAccount } = await import('./wallet/tools.js')\n const { startTopupServer } = await import('./wallet/topup-server.js')\n const account = await getWalletAccount()\n const url = await startTopupServer(account)\n const info = buildTopupInfo(account.address, url)\n\n if (opts.json) {\n console.log(JSON.stringify(info, null, 2))\n } else {\n console.log(`Top-up URL: ${url}`)\n console.log(`Wallet: ${account.address}`)\n console.log('Network: Base')\n console.log('Token: USDC')\n console.log('Press Ctrl+C to stop the top-up server.')\n }\n\n if (opts.open !== false) {\n const open = (await import('open')).default\n await open(url)\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('mcp')\n .description('Interact with the Chain Insights MCP endpoint')\n .allowExcessArguments(false)\n .addCommand(\n new Command('networks')\n .description('List supported graph networks, capability layers, retention, and freshness')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkCapabilities(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('tools')\n .description('List available MCP tools (cached 24h)')\n .option('--refresh', 'Force refresh schema cache')\n .action(async (opts: { refresh?: boolean }) => {\n try {\n const { loadSchema, saveSchema } = await import('./mcp/schema-cache.js')\n const { formatToolsTable } = await import('./mcp/format.js')\n const { visibleRemoteTools } = await import('./mcp/tool-visibility.js')\n const { loadConfig } = await import('./config/index.js')\n const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n const config = await loadConfig()\n const graphMcpEndpoint = resolveGraphMcpEndpoint(config)\n let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint)\n if (!tools) {\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } = await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name: 'chain-insights-cli', version: PACKAGE_VERSION })\n await client.connect(new StreamableHTTPClientTransport(new URL(graphMcpEndpoint), { fetch: paymentFetch }))\n try {\n const result = await client.listTools()\n tools = result.tools as Array<{ name: string; description?: string }>\n await saveSchema(tools, graphMcpEndpoint)\n } finally {\n await client.close()\n }\n }\n console.log(formatToolsTable(visibleRemoteTools(tools)))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('address-risk')\n .description('Screen an address for risk, exchange behavior, and optional compare_address connection risk')\n .requiredOption('--address <address>', 'Full blockchain address to screen')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .option('--compare-address <address>', 'Optional second address for connection-risk compare mode')\n .option('--remote', 'Force remote MCP tool call instead of local Chain Insights recipe')\n .action(async (opts: { address: string; network: string; compareAddress?: string; remote?: boolean }) => {\n try {\n await withGraphMcpClient('chain-insights-cli-address-risk', async (client) => {\n if (opts.remote) {\n const result = await client.callTool({\n name: 'address_risk',\n arguments: {\n address: opts.address,\n network: opts.network,\n ...(opts.compareAddress ? { compare_address: opts.compareAddress } : {}),\n },\n })\n printMcpTextContent(result as { content?: Array<{ type: string; text?: string }> })\n return\n }\n const { addressRisk } = await import('./investigation/public-tools.js')\n const result = await addressRisk(client, {\n address: opts.address,\n network: opts.network,\n compareAddress: opts.compareAddress,\n })\n console.log(result.summaryText)\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('trace-victim-funds')\n .description('Trace victim/source addresses forward to exchange deposit candidates')\n .requiredOption('--victim-addresses <addresses>', 'Comma-separated full victim/source addresses, max 5')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .option('--known-suspect-addresses <addresses>', 'Optional known suspect addresses for context only, max 5')\n .option('--case <id>', 'Case ID to attach compact evidence pointers')\n .option('--incident-timestamp-ms <milliseconds>', 'Optional incident timestamp in milliseconds')\n .option('--max-hops <number>', 'Maximum trace hops, 1-5')\n .option('--per-address-limit <number>', 'Maximum exchange paths/results per address, 1-10')\n .option('--min-amount-sum <number>', 'Minimum r.amount_sum for traced edges')\n .option('--remote', 'Force remote MCP tool call instead of local Chain Insights recipe')\n .action(async (opts: {\n victimAddresses: string\n network: string\n knownSuspectAddresses?: string\n case?: string\n incidentTimestampMs?: string\n maxHops?: string\n perAddressLimit?: string\n minAmountSum?: string\n remote?: boolean\n }) => {\n try {\n const { requireWorkspaceRoot } = await import('./workspace/output-root.js')\n requireWorkspaceRoot()\n await withGraphMcpClient('chain-insights-cli-trace-victim-funds', async (client, config) => {\n if (opts.remote) {\n const result = await client.callTool({\n name: 'trace_victim_funds',\n arguments: {\n victim_addresses: opts.victimAddresses,\n network: opts.network,\n ...(opts.knownSuspectAddresses ? { known_suspect_addresses: opts.knownSuspectAddresses } : {}),\n },\n })\n printMcpTextContent(result as { content?: Array<{ type: string; text?: string }> })\n return\n }\n const { traceVictimFunds } = await import('./investigation/public-tools.js')\n const caseId = opts.case ? await resolveCaseSelector(opts.case) : undefined\n const result = await traceVictimFunds(client, config, {\n victimAddresses: opts.victimAddresses,\n knownSuspectAddresses: opts.knownSuspectAddresses,\n network: opts.network,\n caseId,\n incidentTimestampMs: optionalNumber(opts.incidentTimestampMs),\n maxHops: optionalNumber(opts.maxHops),\n perAddressLimit: optionalNumber(opts.perAddressLimit),\n minAmountSum: optionalNumber(opts.minAmountSum),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('trace-suspect-funds')\n .description('Trace suspected scammer, mule, operator, or laundering-ring addresses forward to cashout topology')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .requiredOption('--suspect-addresses <addresses>', 'Comma-separated full suspect-controlled addresses, max 5')\n .option('--incident-timestamp-ms <milliseconds>', 'Optional incident timestamp in milliseconds')\n .option('--max-hops <number>', 'Maximum trace hops, default 3, max 5')\n .option('--per-address-limit <number>', 'Maximum exchange paths/results per address, 1-10')\n .option('--min-amount-sum <number>', 'Minimum r.amount_sum for traced edges')\n .option('--case <id>', 'Case ID to attach compact evidence pointers')\n .action(async (opts: {\n network: string\n suspectAddresses: string\n incidentTimestampMs?: string\n maxHops?: string\n perAddressLimit?: string\n minAmountSum?: string\n case?: string\n }) => {\n try {\n const { requireWorkspaceRoot } = await import('./workspace/output-root.js')\n requireWorkspaceRoot()\n await withGraphMcpClient('chain-insights-cli-trace-suspect-funds', async (client, config) => {\n const { traceSuspectFunds } = await import('./investigation/public-tools.js')\n const caseId = opts.case ? await resolveCaseSelector(opts.case) : undefined\n const result = await traceSuspectFunds(client, config, {\n suspectAddresses: opts.suspectAddresses,\n network: opts.network,\n maxHops: optionalNumber(opts.maxHops),\n perAddressLimit: optionalNumber(opts.perAddressLimit),\n minAmountSum: optionalNumber(opts.minAmountSum),\n incidentTimestampMs: optionalNumber(opts.incidentTimestampMs),\n caseId,\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('trace-deposit-sources')\n .description('Trace backward from suspected deposit/cashout addresses to upstream sources and convergence')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .requiredOption('--deposit-addresses <addresses>', 'Comma-separated full suspected deposit/cashout addresses, max 5')\n .option('--max-hops <number>', 'Maximum reverse traceback hops, default 2, max 5')\n .option('--case <id>', 'Case ID to attach compact evidence pointers')\n .action(async (opts: {\n network: string\n depositAddresses: string\n maxHops?: string\n case?: string\n }) => {\n try {\n const { requireWorkspaceRoot } = await import('./workspace/output-root.js')\n requireWorkspaceRoot()\n await withGraphMcpClient('chain-insights-cli-trace-deposit-sources', async (client, config) => {\n const { traceDepositSources } = await import('./investigation/public-tools.js')\n const caseId = opts.case ? await resolveCaseSelector(opts.case) : undefined\n const result = await traceDepositSources(client, config, {\n depositAddresses: opts.depositAddresses,\n network: opts.network,\n maxHops: optionalNumber(opts.maxHops),\n caseId,\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('stake-insights')\n .description('Explain Bittensor staking behavior around an address, coldkey, or hotkey')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .option('--address <address>', 'Full Bittensor address to inspect as either coldkey or hotkey')\n .option('--coldkey <address>', 'Full Bittensor coldkey address to inspect')\n .option('--hotkey <address>', 'Full Bittensor hotkey address to inspect')\n .option('--netuid <number>', 'Optional subnet netuid filter')\n .option('--start-timestamp-ms <milliseconds>', 'Optional inclusive lower activity timestamp bound')\n .option('--end-timestamp-ms <milliseconds>', 'Optional inclusive upper activity timestamp bound')\n .option('--start-block <number>', 'Optional start block. Current stake graph parity may require timestamp windows instead.')\n .option('--end-block <number>', 'Optional end block. Current stake graph parity may require timestamp windows instead.')\n .option('--depth <number>', 'Optional expansion depth limit, default 1, max 3')\n .action(async (opts: {\n network: string\n address?: string\n coldkey?: string\n hotkey?: string\n netuid?: string\n startTimestampMs?: string\n endTimestampMs?: string\n startBlock?: string\n endBlock?: string\n depth?: string\n }) => {\n try {\n await withGraphMcpClient('chain-insights-cli-stake-insights', async (client) => {\n const { stakeInsights } = await import('./investigation/public-tools.js')\n const result = await stakeInsights(client, {\n network: opts.network,\n address: opts.address,\n coldkey: opts.coldkey,\n hotkey: opts.hotkey,\n netuid: optionalNumber(opts.netuid),\n startTimestampMs: optionalNumber(opts.startTimestampMs),\n endTimestampMs: optionalNumber(opts.endTimestampMs),\n startBlock: optionalNumber(opts.startBlock),\n endBlock: optionalNumber(opts.endBlock),\n depth: optionalNumber(opts.depth),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('call')\n .description('Call an MCP tool directly (debug)')\n .argument('<tool>', 'Tool name to call')\n .argument('[args...]', 'Key=value arguments (e.g. address=0x1234 chain=ethereum)')\n .action(async (tool: string, rawArgs: string[]) => {\n try {\n const { parseMcpCallArgs } = await import('./mcp/call-args.js')\n const { assertPublicMcpToolName } = await import('./mcp/tool-visibility.js')\n const args = parseMcpCallArgs(rawArgs)\n assertPublicMcpToolName(tool)\n await withGraphMcpClient('chain-insights-cli-call', async (client, config) => {\n if (tool === 'address_risk') {\n const { addressRisk } = await import('./investigation/public-tools.js')\n const result = await addressRisk(client, {\n address: String(args['address'] ?? ''),\n network: String(args['network'] ?? ''),\n compareAddress: args['compare_address'] === undefined ? undefined : String(args['compare_address']),\n })\n console.log(result.summaryText)\n return\n }\n if (tool === 'trace_victim_funds') {\n const { traceVictimFunds } = await import('./investigation/public-tools.js')\n const result = await traceVictimFunds(client, config, {\n victimAddresses: args['victim_addresses'] as string | string[] | undefined ?? '',\n knownSuspectAddresses: args['known_suspect_addresses'] as string | string[] | undefined,\n network: String(args['network'] ?? ''),\n caseId: args['case_id'] === undefined ? undefined : String(args['case_id']),\n incidentTimestampMs: optionalNumberArg(args['incident_timestamp_ms'], 'incident_timestamp_ms'),\n maxHops: typeof args['max_hops'] === 'number' ? args['max_hops'] : undefined,\n perAddressLimit: typeof args['per_address_limit'] === 'number' ? args['per_address_limit'] : undefined,\n minAmountSum: typeof args['min_amount_sum'] === 'number' ? args['min_amount_sum'] : undefined,\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n return\n }\n if (tool === 'trace_suspect_funds') {\n const { traceSuspectFunds } = await import('./investigation/public-tools.js')\n const result = await traceSuspectFunds(client, config, {\n suspectAddresses: args['suspect_addresses'] as string | string[] | undefined ?? '',\n network: String(args['network'] ?? ''),\n caseId: args['case_id'] === undefined ? undefined : String(args['case_id']),\n maxHops: typeof args['max_hops'] === 'number' ? args['max_hops'] : undefined,\n perAddressLimit: typeof args['per_address_limit'] === 'number' ? args['per_address_limit'] : undefined,\n minAmountSum: typeof args['min_amount_sum'] === 'number' ? args['min_amount_sum'] : undefined,\n incidentTimestampMs: optionalNumberArg(args['incident_timestamp_ms'], 'incident_timestamp_ms'),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n return\n }\n if (tool === 'trace_deposit_sources') {\n const { traceDepositSources } = await import('./investigation/public-tools.js')\n const result = await traceDepositSources(client, config, {\n depositAddresses: args['deposit_addresses'] as string | string[] | undefined ?? '',\n network: String(args['network'] ?? ''),\n caseId: args['case_id'] === undefined ? undefined : String(args['case_id']),\n maxHops: typeof args['max_hops'] === 'number' ? args['max_hops'] : undefined,\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n return\n }\n if (tool === 'stake_insights') {\n const { stakeInsights } = await import('./investigation/public-tools.js')\n const result = await stakeInsights(client, {\n network: String(args['network'] ?? ''),\n address: args['address'] === undefined ? undefined : String(args['address']),\n coldkey: args['coldkey'] === undefined ? undefined : String(args['coldkey']),\n hotkey: args['hotkey'] === undefined ? undefined : String(args['hotkey']),\n netuid: optionalNumberArg(args['netuid'], 'netuid'),\n startTimestampMs: optionalNumberArg(args['start_timestamp_ms'], 'start_timestamp_ms'),\n endTimestampMs: optionalNumberArg(args['end_timestamp_ms'], 'end_timestamp_ms'),\n startBlock: optionalNumberArg(args['start_block'], 'start_block'),\n endBlock: optionalNumberArg(args['end_block'], 'end_block'),\n depth: optionalNumberArg(args['depth'] ?? args['max_hops'], 'depth'),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n return\n }\n const result = await client.callTool({ name: tool, arguments: args })\n printMcpTextContent(result as { content?: Array<{ type: string; text?: string }> })\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nconst caseCommand = new Command('case')\n .description('Manage investigation cases')\n .hook('preAction', async () => {\n await scopeCasesToInvocationDir()\n })\n .addCommand(\n new Command('open')\n .description('Open a new investigation case')\n .argument('<name>', 'Case name (e.g. \"Tornado Mixer Investigation\")')\n .option('--tags <tags>', 'Comma-separated tags (e.g. aml,mixer,defi)', '')\n .option('--description <desc>', 'Brief description of the investigation', '')\n .action(async (name: string, opts: { tags: string; description: string }) => {\n try {\n if (/^[1-9]\\d*$/.test(name.trim())) {\n throw new Error('Numeric case names look like list selectors. Use a descriptive case name, e.g. `cia case open \"Tracking stolen funds from <address>\"`.')\n }\n const { CaseStore } = await import('./cases/index.js')\n const tags = opts.tags ? opts.tags.split(',').map(t => t.trim()).filter(Boolean) : []\n const c = await CaseStore.create({ name, tags, description: opts.description })\n const { casesRoot } = await import('./cases/store.js')\n console.log(`Case opened: ${c.id}`)\n console.log(`Directory: ${path.join(casesRoot(), c.id)}/`)\n console.log(`Status: ${c.status}`)\n const { findActiveWorkspace } = await import('./workspace/active.js')\n if (findActiveWorkspace()) {\n try {\n const { refreshCaseVault } = await import('./vault/index.js')\n const result = await refreshCaseVault({ caseId: c.id, force: true })\n console.log(`Open first: ${result.nextFile}`)\n } catch (refreshErr) {\n console.error(`Warning: live vault refresh failed: ${(refreshErr as Error).message}`)\n console.error(`Run: cia case vault refresh ${c.id} --force`)\n }\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('activate')\n .description('Activate a case (set status to active)')\n .argument('<case-id>', 'Case ID to activate')\n .action(async (caseSelector: string) => {\n try {\n const { CaseStore } = await import('./cases/index.js')\n const caseId = await resolveCaseSelector(caseSelector)\n const c = await CaseStore.setStatus(caseId, 'active')\n console.log(`Case ${c.id} is now: active`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('suspend')\n .description('Suspend a case (set status to suspended)')\n .argument('<case-id>', 'Case ID to suspend')\n .action(async (caseSelector: string) => {\n try {\n const { CaseStore } = await import('./cases/index.js')\n const caseId = await resolveCaseSelector(caseSelector)\n const c = await CaseStore.setStatus(caseId, 'suspended')\n console.log(`Case ${c.id} is now: suspended`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('close')\n .description('Close a case permanently')\n .argument('<case-id>', 'Case ID to close')\n .action(async (caseSelector: string) => {\n try {\n const { CaseStore } = await import('./cases/index.js')\n const caseId = await resolveCaseSelector(caseSelector)\n const c = await CaseStore.setStatus(caseId, 'closed')\n console.log(`Case ${c.id} is now: closed`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('list')\n .description('List all investigation cases')\n .option('--status <status>', 'Filter by status (open|active|suspended|closed)')\n .action(async (opts: { status?: string }) => {\n try {\n const { CaseStore } = await import('./cases/index.js')\n const cases = await CaseStore.list()\n const filtered = opts.status ? cases.filter(c => c.status === opts.status) : cases\n if (filtered.length === 0) {\n console.log('No cases found.')\n return\n }\n for (const [index, c] of filtered.entries()) {\n console.log(`${index + 1}. ${c.id} [${c.status}] ${c.name}`)\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('evidence')\n .description('Manage case evidence')\n .addCommand(\n new Command('add')\n .description('Add evidence to a case from an MCP query result')\n .argument('<case-id>', 'Case ID to add evidence to')\n .option('--source <tool>', 'MCP tool name that produced this evidence', 'manual')\n .option('--content <text>', 'Evidence content (MCP response or notes)', '')\n .option('--query-params <params>', 'Query parameters used (e.g. address=0x1234)', '')\n .action(async (caseSelector: string, opts: { source: string; content: string; queryParams: string }) => {\n try {\n const { EvidenceStore } = await import('./cases/index.js')\n const caseId = await resolveCaseSelector(caseSelector)\n const result = await EvidenceStore.append(caseId, {\n source: opts.source,\n content: opts.content,\n queryParams: opts.queryParams,\n })\n console.log(`Evidence saved: ${result.filename}`)\n console.log(`SHA-256: ${result.sha256}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('verify')\n .description('Verify evidence manifest integrity for a case')\n .argument('<case-id>', 'Case ID to verify')\n .action(async (caseSelector: string) => {\n try {\n const { EvidenceStore } = await import('./cases/index.js')\n const caseId = await resolveCaseSelector(caseSelector)\n const result = await EvidenceStore.verifyManifest(caseId)\n if (result.ok) {\n console.log(`Manifest OK — ${result.count} evidence file(s) verified`)\n } else {\n console.error(`Manifest FAILED — tampered files: ${(result.tampered ?? []).join(', ')}`)\n process.exit(1)\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n )\n .addCommand(\n new Command('dossier')\n .description('Manage entity dossiers for a case')\n .addCommand(\n new Command('update')\n .description('Append a finding to an entity dossier')\n .argument('<case-id>', 'Case ID')\n .argument('<address>', 'Entity address or identifier')\n .option('--finding <text>', 'Finding to append to the dossier', '')\n .option('--type <type>', 'Entity type (eoa|contract|exchange|mixer|unknown)', 'unknown')\n .action(async (caseSelector: string, address: string, opts: { finding: string; type: string }) => {\n try {\n const { DossierStore } = await import('./cases/index.js')\n const caseId = await resolveCaseSelector(caseSelector)\n const validTypes = ['eoa', 'contract', 'exchange', 'mixer', 'unknown'] as const\n const entityType = validTypes.includes(opts.type as typeof validTypes[number])\n ? (opts.type as typeof validTypes[number])\n : 'unknown'\n await DossierStore.appendFinding(caseId, address, opts.finding, entityType)\n console.log(`Dossier updated for ${address}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n )\n .addCommand(\n new Command('session')\n .description('Manage investigation sessions')\n .addCommand(\n new Command('start')\n .description('Start a new investigation session for a case')\n .argument('<case-id>', 'Case ID')\n .argument('[title...]', 'Optional session title')\n .action(async (caseSelector: string, titleParts: string[]) => {\n try {\n const { SessionStore } = await import('./cases/index.js')\n const caseId = await resolveCaseSelector(caseSelector)\n const title = titleParts.join(' ').trim()\n const s = await SessionStore.start(caseId, title ? { title } : {})\n console.log(`Session started: ${s.sessionId}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('end')\n .description('End the current session with findings and next steps')\n .argument('<case-id>', 'Case ID')\n .option('--findings <text>', 'Key findings from this session', '')\n .option('--next-steps <text>', 'Next steps for the investigation', '')\n .action(async (caseSelector: string, opts: { findings: string; nextSteps: string }) => {\n try {\n const { SessionStore } = await import('./cases/index.js')\n const caseId = await resolveCaseSelector(caseSelector)\n await SessionStore.end(caseId, { findings: opts.findings, nextSteps: opts.nextSteps })\n await SessionStore.archiveOldSessions(caseId)\n console.log(`Session ended for case ${caseId}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n )\n .addCommand(\n new Command('vault')\n .description('Manage live Obsidian case vault notes')\n .addCommand(\n new Command('refresh')\n .description('Refresh Obsidian vault notes for a case')\n .argument('<case-id-or-selector>', 'Case ID or case list number to refresh')\n .option('--force', 'Overwrite existing generated case vault files')\n .action(async (caseSelector: string, opts: { force?: boolean }) => {\n try {\n const caseId = await resolveCaseSelector(caseSelector)\n const { refreshCaseVault } = await import('./vault/index.js')\n const result = await refreshCaseVault({ caseId, force: opts.force === true })\n console.log(`Case vault refreshed: ${caseId}`)\n console.log(`Files: ${result.filesWritten.length}`)\n console.log(`Open first: ${result.nextFile}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n )\n .addCommand(\n new Command('export')\n .description('Export a case for Obsidian, LLM Wiki, and agents')\n .argument('<case-id>', 'Case ID or case list number to export')\n .option('--target <target>', 'Export target: obsidian-llmwiki', 'obsidian-llmwiki')\n .option('--mode <mode>', 'Redaction mode: private|partner|public', 'private')\n .option('--out <directory>', 'Output directory. Defaults to published/<case-slug>')\n .action(async (caseSelector: string, opts: { target: string; mode: string; out?: string }) => {\n try {\n const target = opts.target === 'obsidian-llmwiki' ? opts.target : undefined\n const mode = ['private', 'partner', 'public'].includes(opts.mode)\n ? (opts.mode as 'private' | 'partner' | 'public')\n : undefined\n if (!target) throw new Error(`Unsupported export target: ${opts.target}`)\n if (!mode) throw new Error(`Unsupported export mode: ${opts.mode}`)\n\n const caseId = await resolveCaseSelector(caseSelector)\n const { exportCase } = await import('./export/index.js')\n const result = await exportCase({\n caseId,\n target,\n mode,\n outputDir: opts.out,\n })\n console.log(`Case exported: ${result.outputDir}`)\n console.log(`Manifest: ${result.manifestPath}`)\n console.log(`Files: ${result.fileCount}`)\n console.log(`Open first: ${result.nextFile}`)\n for (const warning of result.warnings) console.warn(`Warning: ${warning}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('show')\n .description('Show saved case context')\n .argument('<case-id>', 'Case ID or case list number to show')\n .action(async (caseSelector: string) => {\n try {\n await showCaseContext(caseSelector)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram.addCommand(caseCommand)\n\nprogram\n .command('playbook')\n .description('Run and manage investigation playbooks')\n .addCommand(\n new Command('run')\n .description('Execute a playbook by name')\n .argument('<name>', 'Playbook name (e.g. trace-funds, risk-check, entity-profile)')\n .option('--case <id>', 'Case ID to attach evidence to (auto-created if omitted)')\n .option('--from <n>', 'Resume from step N (1-based)', '1')\n .option('--dry-run', 'Show steps without executing')\n .option('-p, --param <kv...>', 'Parameters as key=value pairs (repeatable, e.g. -p address=0x1 -p hops=3)')\n .action(async (name: string, opts: { case?: string; from: string; dryRun?: boolean; param?: string[] }) => {\n try {\n // 1. Parse --param key=value pairs into Record<string,string> — split on first '=' only (T-05-06)\n const resolvedParams: Record<string, string> = {}\n for (const kv of (opts.param ?? [])) {\n const eq = kv.indexOf('=')\n if (eq === -1) {\n console.error(`Invalid param format: \"${kv}\". Use key=value`)\n process.exit(1)\n }\n const key = kv.slice(0, eq)\n if (!key) {\n console.error(`Invalid param format: \"${kv}\". Key must be non-empty`)\n process.exit(1)\n }\n resolvedParams[key] = kv.slice(eq + 1)\n }\n // 2. Resolve playbook content (user-dir first, built-in fallback)\n const { resolvePlaybookContent } = await import('./playbooks/resolver.js')\n const markdown = await resolvePlaybookContent(name)\n // 3. Parse markdown → PlaybookDefinition\n const { PlaybookParser } = await import('./playbooks/parser.js')\n const definition = PlaybookParser.parse(markdown, resolvedParams)\n // 4. Validate required params are provided\n for (const spec of definition.params) {\n if (spec.required && !resolvedParams[spec.name] && !spec.default) {\n console.error(`Missing required param: ${spec.name}. Pass with: -p ${spec.name}=<value>`)\n process.exit(1)\n }\n }\n // 5. Validate --from value\n const fromN = parseInt(opts.from, 10)\n if (isNaN(fromN) || fromN < 1) {\n console.error(`Invalid --from value: \"${opts.from}\". Must be a positive integer.`)\n process.exit(1)\n }\n // 6. Run\n const { PlaybookRunner } = await import('./playbooks/runner.js')\n await PlaybookRunner.run(definition, {\n caseId: opts.case,\n from: fromN,\n dryRun: opts.dryRun,\n params: resolvedParams,\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('list')\n .description('List available playbooks (built-in and user-defined)')\n .action(async () => {\n try {\n const { listPlaybooks } = await import('./playbooks/resolver.js')\n const playbooks = await listPlaybooks()\n if (playbooks.length === 0) { console.log('No playbooks found.'); return }\n for (const p of playbooks) {\n console.log(` ${p.name.padEnd(20)} [${p.source}]`)\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('show')\n .description('Show steps for a playbook without executing')\n .argument('<name>', 'Playbook name')\n .action(async (name: string) => {\n try {\n const { resolvePlaybookContent } = await import('./playbooks/resolver.js')\n const { PlaybookParser } = await import('./playbooks/parser.js')\n const markdown = await resolvePlaybookContent(name)\n const definition = PlaybookParser.parse(markdown, {})\n console.log(`Playbook: ${definition.name} v${definition.version}`)\n console.log(`${definition.description}\\n`)\n console.log(`Parameters:`)\n for (const p of definition.params) {\n const req = p.required ? '(required)' : `(optional, default: ${p.default ?? 'none'})`\n console.log(` ${p.name}: ${p.type} ${req}`)\n }\n console.log(`\\nSteps:`)\n for (const step of definition.steps) {\n console.log(` ${step.index}. ${step.label} → tool: ${step.tool}`)\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('viz')\n .description('Generate money flow visualization')\n .argument('[case-id]', 'Case ID to visualize')\n .option('--data <file>', 'Raw transaction JSON file for ad-hoc visualization')\n .option('-p, --port <number>', 'Server port', '4321')\n .action(async (caseId: string | undefined, opts: { data?: string; port: string }) => {\n try {\n if (!caseId && !opts.data) {\n console.error('Provide either a case ID or --data <file.json>')\n process.exit(1)\n }\n const { generateVisualization } = await import('./viz/index.js')\n const result = await generateVisualization({ caseId, dataFile: opts.data })\n const { startServer } = await import('./server/index.js')\n const port = parseInt(opts.port, 10)\n startServer(port)\n const url = `http://127.0.0.1:${port}/viz/${result.vizId}`\n console.log(`Visualization: ${url}`)\n const open = (await import('open')).default\n await open(url)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram.parse(process.argv)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["import { Command, Option } from 'commander'\nimport { execFileSync } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\nimport path from 'node:path'\nimport { PACKAGE_INFO, PACKAGE_VERSION } from './version.js'\n\n// Resolve bin/install.cjs relative to this file's location in dist/\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\nconst installerPath = path.resolve(__dirname, '..', 'bin', 'install.cjs')\n\nconst program = new Command()\n\nprogram\n .name('chain-insights')\n .description('AML investigation toolkit for blockchain analysis')\n .version(PACKAGE_INFO.version)\n .option('--claude', 'Install Claude Code skills globally to ~/.claude/skills/')\n .option('--codex', 'Install Codex skills globally to ~/.codex/skills/ and register MCP')\n .option('--hermes', 'Install Hermes skills globally to ~/.hermes/skills/chain-insights/ and register MCP')\n\n// Handle installer flags when invoked with no subcommand (bare `chain-insights --claude`)\nconst rawArgs = process.argv.slice(2)\nconst installerFlags = rawArgs.filter(a => a === '--claude' || a === '--codex' || a === '--hermes')\nif (installerFlags.length > 0 && !rawArgs.some(a => !a.startsWith('-'))) {\n try {\n execFileSync(process.execPath, [installerPath, ...installerFlags], { stdio: 'inherit' })\n } catch (err) {\n console.error('Installation failed:', (err as Error).message)\n process.exit(1)\n }\n process.exit(0)\n}\n\nif (rawArgs[0] === 'mcp' && ['trace-funds', 'track-funds', 'scam-topology'].includes(rawArgs[1] ?? '')) {\n console.error(`error: unknown command '${rawArgs[1]}'`)\n process.exit(1)\n}\n\nfunction optionalNumber(value: string | undefined): number | undefined {\n if (value === undefined) return undefined\n const parsed = Number(value)\n if (!Number.isFinite(parsed)) throw new Error(`Invalid number: ${value}`)\n return parsed\n}\n\nfunction optionalNumberArg(value: unknown, name: string): number | undefined {\n if (value === undefined) return undefined\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string') return optionalNumber(value)\n throw new Error(`Invalid number for ${name}: ${String(value)}`)\n}\n\nasync function withGraphMcpClient<T>(name: string, fn: (client: import('@modelcontextprotocol/sdk/client/index.js').Client, config: Awaited<ReturnType<typeof import('./config/index.js').loadConfig>>) => Promise<T>): Promise<T> {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } = await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name, version: PACKAGE_VERSION })\n await client.connect(new StreamableHTTPClientTransport(new URL(resolveGraphMcpEndpoint(config)), { fetch: paymentFetch }))\n try {\n return await fn(client, config)\n } finally {\n await client.close()\n }\n}\n\nfunction printMcpTextContent(result: { content?: Array<{ type: string; text?: string }> }): void {\n for (const item of result.content ?? []) {\n if (item.type === 'text') console.log(item.text)\n }\n}\n\ntype ExposureInsightCliTool =\n | 'exposure_quality'\n | 'exposure_carry'\n | 'exposure_crowding'\n | 'exposure_exit_pressure'\n | 'exposure_correlation'\n | 'exposure_explain'\n\ntype ExposureInsightCliOptions = {\n network: string\n account?: string\n owner?: string\n counterparty?: string\n venue?: string\n instrument?: string\n market?: string\n instrumentType?: string\n startTimestampMs?: string\n endTimestampMs?: string\n limit?: string\n candidateAccounts?: string\n positionId?: string\n}\n\nfunction addExposureSubjectOptions(command: Command): Command {\n return command\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .option('--account <address>', 'Account address to inspect')\n .option('--owner <address>', 'Owner address to inspect')\n .option('--counterparty <address>', 'Counterparty address to inspect')\n .option('--venue <name>', 'Optional venue filter, for example Bittensor or Hyperliquid')\n .option('--instrument <id>', 'Optional instrument filter, for example a subnet lifecycle id or BTC-PERP')\n .option('--instrument-type <type>', 'Optional instrument type filter, for example subnet, perp, spot, vault, or staking')\n .option('--start-timestamp-ms <milliseconds>', 'Optional inclusive lower activity timestamp bound')\n .option('--end-timestamp-ms <milliseconds>', 'Optional inclusive upper activity timestamp bound')\n .option('--limit <number>', 'Maximum exposure rows, default 100, max 500')\n}\n\nfunction addExposureMarketOptions(command: Command, requiredInstrument: boolean, includeNetwork = true): Command {\n let configured = command\n .option('--venue <name>', 'Optional venue filter, for example Bittensor or Hyperliquid')\n .option('--market <id>', 'Alias for --instrument when using market language')\n .option('--instrument-type <type>', 'Optional instrument type filter, for example subnet, perp, spot, vault, or staking')\n .option('--start-timestamp-ms <milliseconds>', 'Optional inclusive lower activity timestamp bound')\n .option('--end-timestamp-ms <milliseconds>', 'Optional inclusive upper activity timestamp bound')\n .option('--limit <number>', 'Maximum exposure rows, default 100, max 500')\n if (includeNetwork) {\n configured = configured.requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n }\n return requiredInstrument\n ? configured.requiredOption('--instrument <id>', 'Instrument, market, subnet, hotkey, vault, or durable exposure target identifier to inspect')\n : configured.option('--instrument <id>', 'Instrument, market, subnet, hotkey, vault, or durable exposure target identifier to inspect')\n}\n\nfunction buildExposureInsightCommand(name: string, tool: ExposureInsightCliTool, description: string): Command {\n const command = new Command(name).description(description)\n const configured = tool === 'exposure_crowding'\n ? addExposureMarketOptions(command, true)\n : tool === 'exposure_exit_pressure'\n ? addExposureSubjectOptions(command).option('--market <id>', 'Alias for --instrument when using market language')\n : addExposureSubjectOptions(command)\n\n if (tool === 'exposure_correlation') {\n configured.option('--candidate-accounts <addresses>', 'Comma-separated candidate accounts to compare against')\n }\n if (tool === 'exposure_explain') {\n configured\n .option('--market <id>', 'Alias for --instrument when using market language')\n .option('--position-id <id>', 'Optional venue-native position, trade, stake, rotation, or lifecycle identifier')\n }\n\n return configured.action(async (opts: ExposureInsightCliOptions) => {\n try {\n await withGraphMcpClient(`chain-insights-cli-${name}`, async (client) => {\n const {\n exposureCarry,\n exposureCorrelation,\n exposureCrowding,\n exposureExitPressure,\n exposureExplain,\n exposureQuality,\n } = await import('./investigation/public-tools.js')\n const args = {\n network: opts.network,\n account: opts.account,\n owner: opts.owner,\n counterparty: opts.counterparty,\n venue: opts.venue,\n instrument: opts.instrument,\n market: opts.market,\n instrumentType: opts.instrumentType,\n startTimestampMs: optionalNumber(opts.startTimestampMs),\n endTimestampMs: optionalNumber(opts.endTimestampMs),\n limit: optionalNumber(opts.limit),\n candidateAccounts: opts.candidateAccounts,\n positionId: opts.positionId,\n }\n const result = tool === 'exposure_quality'\n ? await exposureQuality(client, args)\n : tool === 'exposure_carry'\n ? await exposureCarry(client, args)\n : tool === 'exposure_crowding'\n ? await exposureCrowding(client, args)\n : tool === 'exposure_exit_pressure'\n ? await exposureExitPressure(client, args)\n : tool === 'exposure_correlation'\n ? await exposureCorrelation(client, args)\n : await exposureExplain(client, args)\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n}\n\nasync function printNetworkCapabilities(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkCapabilities } = await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n if (opts.json) {\n console.log(JSON.stringify(document, null, 2))\n } else {\n console.log(formatNetworkCapabilities(document))\n }\n}\n\nprogram\n .command('networks')\n .alias('network')\n .description('List supported graph networks, capability layers, retention, and freshness')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkCapabilities(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('serve')\n .description('Start local visualization server')\n .option('-p, --port <number>', 'Port to bind (default: 4321)', '4321')\n .action(async (opts: { port: string }) => {\n try {\n const { requireWorkspaceRoot } = await import('./workspace/output-root.js')\n const workspaceRoot = requireWorkspaceRoot()\n const { startServer } = await import('./server/index.js')\n console.log(`Workspace: ${workspaceRoot}`)\n startServer(parseInt(opts.port, 10))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('status')\n .description('Show toolkit status and configuration')\n .action(async () => {\n const { loadConfig } = await import('./config/index.js')\n const { findActiveWorkspace, activeDataDir } = await import('./workspace/active.js')\n const config = await loadConfig()\n const workspace = findActiveWorkspace()\n const graphMcpStatus = config.graphMcpMode === 'debug' && config.graphMcpAuthToken?.trim()\n ? 'bearer access mode'\n : `${config.graphMcpMode} mode`\n console.log('Config: ', activeDataDir(config.dataDir))\n if (workspace) console.log('Workspace:', workspace.root)\n console.log('Server: ', `http://127.0.0.1:${config.serverPort}`)\n console.log('Graph MCP:', graphMcpStatus)\n console.log('Graph endpoint:', config.graphMcpEndpoint)\n })\n\nprogram\n .command('update')\n .description('Check npmjs for a newer Chain Insights release and update this CLI')\n .option('--check', 'Only check for a newer release')\n .option('--dry-run', 'Print the update command without running it')\n .action(async (opts: { check?: boolean; dryRun?: boolean }) => {\n try {\n const { checkForUpdate, runPackageUpdate } = await import('./update.js')\n const result = await checkForUpdate()\n if (result.error) {\n throw new Error(`Could not check npmjs for updates: ${result.error}`)\n }\n if (!result.updateAvailable || !result.latestVersion) {\n console.log(`Chain Insights is up to date (${result.currentVersion}).`)\n return\n }\n\n console.log(`Chain Insights ${result.latestVersion} is available (current ${result.currentVersion}).`)\n if (opts.check) {\n console.log(`Run: ${result.updateCommand}`)\n return\n }\n if (opts.dryRun) {\n console.log(`Would run: ${result.updateCommand}`)\n return\n }\n\n console.log(`Running: ${result.updateCommand}`)\n runPackageUpdate(result.packageName)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('debug')\n .description('Configure Graph MCP debug mode')\n .addCommand(\n new Command('on')\n .description('Enable Graph MCP debug mode without x402 payments')\n .requiredOption('--token <token>', 'Debug bearer token')\n .option('--endpoint <url>', 'Graph MCP endpoint')\n .action(async (opts: { token: string; endpoint?: string }) => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({\n graphMcpMode: 'debug',\n graphMcpAuthToken: opts.token,\n ...(opts.endpoint ? { graphMcpEndpoint: opts.endpoint } : {}),\n })\n console.log('Graph MCP debug mode enabled')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled for Graph MCP calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('off')\n .description('Disable Graph MCP debug mode and use paid x402 calls')\n .action(async () => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({ graphMcpMode: 'paid', graphMcpAuthToken: '' })\n console.log('Graph MCP debug mode disabled')\n console.log('Payments: enabled for Graph MCP calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('status')\n .description('Show Graph MCP payment/debug mode')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Graph MCP mode: ${config.graphMcpMode}`)\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(`Debug token: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`)\n console.log(`Payments: ${config.graphMcpMode === 'debug' ? 'disabled' : 'enabled'}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('access-key')\n .description('Configure Graph MCP test access key mode')\n .addCommand(\n new Command('set')\n .description('Use a Graph MCP test access key without x402 payments')\n .argument('<key>', 'Test access key')\n .option('--endpoint <url>', 'Graph MCP endpoint')\n .action(async (key: string, opts: { endpoint?: string }) => {\n try {\n const normalizedKey = key.trim()\n if (!normalizedKey) throw new Error('Test access key is required')\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({\n graphMcpMode: 'debug',\n graphMcpAuthToken: normalizedKey,\n ...(opts.endpoint ? { graphMcpEndpoint: opts.endpoint } : {}),\n })\n console.log('Graph MCP test access key configured')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled when the server accepts this key')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('clear')\n .description('Remove the Graph MCP test access key and use paid x402 calls')\n .action(async () => {\n try {\n const { saveConfig } = await import('./config/index.js')\n await saveConfig({ graphMcpMode: 'paid', graphMcpAuthToken: '' })\n console.log('Graph MCP test access key cleared')\n console.log('Payments: enabled for Graph MCP calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('status')\n .description('Show Graph MCP test access key status')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(`Access key: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`)\n console.log(`Payments: ${config.graphMcpAuthToken?.trim() ? 'disabled when accepted by server' : 'enabled'}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('init')\n .description('Initialize an investigation workspace')\n .argument('[dir]', 'Workspace directory to initialize', '.')\n .option('--force', 'Overwrite existing workspace files')\n .action(async (dir: string, opts: { force?: boolean }) => {\n try {\n const { initWorkspace } = await import('./workspace/init.js')\n const result = await initWorkspace({ targetDir: dir, force: opts.force })\n console.log(`Workspace initialized: ${result.workspaceRoot}`)\n console.log(`Files written: ${result.filesWritten.length}`)\n const { maybePromptForUpdate } = await import('./update.js')\n await maybePromptForUpdate()\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('setup')\n .description('Configure external MCP clients')\n .addCommand(\n new Command('claude-desktop')\n .alias('claude')\n .description('Install or update the Claude Desktop MCP server entry')\n .option('--config <path>', 'Path to claude_desktop_config.json')\n .option('--dry-run', 'Print the intended change without writing files')\n .action(async (opts: { config?: string; dryRun?: boolean }) => {\n try {\n const { setupClaudeDesktop } = await import('./claude-desktop/setup.js')\n const result = await setupClaudeDesktop({\n configPath: opts.config,\n dryRun: opts.dryRun,\n })\n\n console.log(`Claude Desktop config: ${result.configPath}`)\n console.log('MCP server: chain-insights')\n console.log(`Command: ${result.command}`)\n console.log(`Args: ${result.args.join(' ')}`)\n if (result.dryRun) {\n console.log(`Dry run: ${result.changed ? 'would update config' : 'already up to date'}`)\n } else if (result.changed) {\n console.log(`Updated: yes`)\n if (result.backupPath) console.log(`Backup: ${result.backupPath}`)\n } else {\n console.log('Updated: already up to date')\n }\n console.log('Reload required: quit and reopen Claude Desktop; it does not hot-reload MCP config.')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('config')\n .description('Read or write configuration values')\n .addCommand(\n new Command('get')\n .argument('<key>', 'Config key to read')\n .action(async (key: string) => {\n const { loadConfig } = await import('./config/index.js')\n const { CONFIG_KEYS } = await import('./config/schema.js')\n if (!CONFIG_KEYS.includes(key as typeof CONFIG_KEYS[number])) {\n console.error(`Unknown config key: ${key}`)\n process.exit(1)\n }\n const config = await loadConfig()\n const value = (config as Record<string, unknown>)[key]\n console.log(value ?? '')\n })\n )\n .addCommand(\n new Command('set')\n .argument('<key>', 'Config key to write')\n .argument('<value>', 'Value to set')\n .action(async (key: string, value: string) => {\n // D-01: walletPrivateKey is intercepted before saveConfig — the raw private key\n // must NEVER be written to config.json.\n if (key === 'walletPrivateKey') {\n try {\n const { setWalletPrivateKey } = await import('./wallet/index.js')\n const address = await setWalletPrivateKey(value)\n console.log('Wallet private key encrypted and stored in ~/.chain-insights/wallet.json')\n console.log(`Wallet address: ${address}`)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n return // MUST return — walletPrivateKey must never reach saveConfig or config.json\n }\n const { loadConfig, saveConfig } = await import('./config/index.js')\n const { CONFIG_KEYS, DEFAULT_CONFIG } = await import('./config/schema.js')\n const current = await loadConfig()\n if (!CONFIG_KEYS.includes(key as typeof CONFIG_KEYS[number])) {\n console.error(`Unknown config key: ${key}`)\n process.exit(1)\n }\n const existing = (current as Record<string, unknown>)[key]\n const defaultValue = (DEFAULT_CONFIG as Record<string, unknown>)[key]\n const coerced = typeof existing === 'number' || typeof defaultValue === 'number' ? Number(value) : value\n await saveConfig({ [key]: coerced } as Parameters<typeof saveConfig>[0])\n const displayed = key.toLowerCase().includes('token') ? '[redacted]' : coerced\n console.log(`Set ${key} = ${displayed}`)\n })\n )\n\nprogram\n .command('wallet')\n .description('Manage the local Base USDC payment wallet')\n .addCommand(\n new Command('import')\n .description('Import a Base payment wallet')\n .argument('<private-key>', '0x-prefixed EVM private key')\n .action(async (privateKey: string) => {\n try {\n const { setWalletPrivateKey } = await import('./wallet/index.js')\n const address = await setWalletPrivateKey(privateKey)\n console.log(`Wallet imported: ${address}`)\n console.log('Next: run `chain-insights wallet ready`')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('address')\n .description('Print the local payment wallet address')\n .action(async () => {\n try {\n const { getWalletAccount } = await import('./wallet/tools.js')\n const account = await getWalletAccount()\n console.log(account.address)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('balance')\n .description('Show the local payment wallet Base USDC balance')\n .action(async () => {\n try {\n const { getWalletBalanceText } = await import('./wallet/tools.js')\n console.log(await getWalletBalanceText())\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('ready')\n .description('Check and prepare the wallet for paid GraphRAG MCP calls')\n .option('--check-only', 'Only check readiness; do not submit the one-time payment setup')\n .addOption(new Option('--no-approve', 'Deprecated alias for --check-only').hideHelp())\n .option('--payment-usdc <amount>', 'USDC setup cap to prepare for paid calls', '1')\n .addOption(new Option('--approval-usdc <amount>', 'Deprecated alias for --payment-usdc').hideHelp())\n .option('--json', 'Print machine-readable readiness metadata')\n .action(async (opts: { checkOnly?: boolean; approve?: boolean; paymentUsdc?: string; approvalUsdc?: string; json?: boolean }) => {\n try {\n const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } = await import('./wallet/tools.js')\n const minimumApprovalUnits = parsePaymentApprovalUnits(opts.paymentUsdc ?? opts.approvalUsdc ?? '1')\n const result = await prepareWalletForPaidCalls({\n minimumApprovalUnits,\n approve: opts.checkOnly ? false : opts.approve !== false,\n })\n\n if (opts.json) {\n console.log(JSON.stringify(result, (_key, value) => (\n typeof value === 'bigint' ? value.toString() : value\n ), 2))\n return\n }\n\n console.log(formatWalletReadiness(result.readiness, result.approval))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('topup')\n .description('Open a local browser page to top up the payment wallet')\n .option('--no-open', 'Print the top-up URL without opening a browser')\n .option('--json', 'Print machine-readable top-up metadata')\n .action(async (opts: { open?: boolean; json?: boolean }) => {\n try {\n const { buildTopupInfo, getWalletAccount } = await import('./wallet/tools.js')\n const { startTopupServer } = await import('./wallet/topup-server.js')\n const account = await getWalletAccount()\n const url = await startTopupServer(account)\n const info = buildTopupInfo(account.address, url)\n\n if (opts.json) {\n console.log(JSON.stringify(info, null, 2))\n } else {\n console.log(`Top-up URL: ${url}`)\n console.log(`Wallet: ${account.address}`)\n console.log('Network: Base')\n console.log('Token: USDC')\n console.log('Press Ctrl+C to stop the top-up server.')\n }\n\n if (opts.open !== false) {\n const open = (await import('open')).default\n await open(url)\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('mcp')\n .description('Interact with the Chain Insights MCP endpoint')\n .allowExcessArguments(false)\n .addCommand(\n new Command('networks')\n .description('List supported graph networks, capability layers, retention, and freshness')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkCapabilities(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('tools')\n .description('List available MCP tools (cached 24h)')\n .option('--refresh', 'Force refresh schema cache')\n .action(async (opts: { refresh?: boolean }) => {\n try {\n const { loadSchema, saveSchema } = await import('./mcp/schema-cache.js')\n const { formatToolsTable } = await import('./mcp/format.js')\n const { visibleRemoteTools } = await import('./mcp/tool-visibility.js')\n const { loadConfig } = await import('./config/index.js')\n const { createConfiguredGraphMcpFetch, resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n const config = await loadConfig()\n const graphMcpEndpoint = resolveGraphMcpEndpoint(config)\n let tools = opts.refresh ? null : await loadSchema(graphMcpEndpoint)\n if (!tools) {\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } = await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name: 'chain-insights-cli', version: PACKAGE_VERSION })\n await client.connect(new StreamableHTTPClientTransport(new URL(graphMcpEndpoint), { fetch: paymentFetch }))\n try {\n const result = await client.listTools()\n tools = result.tools as Array<{ name: string; description?: string }>\n await saveSchema(tools, graphMcpEndpoint)\n } finally {\n await client.close()\n }\n }\n console.log(formatToolsTable(visibleRemoteTools(tools)))\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('aml-address-risk')\n .description('Screen an address for risk, exchange behavior, and optional compare_address connection risk')\n .requiredOption('--address <address>', 'Full blockchain address to screen')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .option('--compare-address <address>', 'Optional second address for connection-risk compare mode')\n .option('--remote', 'Force remote MCP tool call instead of local Chain Insights recipe')\n .action(async (opts: { address: string; network: string; compareAddress?: string; remote?: boolean }) => {\n try {\n await withGraphMcpClient('chain-insights-cli-aml-address-risk', async (client) => {\n if (opts.remote) {\n const result = await client.callTool({\n name: 'aml_address_risk',\n arguments: {\n address: opts.address,\n network: opts.network,\n ...(opts.compareAddress ? { compare_address: opts.compareAddress } : {}),\n },\n })\n printMcpTextContent(result as { content?: Array<{ type: string; text?: string }> })\n return\n }\n const { addressRisk } = await import('./investigation/public-tools.js')\n const result = await addressRisk(client, {\n address: opts.address,\n network: opts.network,\n compareAddress: opts.compareAddress,\n })\n console.log(result.summaryText)\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('aml-trace-victim-funds')\n .description('Trace victim/source addresses forward to exchange deposit candidates')\n .requiredOption('--victim-addresses <addresses>', 'Comma-separated full victim/source addresses, max 5')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .option('--known-suspect-addresses <addresses>', 'Optional known suspect addresses for context only, max 5')\n .option('--incident-timestamp-ms <milliseconds>', 'Optional incident timestamp in milliseconds')\n .option('--max-hops <number>', 'Maximum trace hops, 1-5')\n .option('--per-address-limit <number>', 'Maximum exchange paths/results per address, 1-10')\n .option('--min-amount-sum <number>', 'Minimum r.amount_sum for traced edges')\n .option('--remote', 'Force remote MCP tool call instead of local Chain Insights recipe')\n .action(async (opts: {\n victimAddresses: string\n network: string\n knownSuspectAddresses?: string\n incidentTimestampMs?: string\n maxHops?: string\n perAddressLimit?: string\n minAmountSum?: string\n remote?: boolean\n }) => {\n try {\n const { requireWorkspaceRoot } = await import('./workspace/output-root.js')\n requireWorkspaceRoot()\n await withGraphMcpClient('chain-insights-cli-aml-trace-victim-funds', async (client, config) => {\n if (opts.remote) {\n const result = await client.callTool({\n name: 'aml_trace_victim_funds',\n arguments: {\n victim_addresses: opts.victimAddresses,\n network: opts.network,\n ...(opts.knownSuspectAddresses ? { known_suspect_addresses: opts.knownSuspectAddresses } : {}),\n },\n })\n printMcpTextContent(result as { content?: Array<{ type: string; text?: string }> })\n return\n }\n const { traceVictimFunds } = await import('./investigation/public-tools.js')\n const result = await traceVictimFunds(client, config, {\n victimAddresses: opts.victimAddresses,\n knownSuspectAddresses: opts.knownSuspectAddresses,\n network: opts.network,\n incidentTimestampMs: optionalNumber(opts.incidentTimestampMs),\n maxHops: optionalNumber(opts.maxHops),\n perAddressLimit: optionalNumber(opts.perAddressLimit),\n minAmountSum: optionalNumber(opts.minAmountSum),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('aml-trace-suspect-funds')\n .description('Trace suspected scammer, mule, operator, or laundering-ring addresses forward to cashout topology')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .requiredOption('--suspect-addresses <addresses>', 'Comma-separated full suspect-controlled addresses, max 5')\n .option('--incident-timestamp-ms <milliseconds>', 'Optional incident timestamp in milliseconds')\n .option('--max-hops <number>', 'Maximum trace hops, default 3, max 5')\n .option('--per-address-limit <number>', 'Maximum exchange paths/results per address, 1-10')\n .option('--min-amount-sum <number>', 'Minimum r.amount_sum for traced edges')\n .action(async (opts: {\n network: string\n suspectAddresses: string\n incidentTimestampMs?: string\n maxHops?: string\n perAddressLimit?: string\n minAmountSum?: string\n }) => {\n try {\n const { requireWorkspaceRoot } = await import('./workspace/output-root.js')\n requireWorkspaceRoot()\n await withGraphMcpClient('chain-insights-cli-aml-trace-suspect-funds', async (client, config) => {\n const { traceSuspectFunds } = await import('./investigation/public-tools.js')\n const result = await traceSuspectFunds(client, config, {\n suspectAddresses: opts.suspectAddresses,\n network: opts.network,\n maxHops: optionalNumber(opts.maxHops),\n perAddressLimit: optionalNumber(opts.perAddressLimit),\n minAmountSum: optionalNumber(opts.minAmountSum),\n incidentTimestampMs: optionalNumber(opts.incidentTimestampMs),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('aml-trace-deposit-sources')\n .description('Trace backward from suspected deposit/cashout addresses to upstream sources and convergence')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .requiredOption('--deposit-addresses <addresses>', 'Comma-separated full suspected deposit/cashout addresses, max 5')\n .option('--max-hops <number>', 'Maximum reverse traceback hops, default 2, max 5')\n .action(async (opts: {\n network: string\n depositAddresses: string\n maxHops?: string\n }) => {\n try {\n const { requireWorkspaceRoot } = await import('./workspace/output-root.js')\n requireWorkspaceRoot()\n await withGraphMcpClient('chain-insights-cli-aml-trace-deposit-sources', async (client, config) => {\n const { traceDepositSources } = await import('./investigation/public-tools.js')\n const result = await traceDepositSources(client, config, {\n depositAddresses: opts.depositAddresses,\n network: opts.network,\n maxHops: optionalNumber(opts.maxHops),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n new Command('exposure-profile')\n .description('Explain staking or trading exposure around one account, owner, or counterparty')\n .requiredOption('--network <network>', 'Network to query. Run `cia mcp networks` for supported networks.')\n .option('--account <address>', 'Account address to inspect')\n .option('--owner <address>', 'Owner address to inspect')\n .option('--counterparty <address>', 'Counterparty address to inspect')\n .option('--venue <name>', 'Optional venue filter, for example Bittensor or Hyperliquid')\n .option('--instrument <id>', 'Optional instrument filter, for example a subnet lifecycle id or BTC-PERP')\n .option('--instrument-type <type>', 'Optional instrument type filter, for example subnet, perp, spot, vault, or staking')\n .option('--start-timestamp-ms <milliseconds>', 'Optional inclusive lower activity timestamp bound')\n .option('--end-timestamp-ms <milliseconds>', 'Optional inclusive upper activity timestamp bound')\n .option('--limit <number>', 'Maximum exposure rows, default 100, max 500')\n .action(async (opts: {\n network: string\n account?: string\n owner?: string\n counterparty?: string\n venue?: string\n instrument?: string\n instrumentType?: string\n startTimestampMs?: string\n endTimestampMs?: string\n limit?: string\n }) => {\n try {\n await withGraphMcpClient('chain-insights-cli-exposure-profile', async (client) => {\n const { exposureProfile } = await import('./investigation/public-tools.js')\n const result = await exposureProfile(client, {\n network: opts.network,\n account: opts.account,\n owner: opts.owner,\n counterparty: opts.counterparty,\n venue: opts.venue,\n instrument: opts.instrument,\n instrumentType: opts.instrumentType,\n startTimestampMs: optionalNumber(opts.startTimestampMs),\n endTimestampMs: optionalNumber(opts.endTimestampMs),\n limit: optionalNumber(opts.limit),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(buildExposureInsightCommand(\n 'exposure-quality',\n 'exposure_quality',\n 'Score whether exposure behavior looks disciplined, fragile, lucky, or noisy',\n ))\n .addCommand(buildExposureInsightCommand(\n 'exposure-carry',\n 'exposure_carry',\n 'Explain carry earned or paid by staking, trading, funding, fees, emissions, or dividends',\n ))\n .addCommand(buildExposureInsightCommand(\n 'exposure-crowding',\n 'exposure_crowding',\n 'Measure crowding and side concentration for a market, subnet, hotkey, vault, or strategy',\n ))\n .addCommand(buildExposureInsightCommand(\n 'exposure-exit-pressure',\n 'exposure_exit_pressure',\n 'Explain liquidation, slippage, funding pain, unstake, or other exit pressure',\n ))\n .addCommand(buildExposureInsightCommand(\n 'exposure-correlation',\n 'exposure_correlation',\n 'Compare accounts for possible copy, overlap, or strategy-cluster exposure behavior',\n ))\n .addCommand(buildExposureInsightCommand(\n 'exposure-explain',\n 'exposure_explain',\n 'Explain a specific exposure lifecycle, trade, position, stake, rotation, or incident',\n ))\n .addCommand(\n new Command('call')\n .description('Call an MCP tool directly (debug)')\n .argument('<tool>', 'Tool name to call')\n .argument('[args...]', 'Key=value arguments (e.g. address=0x1234 chain=ethereum)')\n .action(async (tool: string, rawArgs: string[]) => {\n try {\n const { parseMcpCallArgs } = await import('./mcp/call-args.js')\n const { assertPublicMcpToolName } = await import('./mcp/tool-visibility.js')\n const args = parseMcpCallArgs(rawArgs)\n assertPublicMcpToolName(tool)\n await withGraphMcpClient('chain-insights-cli-call', async (client, config) => {\n if (tool === 'aml_address_risk') {\n const { addressRisk } = await import('./investigation/public-tools.js')\n const result = await addressRisk(client, {\n address: String(args['address'] ?? ''),\n network: String(args['network'] ?? ''),\n compareAddress: args['compare_address'] === undefined ? undefined : String(args['compare_address']),\n })\n console.log(result.summaryText)\n return\n }\n if (tool === 'aml_trace_victim_funds') {\n const { traceVictimFunds } = await import('./investigation/public-tools.js')\n const result = await traceVictimFunds(client, config, {\n victimAddresses: args['victim_addresses'] as string | string[] | undefined ?? '',\n knownSuspectAddresses: args['known_suspect_addresses'] as string | string[] | undefined,\n network: String(args['network'] ?? ''),\n incidentTimestampMs: optionalNumberArg(args['incident_timestamp_ms'], 'incident_timestamp_ms'),\n maxHops: typeof args['max_hops'] === 'number' ? args['max_hops'] : undefined,\n perAddressLimit: typeof args['per_address_limit'] === 'number' ? args['per_address_limit'] : undefined,\n minAmountSum: typeof args['min_amount_sum'] === 'number' ? args['min_amount_sum'] : undefined,\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n return\n }\n if (tool === 'aml_trace_suspect_funds') {\n const { traceSuspectFunds } = await import('./investigation/public-tools.js')\n const result = await traceSuspectFunds(client, config, {\n suspectAddresses: args['suspect_addresses'] as string | string[] | undefined ?? '',\n network: String(args['network'] ?? ''),\n maxHops: typeof args['max_hops'] === 'number' ? args['max_hops'] : undefined,\n perAddressLimit: typeof args['per_address_limit'] === 'number' ? args['per_address_limit'] : undefined,\n minAmountSum: typeof args['min_amount_sum'] === 'number' ? args['min_amount_sum'] : undefined,\n incidentTimestampMs: optionalNumberArg(args['incident_timestamp_ms'], 'incident_timestamp_ms'),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n return\n }\n if (tool === 'aml_trace_deposit_sources') {\n const { traceDepositSources } = await import('./investigation/public-tools.js')\n const result = await traceDepositSources(client, config, {\n depositAddresses: args['deposit_addresses'] as string | string[] | undefined ?? '',\n network: String(args['network'] ?? ''),\n maxHops: typeof args['max_hops'] === 'number' ? args['max_hops'] : undefined,\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n return\n }\n if (tool === 'exposure_profile') {\n const { exposureProfile } = await import('./investigation/public-tools.js')\n const result = await exposureProfile(client, {\n network: String(args['network'] ?? ''),\n account: args['account'] === undefined ? undefined : String(args['account']),\n owner: args['owner'] === undefined ? undefined : String(args['owner']),\n counterparty: args['counterparty'] === undefined ? undefined : String(args['counterparty']),\n venue: args['venue'] === undefined ? undefined : String(args['venue']),\n instrument: args['instrument'] === undefined ? undefined : String(args['instrument']),\n instrumentType: args['instrument_type'] === undefined ? undefined : String(args['instrument_type']),\n startTimestampMs: optionalNumberArg(args['start_timestamp_ms'], 'start_timestamp_ms'),\n endTimestampMs: optionalNumberArg(args['end_timestamp_ms'], 'end_timestamp_ms'),\n limit: optionalNumberArg(args['limit'], 'limit'),\n })\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n return\n }\n if ([\n 'exposure_quality',\n 'exposure_carry',\n 'exposure_crowding',\n 'exposure_exit_pressure',\n 'exposure_correlation',\n 'exposure_explain',\n ].includes(tool)) {\n const {\n exposureCarry,\n exposureCorrelation,\n exposureCrowding,\n exposureExitPressure,\n exposureExplain,\n exposureQuality,\n } = await import('./investigation/public-tools.js')\n const exposureArgs = {\n network: String(args['network'] ?? ''),\n account: args['account'] === undefined ? undefined : String(args['account']),\n owner: args['owner'] === undefined ? undefined : String(args['owner']),\n counterparty: args['counterparty'] === undefined ? undefined : String(args['counterparty']),\n venue: args['venue'] === undefined ? undefined : String(args['venue']),\n instrument: args['instrument'] === undefined ? undefined : String(args['instrument']),\n market: args['market'] === undefined ? undefined : String(args['market']),\n instrumentType: args['instrument_type'] === undefined ? undefined : String(args['instrument_type']),\n startTimestampMs: optionalNumberArg(args['start_timestamp_ms'], 'start_timestamp_ms'),\n endTimestampMs: optionalNumberArg(args['end_timestamp_ms'], 'end_timestamp_ms'),\n limit: optionalNumberArg(args['limit'], 'limit'),\n candidateAccounts: args['candidate_accounts'] as string | string[] | undefined,\n positionId: args['position_id'] === undefined ? undefined : String(args['position_id']),\n }\n const result = tool === 'exposure_quality'\n ? await exposureQuality(client, exposureArgs)\n : tool === 'exposure_carry'\n ? await exposureCarry(client, exposureArgs)\n : tool === 'exposure_crowding'\n ? await exposureCrowding(client, exposureArgs)\n : tool === 'exposure_exit_pressure'\n ? await exposureExitPressure(client, exposureArgs)\n : tool === 'exposure_correlation'\n ? await exposureCorrelation(client, exposureArgs)\n : await exposureExplain(client, exposureArgs)\n console.log(result.summaryText)\n console.log(JSON.stringify(result.structuredContent, null, 2))\n return\n }\n const result = await client.callTool({ name: tool, arguments: args })\n printMcpTextContent(result as { content?: Array<{ type: string; text?: string }> })\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\n\n\nprogram\n .command('viz')\n .description('Generate a workspace visualization')\n .argument('[source-id]', 'Workspace graph report ID to render')\n .option('--data <file>', 'Raw transaction JSON file for ad-hoc visualization')\n .option('-p, --port <number>', 'Server port', '4321')\n .action(async (sourceId: string | undefined, opts: { data?: string; port: string }) => {\n try {\n if (!sourceId && !opts.data) {\n console.error('Provide either a visualization source ID or --data <file.json>')\n process.exit(1)\n }\n const { generateVisualization } = await import('./viz/index.js')\n const result = await generateVisualization({ sourceId, dataFile: opts.data })\n const { startServer } = await import('./server/index.js')\n const port = parseInt(opts.port, 10)\n startServer(port)\n const url = `http://127.0.0.1:${port}/viz/${result.vizId}`\n console.log(`Visualization: ${url}`)\n const open = (await import('open')).default\n await open(url)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram.parse(process.argv)\n"],"mappings":"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"}
|
|
@@ -10,7 +10,6 @@ var client_exports = /* @__PURE__ */ require_chunk.__exportAll({
|
|
|
10
10
|
PaymentRequiredError: () => PaymentRequiredError,
|
|
11
11
|
applyMcpAuthHeaders: () => applyMcpAuthHeaders,
|
|
12
12
|
createConfiguredGraphMcpFetch: () => createConfiguredGraphMcpFetch,
|
|
13
|
-
createConfiguredMcpFetch: () => createConfiguredMcpFetch,
|
|
14
13
|
createMcpAuthFetchClient: () => createMcpAuthFetchClient,
|
|
15
14
|
createMcpFetchClient: () => createMcpFetchClient,
|
|
16
15
|
resolveGraphMcpEndpoint: () => resolveGraphMcpEndpoint
|
|
@@ -144,21 +143,11 @@ function createMcpAuthFetchClient(authToken, baseFetch = fetch) {
|
|
|
144
143
|
function resolveGraphMcpEndpoint(config) {
|
|
145
144
|
return config.graphMcpEndpoint?.trim() || config.mcpEndpoint;
|
|
146
145
|
}
|
|
147
|
-
async function createConfiguredFetchWithToken(authToken, missingTokenName) {
|
|
148
|
-
const normalizedAuthToken = authToken?.trim();
|
|
149
|
-
if (normalizedAuthToken) return createMcpAuthFetchClient(normalizedAuthToken);
|
|
150
|
-
const { isWalletConfigured, decryptKey } = await Promise.resolve().then(() => require("./wallet-gC2jxh7j.cjs")).then((n) => n.wallet_exports);
|
|
151
|
-
if (!await isWalletConfigured()) throw new Error("Hosted access is not configured. Run `chain-insights access-key set <key>` for invited test access. For wallet-paid access, run `chain-insights wallet import <private-key>` once, then run `chain-insights wallet ready`; run `chain-insights wallet topup` if it says the wallet needs funds.");
|
|
152
|
-
return createMcpFetchClient(await decryptKey());
|
|
153
|
-
}
|
|
154
146
|
async function createConfiguredGraphPaidOrFreeFetch() {
|
|
155
147
|
const { isWalletConfigured, decryptKey } = await Promise.resolve().then(() => require("./wallet-gC2jxh7j.cjs")).then((n) => n.wallet_exports);
|
|
156
148
|
if (!await isWalletConfigured()) return createPaymentFailureReportingFetch(fetch);
|
|
157
149
|
return createMcpFetchClient(await decryptKey());
|
|
158
150
|
}
|
|
159
|
-
async function createConfiguredMcpFetch(config) {
|
|
160
|
-
return createConfiguredFetchWithToken(config.mcpAuthToken, "mcpAuthToken");
|
|
161
|
-
}
|
|
162
151
|
async function createConfiguredGraphMcpFetch(config) {
|
|
163
152
|
if (config.graphMcpMode === "debug") {
|
|
164
153
|
const authToken = config.graphMcpAuthToken?.trim() || config.mcpAuthToken?.trim();
|
|
@@ -186,12 +175,6 @@ Object.defineProperty(exports, "client_exports", {
|
|
|
186
175
|
return client_exports;
|
|
187
176
|
}
|
|
188
177
|
});
|
|
189
|
-
Object.defineProperty(exports, "createConfiguredMcpFetch", {
|
|
190
|
-
enumerable: true,
|
|
191
|
-
get: function() {
|
|
192
|
-
return createConfiguredMcpFetch;
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
178
|
Object.defineProperty(exports, "createMcpFetchClient", {
|
|
196
179
|
enumerable: true,
|
|
197
180
|
get: function() {
|
|
@@ -10,7 +10,6 @@ var client_exports = /* @__PURE__ */ __exportAll({
|
|
|
10
10
|
PaymentRequiredError: () => PaymentRequiredError,
|
|
11
11
|
applyMcpAuthHeaders: () => applyMcpAuthHeaders,
|
|
12
12
|
createConfiguredGraphMcpFetch: () => createConfiguredGraphMcpFetch,
|
|
13
|
-
createConfiguredMcpFetch: () => createConfiguredMcpFetch,
|
|
14
13
|
createMcpAuthFetchClient: () => createMcpAuthFetchClient,
|
|
15
14
|
createMcpFetchClient: () => createMcpFetchClient,
|
|
16
15
|
resolveGraphMcpEndpoint: () => resolveGraphMcpEndpoint
|
|
@@ -144,21 +143,11 @@ function createMcpAuthFetchClient(authToken, baseFetch = fetch) {
|
|
|
144
143
|
function resolveGraphMcpEndpoint(config) {
|
|
145
144
|
return config.graphMcpEndpoint?.trim() || config.mcpEndpoint;
|
|
146
145
|
}
|
|
147
|
-
async function createConfiguredFetchWithToken(authToken, missingTokenName) {
|
|
148
|
-
const normalizedAuthToken = authToken?.trim();
|
|
149
|
-
if (normalizedAuthToken) return createMcpAuthFetchClient(normalizedAuthToken);
|
|
150
|
-
const { isWalletConfigured, decryptKey } = await import("./wallet-BL0fJC29.mjs").then((n) => n.s);
|
|
151
|
-
if (!await isWalletConfigured()) throw new Error("Hosted access is not configured. Run `chain-insights access-key set <key>` for invited test access. For wallet-paid access, run `chain-insights wallet import <private-key>` once, then run `chain-insights wallet ready`; run `chain-insights wallet topup` if it says the wallet needs funds.");
|
|
152
|
-
return createMcpFetchClient(await decryptKey());
|
|
153
|
-
}
|
|
154
146
|
async function createConfiguredGraphPaidOrFreeFetch() {
|
|
155
147
|
const { isWalletConfigured, decryptKey } = await import("./wallet-BL0fJC29.mjs").then((n) => n.s);
|
|
156
148
|
if (!await isWalletConfigured()) return createPaymentFailureReportingFetch(fetch);
|
|
157
149
|
return createMcpFetchClient(await decryptKey());
|
|
158
150
|
}
|
|
159
|
-
async function createConfiguredMcpFetch(config) {
|
|
160
|
-
return createConfiguredFetchWithToken(config.mcpAuthToken, "mcpAuthToken");
|
|
161
|
-
}
|
|
162
151
|
async function createConfiguredGraphMcpFetch(config) {
|
|
163
152
|
if (config.graphMcpMode === "debug") {
|
|
164
153
|
const authToken = config.graphMcpAuthToken?.trim() || config.mcpAuthToken?.trim();
|
|
@@ -168,6 +157,6 @@ async function createConfiguredGraphMcpFetch(config) {
|
|
|
168
157
|
return createConfiguredGraphPaidOrFreeFetch();
|
|
169
158
|
}
|
|
170
159
|
//#endregion
|
|
171
|
-
export {
|
|
160
|
+
export { resolveGraphMcpEndpoint as a, createMcpFetchClient as i, applyMcpAuthHeaders as n, client_exports as r, PaymentRequiredError as t };
|
|
172
161
|
|
|
173
|
-
//# sourceMappingURL=client-
|
|
162
|
+
//# sourceMappingURL=client-ytTO0mcZ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-BgmHjBHQ.mjs","names":[],"sources":["../src/mcp/client.ts"],"sourcesContent":["import { wrapFetchWithPaymentFromConfig } from '@x402/fetch'\nimport { ExactEvmScheme } from '@x402/evm'\nimport { UptoEvmScheme } from '@x402/evm/upto/client'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport type { InvestigatorConfig } from '../config/schema.js'\nimport { prepareWalletForPaidCalls } from '../wallet/tools.js'\n\ntype FetchLike = typeof fetch\ntype FetchInput = Parameters<FetchLike>[0]\ntype FetchInit = Parameters<FetchLike>[1]\n\nexport class PaymentRequiredError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'PaymentRequiredError'\n }\n}\n\nexport function applyMcpAuthHeaders(headers: Headers, authToken: string): Headers {\n headers.set('X-MCP-Debug-Token', authToken)\n headers.set('X-MCP-Test-Key', authToken)\n headers.set('X-Chain-Insights-Test-Key', authToken)\n headers.set('Authorization', `Bearer ${authToken}`)\n return headers\n}\n\nfunction createHeaderFetch(authToken: string, baseFetch: FetchLike): FetchLike {\n return (async (input: FetchInput, init?: FetchInit) => {\n const requestHeaders = input instanceof Request ? input.headers : undefined\n const headers = new Headers(init?.headers ?? requestHeaders)\n applyMcpAuthHeaders(headers, authToken)\n\n return baseFetch(input, {\n ...init,\n headers,\n })\n }) as FetchLike\n}\n\nexport const PAYMENT_NEXT_STEPS =\n 'Next steps: run `chain-insights wallet ready` to check funding and finish one-time payment setup, ' +\n 'run `chain-insights wallet topup` if it says the wallet needs USDC, ' +\n 'or `chain-insights access-key set <key>` if you have been given test access.'\n\ninterface PaymentRequirementDetails {\n reason: string\n scheme?: string\n network?: string\n amount?: string\n amountUnits?: bigint\n payTo?: string\n}\n\nfunction paymentRequirementFromResponse(response: Response): PaymentRequirementDetails | null {\n const encoded = response.headers.get('payment-required')\n if (!encoded) return null\n\n try {\n const decoded = Buffer.from(encoded, 'base64').toString('utf8')\n const parsed = JSON.parse(decoded) as {\n error?: unknown\n accepts?: Array<{ scheme?: unknown; network?: unknown; amount?: unknown; payTo?: unknown }>\n }\n const reason = typeof parsed.error === 'string' && parsed.error.trim() ? parsed.error.trim() : 'payment_required'\n const firstRequirement = Array.isArray(parsed.accepts) ? parsed.accepts[0] : undefined\n const amount = typeof firstRequirement?.amount === 'string' ? firstRequirement.amount.trim() : undefined\n return {\n reason,\n scheme: typeof firstRequirement?.scheme === 'string' ? firstRequirement.scheme : undefined,\n network: typeof firstRequirement?.network === 'string' ? firstRequirement.network : undefined,\n amount,\n amountUnits: amount && /^\\d+$/.test(amount) ? BigInt(amount) : undefined,\n payTo: typeof firstRequirement?.payTo === 'string' ? firstRequirement.payTo.trim() : undefined,\n }\n } catch {\n return null\n }\n}\n\nfunction describePaymentRequiredResponse(response: Response, payerAddress?: string): string {\n const requirement = paymentRequirementFromResponse(response)\n if (!requirement) return `Payment required — this tool costs USDC on Base via x402 micropayments. ${PAYMENT_NEXT_STEPS}`\n\n try {\n const { reason, payTo } = requirement\n if (payerAddress && payTo && payerAddress.toLowerCase() === payTo.toLowerCase()) {\n return 'Local payment wallet matches the MCP payTo address. Configure a separate payer wallet with USDC on Base; do not use the service recipient wallet as the client payment wallet.'\n }\n const details = [\n requirement.scheme ? `scheme=${requirement.scheme}` : undefined,\n requirement.network ? `network=${requirement.network}` : undefined,\n requirement.amount ? `amount=${requirement.amount}` : undefined,\n ].filter(Boolean).join(' ')\n const message = details ? `x402 payment failed: ${reason} (${details})` : `x402 payment failed: ${reason}`\n if (reason.includes('allowance_required')) {\n return `${message}. The payment wallet needs one-time setup before paid MCP calls can settle. Run \\`chain-insights wallet ready\\`; Base ETH is used for the setup gas.`\n }\n if (reason === 'payment_required') {\n return `${message}. ${PAYMENT_NEXT_STEPS}`\n }\n return `${message}. ${PAYMENT_NEXT_STEPS}`\n } catch {\n return `Payment required — this tool costs USDC on Base via x402 micropayments. ${PAYMENT_NEXT_STEPS}`\n }\n}\n\nfunction createPaymentFailureReportingFetch(\n baseFetch: FetchLike,\n payerAddress?: string,\n paymentWallet?: { address: `0x${string}`; privateKey: `0x${string}` },\n): FetchLike {\n const reportingFetch = (async (input: FetchInput, init?: FetchInit) => {\n const response = await baseFetch(input, init)\n if (response.status !== 402) return response\n const requirement = paymentRequirementFromResponse(response)\n if (paymentWallet && requirement?.reason.includes('allowance_required')) {\n try {\n await prepareWalletForPaidCalls({\n account: paymentWallet,\n ...(requirement.amountUnits === undefined ? {} : { minimumApprovalUnits: requirement.amountUnits }),\n })\n } catch (err) {\n throw new PaymentRequiredError(\n 'Payment setup is not ready yet. Run `chain-insights wallet ready` and try again. ' +\n `${(err as Error).message}`,\n )\n }\n const retryResponse = await baseFetch(input, init)\n if (retryResponse.status !== 402) return retryResponse\n throw new PaymentRequiredError(describePaymentRequiredResponse(retryResponse, payerAddress))\n }\n throw new PaymentRequiredError(describePaymentRequiredResponse(response, payerAddress))\n }) as FetchLike\n return Object.assign(reportingFetch, baseFetch)\n}\n\n/**\n * Creates an x402-payment-wrapped fetch function for the Chain Insights MCP.\n * Payments are made in USDC on Base Mainnet (eip155:8453).\n *\n * The factory is pure — no side effects, no state, no caching.\n * If called with an invalid private key format, viem throws — the error propagates.\n *\n * @param privateKey - 0x-prefixed EVM private key (decrypted from wallet.json)\n * @returns A fetch-compatible function that auto-handles HTTP 402 payment challenges\n */\nexport function createMcpFetchClient(privateKey: `0x${string}`, authToken?: string) {\n const account = privateKeyToAccount(privateKey)\n const paymentFetch = wrapFetchWithPaymentFromConfig(fetch, {\n schemes: [\n {\n network: 'eip155:8453', // Base Mainnet — dynamic MCP pricing uses the x402 upto scheme\n client: new UptoEvmScheme(account),\n },\n {\n network: 'eip155:8453', // Base Mainnet — only supported chain in v1\n client: new ExactEvmScheme(account),\n },\n ],\n })\n const reportingFetch = createPaymentFailureReportingFetch(\n paymentFetch,\n account.address,\n { address: account.address, privateKey },\n )\n return authToken ? createHeaderFetch(authToken, reportingFetch) : reportingFetch\n}\n\n/**\n * Creates a bearer/debug-token fetch for local Graph MCP testing.\n *\n * GraphRAG MCP deployments accept test access through the public debug header,\n * staging test-key headers, or Authorization: Bearer depending on the route.\n * Sending all supported auth headers lets one config value work across hosted\n * MCP calls, metadata reads, and private M2M endpoints.\n *\n * Wraps with 402 interception so that if the server still requires payment\n * (e.g. token not accepted for paid tools), the user sees actionable guidance\n * instead of a generic transport error.\n */\nexport function createMcpAuthFetchClient(authToken: string, baseFetch: FetchLike = fetch): FetchLike {\n const headerFetch = createHeaderFetch(authToken, baseFetch)\n return createPaymentFailureReportingFetch(headerFetch)\n}\n\nexport function resolveGraphMcpEndpoint(config: Pick<InvestigatorConfig, 'graphMcpEndpoint' | 'mcpEndpoint'>): string {\n const graphEndpoint = config.graphMcpEndpoint?.trim()\n return graphEndpoint || config.mcpEndpoint\n}\n\nasync function createConfiguredFetchWithToken(\n authToken: string | undefined,\n missingTokenName: string,\n): Promise<FetchLike> {\n const normalizedAuthToken = authToken?.trim()\n if (normalizedAuthToken) return createMcpAuthFetchClient(normalizedAuthToken)\n\n const { isWalletConfigured, decryptKey } = await import('../wallet/index.js')\n if (!(await isWalletConfigured())) {\n throw new Error(\n 'Hosted access is not configured. ' +\n 'Run `chain-insights access-key set <key>` for invited test access. ' +\n 'For wallet-paid access, run `chain-insights wallet import <private-key>` once, then run `chain-insights wallet ready`; ' +\n 'run `chain-insights wallet topup` if it says the wallet needs funds.',\n )\n }\n\n const privateKey = await decryptKey()\n return createMcpFetchClient(privateKey as `0x${string}`)\n}\n\nasync function createConfiguredGraphPaidOrFreeFetch(): Promise<FetchLike> {\n const { isWalletConfigured, decryptKey } = await import('../wallet/index.js')\n if (!(await isWalletConfigured())) {\n return createPaymentFailureReportingFetch(fetch)\n }\n\n const privateKey = await decryptKey()\n return createMcpFetchClient(privateKey as `0x${string}`)\n}\n\nexport async function createConfiguredMcpFetch(config: Pick<InvestigatorConfig, 'mcpAuthToken'>): Promise<FetchLike> {\n return createConfiguredFetchWithToken(config.mcpAuthToken, 'mcpAuthToken')\n}\n\nexport async function createConfiguredGraphMcpFetch(\n config: Pick<InvestigatorConfig, 'mcpAuthToken' | 'graphMcpAuthToken' | 'graphMcpMode'>,\n): Promise<FetchLike> {\n if (config.graphMcpMode === 'debug') {\n const authToken = config.graphMcpAuthToken?.trim() || config.mcpAuthToken?.trim()\n if (!authToken) {\n throw new Error('Graph MCP debug mode requires graphMcpAuthToken. Run `cia access-key set <key>` or `cia debug on --token <token>`.')\n }\n return createMcpAuthFetchClient(authToken)\n }\n\n return createConfiguredGraphPaidOrFreeFetch()\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client-ytTO0mcZ.mjs","names":[],"sources":["../src/mcp/client.ts"],"sourcesContent":["import { wrapFetchWithPaymentFromConfig } from '@x402/fetch'\nimport { ExactEvmScheme } from '@x402/evm'\nimport { UptoEvmScheme } from '@x402/evm/upto/client'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport type { InvestigatorConfig } from '../config/schema.js'\nimport { prepareWalletForPaidCalls } from '../wallet/tools.js'\n\ntype FetchLike = typeof fetch\ntype FetchInput = Parameters<FetchLike>[0]\ntype FetchInit = Parameters<FetchLike>[1]\n\nexport class PaymentRequiredError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'PaymentRequiredError'\n }\n}\n\nexport function applyMcpAuthHeaders(headers: Headers, authToken: string): Headers {\n headers.set('X-MCP-Debug-Token', authToken)\n headers.set('X-MCP-Test-Key', authToken)\n headers.set('X-Chain-Insights-Test-Key', authToken)\n headers.set('Authorization', `Bearer ${authToken}`)\n return headers\n}\n\nfunction createHeaderFetch(authToken: string, baseFetch: FetchLike): FetchLike {\n return (async (input: FetchInput, init?: FetchInit) => {\n const requestHeaders = input instanceof Request ? input.headers : undefined\n const headers = new Headers(init?.headers ?? requestHeaders)\n applyMcpAuthHeaders(headers, authToken)\n\n return baseFetch(input, {\n ...init,\n headers,\n })\n }) as FetchLike\n}\n\nexport const PAYMENT_NEXT_STEPS =\n 'Next steps: run `chain-insights wallet ready` to check funding and finish one-time payment setup, ' +\n 'run `chain-insights wallet topup` if it says the wallet needs USDC, ' +\n 'or `chain-insights access-key set <key>` if you have been given test access.'\n\ninterface PaymentRequirementDetails {\n reason: string\n scheme?: string\n network?: string\n amount?: string\n amountUnits?: bigint\n payTo?: string\n}\n\nfunction paymentRequirementFromResponse(response: Response): PaymentRequirementDetails | null {\n const encoded = response.headers.get('payment-required')\n if (!encoded) return null\n\n try {\n const decoded = Buffer.from(encoded, 'base64').toString('utf8')\n const parsed = JSON.parse(decoded) as {\n error?: unknown\n accepts?: Array<{ scheme?: unknown; network?: unknown; amount?: unknown; payTo?: unknown }>\n }\n const reason = typeof parsed.error === 'string' && parsed.error.trim() ? parsed.error.trim() : 'payment_required'\n const firstRequirement = Array.isArray(parsed.accepts) ? parsed.accepts[0] : undefined\n const amount = typeof firstRequirement?.amount === 'string' ? firstRequirement.amount.trim() : undefined\n return {\n reason,\n scheme: typeof firstRequirement?.scheme === 'string' ? firstRequirement.scheme : undefined,\n network: typeof firstRequirement?.network === 'string' ? firstRequirement.network : undefined,\n amount,\n amountUnits: amount && /^\\d+$/.test(amount) ? BigInt(amount) : undefined,\n payTo: typeof firstRequirement?.payTo === 'string' ? firstRequirement.payTo.trim() : undefined,\n }\n } catch {\n return null\n }\n}\n\nfunction describePaymentRequiredResponse(response: Response, payerAddress?: string): string {\n const requirement = paymentRequirementFromResponse(response)\n if (!requirement) return `Payment required — this tool costs USDC on Base via x402 micropayments. ${PAYMENT_NEXT_STEPS}`\n\n try {\n const { reason, payTo } = requirement\n if (payerAddress && payTo && payerAddress.toLowerCase() === payTo.toLowerCase()) {\n return 'Local payment wallet matches the MCP payTo address. Configure a separate payer wallet with USDC on Base; do not use the service recipient wallet as the client payment wallet.'\n }\n const details = [\n requirement.scheme ? `scheme=${requirement.scheme}` : undefined,\n requirement.network ? `network=${requirement.network}` : undefined,\n requirement.amount ? `amount=${requirement.amount}` : undefined,\n ].filter(Boolean).join(' ')\n const message = details ? `x402 payment failed: ${reason} (${details})` : `x402 payment failed: ${reason}`\n if (reason.includes('allowance_required')) {\n return `${message}. The payment wallet needs one-time setup before paid MCP calls can settle. Run \\`chain-insights wallet ready\\`; Base ETH is used for the setup gas.`\n }\n if (reason === 'payment_required') {\n return `${message}. ${PAYMENT_NEXT_STEPS}`\n }\n return `${message}. ${PAYMENT_NEXT_STEPS}`\n } catch {\n return `Payment required — this tool costs USDC on Base via x402 micropayments. ${PAYMENT_NEXT_STEPS}`\n }\n}\n\nfunction createPaymentFailureReportingFetch(\n baseFetch: FetchLike,\n payerAddress?: string,\n paymentWallet?: { address: `0x${string}`; privateKey: `0x${string}` },\n): FetchLike {\n const reportingFetch = (async (input: FetchInput, init?: FetchInit) => {\n const response = await baseFetch(input, init)\n if (response.status !== 402) return response\n const requirement = paymentRequirementFromResponse(response)\n if (paymentWallet && requirement?.reason.includes('allowance_required')) {\n try {\n await prepareWalletForPaidCalls({\n account: paymentWallet,\n ...(requirement.amountUnits === undefined ? {} : { minimumApprovalUnits: requirement.amountUnits }),\n })\n } catch (err) {\n throw new PaymentRequiredError(\n 'Payment setup is not ready yet. Run `chain-insights wallet ready` and try again. ' +\n `${(err as Error).message}`,\n )\n }\n const retryResponse = await baseFetch(input, init)\n if (retryResponse.status !== 402) return retryResponse\n throw new PaymentRequiredError(describePaymentRequiredResponse(retryResponse, payerAddress))\n }\n throw new PaymentRequiredError(describePaymentRequiredResponse(response, payerAddress))\n }) as FetchLike\n return Object.assign(reportingFetch, baseFetch)\n}\n\n/**\n * Creates an x402-payment-wrapped fetch function for the Chain Insights MCP.\n * Payments are made in USDC on Base Mainnet (eip155:8453).\n *\n * The factory is pure — no side effects, no state, no caching.\n * If called with an invalid private key format, viem throws — the error propagates.\n *\n * @param privateKey - 0x-prefixed EVM private key (decrypted from wallet.json)\n * @returns A fetch-compatible function that auto-handles HTTP 402 payment challenges\n */\nexport function createMcpFetchClient(privateKey: `0x${string}`, authToken?: string) {\n const account = privateKeyToAccount(privateKey)\n const paymentFetch = wrapFetchWithPaymentFromConfig(fetch, {\n schemes: [\n {\n network: 'eip155:8453', // Base Mainnet — dynamic MCP pricing uses the x402 upto scheme\n client: new UptoEvmScheme(account),\n },\n {\n network: 'eip155:8453', // Base Mainnet — only supported chain in v1\n client: new ExactEvmScheme(account),\n },\n ],\n })\n const reportingFetch = createPaymentFailureReportingFetch(\n paymentFetch,\n account.address,\n { address: account.address, privateKey },\n )\n return authToken ? createHeaderFetch(authToken, reportingFetch) : reportingFetch\n}\n\n/**\n * Creates a bearer/debug-token fetch for local Graph MCP testing.\n *\n * GraphRAG MCP deployments accept test access through the public debug header,\n * staging test-key headers, or Authorization: Bearer depending on the route.\n * Sending all supported auth headers lets one config value work across hosted\n * MCP calls, metadata reads, and private M2M endpoints.\n *\n * Wraps with 402 interception so that if the server still requires payment\n * (e.g. token not accepted for paid tools), the user sees actionable guidance\n * instead of a generic transport error.\n */\nexport function createMcpAuthFetchClient(authToken: string, baseFetch: FetchLike = fetch): FetchLike {\n const headerFetch = createHeaderFetch(authToken, baseFetch)\n return createPaymentFailureReportingFetch(headerFetch)\n}\n\nexport function resolveGraphMcpEndpoint(config: Pick<InvestigatorConfig, 'graphMcpEndpoint' | 'mcpEndpoint'>): string {\n const graphEndpoint = config.graphMcpEndpoint?.trim()\n return graphEndpoint || config.mcpEndpoint\n}\n\nasync function createConfiguredFetchWithToken(\n authToken: string | undefined,\n missingTokenName: string,\n): Promise<FetchLike> {\n const normalizedAuthToken = authToken?.trim()\n if (normalizedAuthToken) return createMcpAuthFetchClient(normalizedAuthToken)\n\n const { isWalletConfigured, decryptKey } = await import('../wallet/index.js')\n if (!(await isWalletConfigured())) {\n throw new Error(\n 'Hosted access is not configured. ' +\n 'Run `chain-insights access-key set <key>` for invited test access. ' +\n 'For wallet-paid access, run `chain-insights wallet import <private-key>` once, then run `chain-insights wallet ready`; ' +\n 'run `chain-insights wallet topup` if it says the wallet needs funds.',\n )\n }\n\n const privateKey = await decryptKey()\n return createMcpFetchClient(privateKey as `0x${string}`)\n}\n\nasync function createConfiguredGraphPaidOrFreeFetch(): Promise<FetchLike> {\n const { isWalletConfigured, decryptKey } = await import('../wallet/index.js')\n if (!(await isWalletConfigured())) {\n return createPaymentFailureReportingFetch(fetch)\n }\n\n const privateKey = await decryptKey()\n return createMcpFetchClient(privateKey as `0x${string}`)\n}\n\nexport async function createConfiguredMcpFetch(config: Pick<InvestigatorConfig, 'mcpAuthToken'>): Promise<FetchLike> {\n return createConfiguredFetchWithToken(config.mcpAuthToken, 'mcpAuthToken')\n}\n\nexport async function createConfiguredGraphMcpFetch(\n config: Pick<InvestigatorConfig, 'mcpAuthToken' | 'graphMcpAuthToken' | 'graphMcpMode'>,\n): Promise<FetchLike> {\n if (config.graphMcpMode === 'debug') {\n const authToken = config.graphMcpAuthToken?.trim() || config.mcpAuthToken?.trim()\n if (!authToken) {\n throw new Error('Graph MCP debug mode requires graphMcpAuthToken. Run `cia access-key set <key>` or `cia debug on --token <token>`.')\n }\n return createMcpAuthFetchClient(authToken)\n }\n\n return createConfiguredGraphPaidOrFreeFetch()\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
-
import { r as graphMcpEndpointEnvOverride } from "./mcp-endpoint-
|
|
3
|
-
import { n as parseInvestigatorConfig, t as DEFAULT_CONFIG } from "./schema-
|
|
2
|
+
import { r as graphMcpEndpointEnvOverride } from "./mcp-endpoint-QQ5Lbqc2.mjs";
|
|
3
|
+
import { n as parseInvestigatorConfig, t as DEFAULT_CONFIG } from "./schema-D_qwaQA5.mjs";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
6
6
|
import os from "node:os";
|
|
@@ -74,4 +74,4 @@ async function resetConfigCache() {
|
|
|
74
74
|
//#endregion
|
|
75
75
|
export { saveConfig as i, loadConfig as n, resetConfigCache as r, config_exports as t };
|
|
76
76
|
|
|
77
|
-
//# sourceMappingURL=config-
|
|
77
|
+
//# sourceMappingURL=config-C6zM8Xir.mjs.map
|