chain-insights 0.37.2 → 0.40.0
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 +25 -1
- package/bin/install.cjs +59 -2
- package/dist/{action-log-diTHyMbV.mjs → action-log-D49Par9P.mjs} +2 -2
- package/dist/{action-log-diTHyMbV.mjs.map → action-log-D49Par9P.mjs.map} +1 -1
- package/dist/{active-BQopLul8.mjs → active-Dkf8AB1R.mjs} +2 -2
- package/dist/{active-BQopLul8.mjs.map → active-Dkf8AB1R.mjs.map} +1 -1
- package/dist/apps/claude-view.html +117 -0
- package/dist/{capabilities-C8DQSfyW.mjs → capabilities-BOOUnAeV.mjs} +3 -3
- package/dist/{capabilities-C8DQSfyW.mjs.map → capabilities-BOOUnAeV.mjs.map} +1 -1
- package/dist/cli.cjs +26 -24
- package/dist/cli.mjs +49 -47
- package/dist/cli.mjs.map +1 -1
- package/dist/{client-CHYskPnG.mjs → client-gsLi528K.mjs} +4 -4
- package/dist/{client-CHYskPnG.mjs.map → client-gsLi528K.mjs.map} +1 -1
- package/dist/{config-DbbPiGk0.mjs → config-Br6VEK0O.mjs} +3 -3
- package/dist/{config-DbbPiGk0.mjs.map → config-Br6VEK0O.mjs.map} +1 -1
- package/dist/{config-B542AM4w.cjs → config-CPUhkz0Z.cjs} +1 -1
- package/dist/{create-C0buxEfU.mjs → create-CpfZq2fx.mjs} +2 -2
- package/dist/{create-C0buxEfU.mjs.map → create-CpfZq2fx.mjs.map} +1 -1
- package/dist/index.cjs +5 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +7 -6
- package/dist/mcp-proxy.cjs +459 -34
- package/dist/mcp-proxy.d.cts +7 -0
- package/dist/mcp-proxy.d.cts.map +1 -1
- package/dist/mcp-proxy.d.mts +7 -0
- package/dist/mcp-proxy.d.mts.map +1 -1
- package/dist/mcp-proxy.mjs +466 -44
- package/dist/mcp-proxy.mjs.map +1 -1
- package/dist/{public-tools-DWONw7kZ.cjs → public-tools-3yTC17cA.cjs} +1 -6
- package/dist/{public-tools-CDpFHbZ8.mjs → public-tools-CZyeptJQ.mjs} +3 -8
- package/dist/public-tools-CZyeptJQ.mjs.map +1 -0
- package/dist/{rolldown-runtime-D7D4PA-g.mjs → rolldown-runtime-8H4AJuhK.mjs} +1 -0
- package/dist/{schema-B0OuHW_l.mjs → schema-KjZqCHbu.mjs} +3 -3
- package/dist/schema-KjZqCHbu.mjs.map +1 -0
- package/dist/schema-cache-DJdU4MIP.mjs.map +1 -1
- package/dist/{schema-CtFWYoJz.cjs → schema-tX0U0-VI.cjs} +1 -1
- package/dist/{subscription-status-MyeqOmbA.mjs → subscription-status-CJ-DaMW9.mjs} +2 -2
- package/dist/{subscription-status-MyeqOmbA.mjs.map → subscription-status-CJ-DaMW9.mjs.map} +1 -1
- package/dist/{tool-visibility-CyZqYnQA.cjs → tool-visibility-Boxtlbtr.cjs} +19 -1
- package/dist/{tool-visibility-CJV9HezW.mjs → tool-visibility-IB5nHCZ_.mjs} +16 -4
- package/dist/tool-visibility-IB5nHCZ_.mjs.map +1 -0
- package/dist/{tools-BRQAPF2R.mjs → tools-BnThuvE2.mjs} +3 -3
- package/dist/{tools-BRQAPF2R.mjs.map → tools-BnThuvE2.mjs.map} +1 -1
- package/dist/topup-server-BIbSfvX5.cjs +146 -0
- package/dist/{topup-server-YN3iHrHW.cjs → topup-server-Bh7MlzRt.cjs} +485 -239
- package/dist/{topup-server-BLdF1SFQ.mjs → topup-server-BrkPhqJG.mjs} +488 -242
- package/dist/topup-server-BrkPhqJG.mjs.map +1 -0
- package/dist/topup-server-DzeM_YAt.mjs +131 -0
- package/dist/topup-server-DzeM_YAt.mjs.map +1 -0
- package/dist/{usage-status-CHiOPA-2.mjs → usage-status-CXOnrq-s.mjs} +2 -2
- package/dist/{usage-status-CHiOPA-2.mjs.map → usage-status-CXOnrq-s.mjs.map} +1 -1
- package/dist/{wallet-COcm4oIb.mjs → wallet-GNDl3FkR.mjs} +2 -2
- package/dist/{wallet-COcm4oIb.mjs.map → wallet-GNDl3FkR.mjs.map} +1 -1
- package/docs/graph-query-compatibility.md +27 -10
- package/docs/graph-tools.md +40 -16
- package/docs/mcp-proxy.md +39 -8
- package/docs/stability.md +2 -1
- package/package.json +5 -6
- package/skills/chain-insights-cypher/SKILL.md +56 -23
- package/skills/chain-insights-schema-evm/SKILL.md +38 -27
- package/dist/html-generator-BCDtYcGs.mjs +0 -16
- package/dist/html-generator-BCDtYcGs.mjs.map +0 -1
- package/dist/html-generator-DFwMRWN3.cjs +0 -16
- package/dist/public-tools-CDpFHbZ8.mjs.map +0 -1
- package/dist/schema-B0OuHW_l.mjs.map +0 -1
- package/dist/tool-visibility-CJV9HezW.mjs.map +0 -1
- package/dist/topup-server-BLdF1SFQ.mjs.map +0 -1
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":[],"sources":["../src/investigation/workflows.ts","../src/mcp/print-result.ts","../src/cli.ts"],"sourcesContent":["export interface CiaWorkflow {\n name: string\n tool: string\n network: string\n description: string\n command: string\n}\n\nexport const CIA_WORKFLOWS: readonly CiaWorkflow[] = [\n {\n name: 'aml-address-risk',\n tool: 'aml_address_risk',\n network: 'robinhood',\n description: 'Screen one address for AML risk, behavior, and exchange exposure.',\n command: 'cia workflow aml-address-risk',\n },\n]\n\nconst NAME_WIDTH = 22\nconst NETWORK_WIDTH = 12\nconst COMMAND_WIDTH = 34\n\nfunction formatRow(values: string[]): string {\n return [\n values[0]?.padEnd(NAME_WIDTH),\n values[1]?.padEnd(NETWORK_WIDTH),\n values[2]?.padEnd(COMMAND_WIDTH),\n ].join(' ')\n}\n\nexport function formatCiaWorkflows(workflows: readonly CiaWorkflow[]): string {\n if (workflows.length === 0) return 'No CIA workflow tools available.'\n\n const rows = workflows.flatMap((workflow) => [\n formatRow([workflow.name, workflow.network, workflow.command]),\n ` ${workflow.description}`,\n ])\n\n return [\n 'CIA workflow tools',\n '',\n formatRow(['Workflow', 'Network', 'Run with']),\n formatRow(['-'.repeat(NAME_WIDTH), '-'.repeat(NETWORK_WIDTH), '-'.repeat(COMMAND_WIDTH)]),\n ...rows,\n ].join('\\n')\n}\n","export interface McpTextResult {\n content?: Array<{ type: string; text?: string }>\n isError?: boolean\n}\n\nexport interface McpPrintOptions {\n tool?: string\n json?: boolean\n}\n\ntype JsonRecord = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatTable(rows: Array<JsonRecord>): string[] {\n if (rows.length === 0) return []\n const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))]\n const values = rows.map((row) => columns.map((column) => displayValue(row[column])))\n const widths = columns.map((column, index) =>\n Math.max(column.length, ...values.map((row) => row[index]?.length ?? 0))\n )\n const line = (row: string[]): string =>\n row\n .map((value, index) => (index === row.length - 1 ? value : value.padEnd(widths[index] ?? 0)))\n .join(' | ')\n return [line(columns), widths.map((width) => '-'.repeat(width)).join('-+-'), ...values.map(line)]\n}\n\nfunction formatGraphResult(value: JsonRecord, fallbackTool?: string): string | null {\n const facts = isRecord(value.facts) ? value.facts : undefined\n const query = facts && isRecord(facts.query) ? facts.query : undefined\n const queries = facts && Array.isArray(facts.queries) ? facts.queries : undefined\n if (!query && !queries) return null\n\n const lines = [`Tool: ${displayValue(value.tool) || fallbackTool || 'MCP result'}`]\n const subject = isRecord(value.subject)\n ? value.subject\n : facts && isRecord(facts.subject)\n ? facts.subject\n : undefined\n if (subject?.network !== undefined) lines.push(`Network: ${displayValue(subject.network)}`)\n\n if (query) {\n const results = Array.isArray(query.results) ? query.results.filter(isRecord) : []\n if (query.count !== undefined) lines.push(`Rows: ${displayValue(query.count)}`)\n else lines.push(`Rows: ${results.length}`)\n if (query.billable_units !== undefined) {\n lines.push(`Billed units: ${displayValue(query.billable_units)}`)\n }\n if (query.elapsed_ms !== undefined) lines.push(`Elapsed: ${displayValue(query.elapsed_ms)} ms`)\n if (query.truncated !== undefined) lines.push(`Truncated: ${displayValue(query.truncated)}`)\n if (query.error !== undefined) lines.push(`Error: ${displayValue(query.error)}`)\n if (results.length > 0) lines.push('', 'Results:', ...formatTable(results))\n else lines.push('', 'Results: none')\n }\n\n if (queries) {\n lines.push(`Queries: ${queries.length}`)\n for (const entry of queries) {\n if (!isRecord(entry)) continue\n const id = displayValue(entry.id) || 'query'\n const results = Array.isArray(entry.results) ? entry.results.filter(isRecord) : []\n lines.push('', `[${id}]`)\n if (entry.error !== undefined) lines.push(`Error: ${displayValue(entry.error)}`)\n lines.push(`Rows: ${displayValue(entry.count ?? results.length)}`)\n if (results.length > 0) lines.push(...formatTable(results))\n else lines.push('Results: none')\n }\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Formats one MCP text block for terminal output. JSON is indented when the\n * caller requests `--json`; graph query envelopes are rendered as a compact\n * result summary and table by default.\n */\nexport function formatMcpTextContent(\n text: string,\n tool?: string,\n options: Pick<McpPrintOptions, 'json'> = {}\n): string {\n let parsed: unknown\n try {\n parsed = JSON.parse(text) as unknown\n } catch {\n return text\n }\n\n if (options.json) {\n try {\n return JSON.stringify(parsed, null, 2)\n } catch {\n return text\n }\n }\n\n if (isRecord(parsed)) {\n return formatGraphResult(parsed, tool) ?? JSON.stringify(parsed, null, 2)\n }\n return displayValue(parsed)\n}\n\n/**\n * Prints the text blocks of an MCP tool result to stdout. When the result is\n * flagged `isError`, throws with the tool's error text instead — MCP `callTool`\n * returns tool errors as ordinary results (it does not reject), so callers must\n * surface them as failures (non-zero exit) rather than printing to stdout and\n * exiting 0.\n */\nexport function printMcpTextContent(result: McpTextResult, options: McpPrintOptions = {}): void {\n const texts = (result.content ?? [])\n .filter((item) => item.type === 'text')\n .map((item) => item.text ?? '')\n\n if (result.isError) {\n throw new Error(texts.join('\\n').trim() || 'MCP tool returned an error')\n }\n\n for (const text of texts) console.log(formatMcpTextContent(text, options.tool, options))\n}\n","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'\nimport { CIA_WORKFLOWS, formatCiaWorkflows } from './investigation/workflows.js'\nimport { printMcpTextContent } from './mcp/print-result.js'\nimport type { SubscriptionPass, SubscriptionStatusFacts } from './mcp/subscription-status.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\nfunction createCliCommand(name: string): Command {\n return new Command(name).showHelpAfterError()\n}\n\nprogram\n .name('cia')\n .description('AML investigation toolkit for blockchain analysis')\n .version(PACKAGE_INFO.version)\n .showHelpAfterError()\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(\n '--hermes',\n 'Install Hermes skills globally to ~/.hermes/skills/chain-insights/ and register MCP'\n )\n\n// Handle installer flags when invoked with no subcommand (bare `chain-insights --claude`)\nconst rawArgs = process.argv.slice(2)\nconst installerFlags = rawArgs.filter(\n (a) => a === '--claude' || a === '--codex' || a === '--hermes'\n)\n\n// Commander treats the root package `--version` option as global, so it would\n// consume the same flag on the AML workflow command before the child can route\n// a tool contract. Rewrite only the child-command form to a hidden alias. The\n// visible child help still documents `--version`, while root `cia --version`\n// remains the package version.\nfunction normalizeAmlToolVersionArgv(argv: string[]): string[] {\n const commandIndex = rawArgs.findIndex(\n (arg, index) => arg === 'aml-address-risk' && index === 1 && rawArgs[0] === 'workflow'\n )\n if (commandIndex === -1) return argv\n\n return argv.map((arg, index) => {\n const userArgIndex = index - 2\n if (userArgIndex <= commandIndex) return arg\n if (arg === '--version') return '--tool-version'\n if (arg.startsWith('--version=')) return `--tool-version=${arg.slice('--version='.length)}`\n return arg\n })\n}\n// A help/version request must never trigger a global install side effect — let\n// commander handle it and print help/version instead.\nconst wantsHelpOrVersion = rawArgs.some(\n (a) => a === '--help' || a === '-h' || a === '--version' || a === '-V'\n)\nif (installerFlags.length > 0 && !wantsHelpOrVersion && !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\n// Legacy mcp aliases for retired graph tools are not commands; reject them\n// before Commander can mis-parse them. Members are built by concatenation so\n// retired names never appear as literal source strings.\nconst retiredMcpAliases = new Set([['trace', '-funds'].join(''), ['track', '-funds'].join('')])\nif (rawArgs[0] === 'mcp' && retiredMcpAliases.has(rawArgs[1] ?? '')) {\n console.error(`error: unknown command '${rawArgs[1]}'`)\n process.exit(1)\n}\n\nfunction runInstaller(flag: '--claude' | '--codex' | '--hermes'): void {\n try {\n execFileSync(process.execPath, [installerPath, flag], { stdio: 'inherit' })\n } catch (err) {\n console.error('Installation failed:', (err as Error).message)\n process.exit(1)\n }\n}\n\nasync function withGraphMcpClient<T>(\n name: string,\n fn: (\n client: import('@modelcontextprotocol/sdk/client/index.js').Client,\n config: Awaited<ReturnType<typeof import('./config/index.js').loadConfig>>\n ) => Promise<T>\n): 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 // A dead or wrong endpoint (e.g. a stale `debug` config pointing at a stopped\n // local server) otherwise surfaces as a bare \"fetch failed\"; toGraphMcpEndpointError\n // names the endpoint and the cause, and passes real backend errors through.\n const { toGraphMcpEndpointError } = await import('./mcp/transport-error.js')\n const endpoint = resolveGraphMcpEndpoint(config)\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } =\n await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name, version: PACKAGE_VERSION })\n try {\n await client.connect(\n new StreamableHTTPClientTransport(new URL(endpoint), {\n fetch: paymentFetch,\n })\n )\n } catch (err) {\n throw toGraphMcpEndpointError(err, endpoint)\n }\n // Every CLI command builds its own client, separate from the MCP proxy's\n // one, so unattended scheduled CLI runs also write to the action log.\n const { installActionLogging } = await import('./mcp/action-log.js')\n installActionLogging(client)\n try {\n return await fn(client, config)\n } catch (err) {\n throw toGraphMcpEndpointError(err, endpoint)\n } finally {\n await client.close()\n }\n}\n\nasync function printNetworkCapabilities(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkCapabilities } =\n 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\nasync function printNetworkOverview(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkOverview } = 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(formatNetworkOverview(document))\n }\n}\n\nasync function printNetworkCapability(name: string, opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } =\n await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n const network = findNetworkCapability(document, name)\n if (!network) {\n const available = document.networks.map((candidate) => candidate.network).join(', ')\n const suffix = available ? ` Available networks: ${available}.` : ''\n throw new Error(\n `Network \"${name}\" is not supported.${suffix} Run \\`cia networks\\` to list supported networks.`\n )\n }\n if (opts.json) {\n console.log(JSON.stringify(network, null, 2))\n } else {\n console.log(formatNetworkCapability(network))\n }\n}\n\ntype SubscriptionStatusLookup =\n { kind: 'available'; facts: SubscriptionStatusFacts } | { kind: 'unavailable'; reason: string }\n\n/**\n * Fetches the caller's subscription facts for the deposit pre-sign guard.\n * The extension math is server-authoritative: the printed values come from\n * `subscription_status`. Any failure (no wallet, unreachable endpoint,\n * missing tool, error result) degrades to an unavailable lookup — the guard\n * must never block the flow on a server that lacks the tool.\n */\nasync function fetchSubscriptionStatusForCli(): Promise<SubscriptionStatusLookup> {\n try {\n const { getWalletAccount } = await import('./wallet/tools.js')\n const account = await getWalletAccount()\n return await withGraphMcpClient(\n 'chain-insights-cli-subscription-status',\n async (client): Promise<SubscriptionStatusLookup> => {\n const result = (await client.callTool({\n name: 'subscription_status',\n arguments: { wallet: account.address },\n })) as {\n content?: Array<{ type: string; text?: string }>\n structuredContent?: Record<string, unknown>\n isError?: boolean\n }\n const { parseSubscriptionStatusToolResult } = await import('./mcp/subscription-status.js')\n const facts = parseSubscriptionStatusToolResult(result)\n if (!facts) {\n return {\n kind: 'unavailable',\n reason: 'the graph endpoint returned no subscription facts',\n }\n }\n return { kind: 'available', facts }\n }\n )\n } catch (err) {\n return { kind: 'unavailable', reason: (err as Error).message }\n }\n}\n\nasync function printSubscriptionPassGuidance(pass: SubscriptionPass): Promise<void> {\n const {\n formatDepositGuardLine,\n formatDepositIrreversibilityWarning,\n formatSubscriptionPassHint,\n isDepositConfirmed,\n resolveSubscriptionMonthUsd,\n } = await import('./mcp/subscription-status.js')\n const hint = formatSubscriptionPassHint(pass, resolveSubscriptionMonthUsd())\n const status = await fetchSubscriptionStatusForCli()\n\n if (status.kind === 'available') {\n process.stderr.write(`${formatDepositGuardLine(status.facts, pass)}\\n`)\n process.stderr.write(\n 'The no-admin subscription sink cannot refund deposits. Type DEPOSIT to continue:\\n'\n )\n const { createInterface } = await import('node:readline/promises')\n const prompt = createInterface({ input: process.stdin, output: process.stderr })\n let answer: string\n try {\n answer = await prompt.question('> ')\n } finally {\n prompt.close()\n }\n process.stderr.write('\\n')\n if (!isDepositConfirmed(answer)) {\n throw new Error('Deposit cancelled. No deposit was made.')\n }\n console.log(hint)\n return\n }\n\n // Server lacks the tool (or is unreachable): generic irreversibility\n // warning, then proceed with the guidance.\n process.stderr.write(`${formatDepositIrreversibilityWarning(status.reason)}\\n`)\n console.log(hint)\n}\n\nfunction addAmlAddressRiskCommand(parent: Command, networksCommand: string): void {\n parent.addCommand(\n createCliCommand('aml-address-risk')\n .description(\n 'CIA workflow: screen an address for AML risk, exchange behavior, and optional comparison with another address'\n )\n .requiredOption('--address <address>', 'Full blockchain address to screen')\n .requiredOption(\n '--network <network>',\n `Network to query. Run \\`${networksCommand}\\` for supported networks.`\n )\n .option(\n '--compare-address <address>',\n 'Optional second address to compare against the screened address'\n )\n .option('--json', 'Print machine-readable JSON output')\n .option(\n '--version <version>',\n 'AML tool contract version. Omit to use the latest version (currently v1)'\n )\n .addOption(\n new Option('--tool-version <version>', 'Internal alias for the AML tool version').hideHelp()\n )\n .action(\n async (opts: {\n address: string\n network: string\n compareAddress?: string\n json?: boolean\n version?: string\n toolVersion?: string\n }) => {\n try {\n const { resolveAmlAddressRiskVersion } = await import('./investigation/public-tools.js')\n const requestedVersion = opts.toolVersion ?? opts.version\n resolveAmlAddressRiskVersion(requestedVersion)\n await withGraphMcpClient('chain-insights-cli-aml-address-risk', async (client) => {\n const { runAmlAddressRisk } = await import('./investigation/public-tools.js')\n const result = await runAmlAddressRisk(\n client,\n {\n address: opts.address,\n network: opts.network,\n compareAddress: opts.compareAddress,\n },\n requestedVersion\n )\n console.log(\n opts.json ? JSON.stringify(result.structuredContent, null, 2) : result.summaryText\n )\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n }\n )\n )\n}\n\nprogram\n .command('networks')\n .description('Show supported network status and dataset overview')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkOverview(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('network')\n .description('Show details for one supported graph network')\n .argument('<name>', 'Network identifier or display name (for example: robinhood)')\n .option('--json', 'Print raw capability JSON for this network')\n .action(async (name: string, opts: { json?: boolean }) => {\n try {\n await printNetworkCapability(name, opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('workflows')\n .description('List CIA workflow tools')\n .option('--json', 'Print the workflow catalog as JSON')\n .action((opts: { json?: boolean }) => {\n if (opts.json) {\n console.log(JSON.stringify(CIA_WORKFLOWS, null, 2))\n return\n }\n console.log(formatCiaWorkflows(CIA_WORKFLOWS))\n })\n\nconst workflowCommand = program.command('workflow').description('Run a high-level CIA workflow')\n\naddAmlAddressRiskCommand(workflowCommand, 'cia networks')\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 config = await loadConfig()\n const graphMcpStatus =\n config.graphMcpMode === 'debug' && config.graphMcpAuthToken?.trim()\n ? 'bearer access mode'\n : `${config.graphMcpMode} mode`\n console.log('Config: ', config.dataDir)\n console.log('Chain Insights Graph:', 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(\n `Chain Insights ${result.latestVersion} is available (current ${result.currentVersion}).`\n )\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 Chain Insights Graph debug mode')\n .addCommand(\n createCliCommand('on')\n .description('Enable Chain Insights Graph debug mode without x402 payments')\n .requiredOption('--token <token>', 'Debug bearer token')\n .option('--endpoint <url>', 'Chain Insights Graph 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('Chain Insights Graph debug mode enabled')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('off')\n .description('Disable Chain Insights Graph 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('Chain Insights Graph debug mode disabled')\n console.log('Payments: enabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('status')\n .description('Show Chain Insights Graph payment/debug mode')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Chain Insights Graph mode: ${config.graphMcpMode}`)\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(\n `Debug token: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`\n )\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 Chain Insights Graph test access key mode')\n .addCommand(\n createCliCommand('set')\n .description('Use a Chain Insights Graph test access key without x402 payments')\n .argument('<key>', 'Test access key')\n .option('--endpoint <url>', 'Chain Insights Graph 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('Chain Insights Graph 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 createCliCommand('clear')\n .description('Remove the Chain Insights Graph 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('Chain Insights Graph test access key cleared')\n console.log('Payments: enabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('status')\n .description('Show Chain Insights Graph 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(\n `Access key: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`\n )\n console.log(\n `Payments: ${config.graphMcpAuthToken?.trim() ? 'disabled when accepted by server' : 'enabled'}`\n )\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('setup')\n .description('Configure external MCP clients')\n .addCommand(\n createCliCommand('claude-code')\n .alias('claude')\n .description('Install Claude Code skills and register the MCP proxy')\n .action(() => {\n runInstaller('--claude')\n })\n )\n .addCommand(\n createCliCommand('codex')\n .description('Install Codex skills and register the MCP proxy')\n .action(() => {\n runInstaller('--codex')\n })\n )\n .addCommand(\n createCliCommand('hermes')\n .description('Install Hermes skills and register the MCP proxy')\n .action(() => {\n runInstaller('--hermes')\n })\n )\n\nprogram\n .command('config')\n .description('Read or write configuration values')\n .addCommand(\n createCliCommand('get')\n .description('Read one Chain Insights configuration value')\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 createCliCommand('set')\n .description('Write one Chain Insights configuration value')\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 =\n 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 createCliCommand('create')\n .description('Generate a new local Base payment wallet')\n .action(async () => {\n try {\n const { isWalletConfigured, setWalletPrivateKey, walletPath } =\n await import('./wallet/index.js')\n const { createInterface } = await import('node:readline/promises')\n const { formatWalletBackupWarning, generateWalletPrivateKey, isWalletBackupConfirmed } =\n await import('./wallet/create.js')\n\n if (await isWalletConfigured()) {\n throw new Error(\n 'A payment wallet already exists. Run `cia wallet address` to view it or use `cia wallet import <private-key> --force` to replace it.'\n )\n }\n\n const privateKey = generateWalletPrivateKey()\n const color = process.stderr.isTTY === true && process.env['NO_COLOR'] === undefined\n process.stderr.write(`${formatWalletBackupWarning(privateKey, { color })}\\n`)\n const prompt = createInterface({ input: process.stdin, output: process.stderr })\n let answer: string\n try {\n answer = await prompt.question('> ')\n } finally {\n prompt.close()\n }\n process.stderr.write('\\n')\n if (!isWalletBackupConfirmed(answer)) {\n throw new Error('Wallet creation cancelled. The wallet was not saved.')\n }\n\n const address = await setWalletPrivateKey(privateKey)\n console.log(`Wallet created: ${address}`)\n console.log(`Encrypted local copy: ${walletPath()}`)\n console.log('Next: cia wallet ready')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('import')\n .description('Import a Base payment wallet')\n .argument('<private-key>', '0x-prefixed EVM private key')\n .option(\n '--force',\n 'Replace an existing wallet (the previous key is backed up next to wallet.json)'\n )\n .action(async (privateKey: string, opts: { force?: boolean }) => {\n try {\n const { setWalletPrivateKey, isWalletConfigured } = await import('./wallet/index.js')\n const replacing = opts.force === true && (await isWalletConfigured())\n const address = await setWalletPrivateKey(privateKey, { force: opts.force })\n if (replacing) {\n console.log('Previous wallet key backed up next to ~/.chain-insights/wallet.json')\n }\n console.log(`Wallet imported: ${address}`)\n console.log(\n 'Keep your original private key backed up securely; it cannot be recovered from the encrypted local copy.'\n )\n console.log('Encrypted local copy: ~/.chain-insights/wallet.json')\n console.log('Next: cia wallet ready')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('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 createCliCommand('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 createCliCommand('ready')\n .description('Check and prepare the wallet for paid Chain Insights Graph 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(\n new Option('--approval-usdc <amount>', 'Deprecated alias for --payment-usdc').hideHelp()\n )\n .option('--json', 'Print machine-readable readiness metadata')\n .action(\n async (opts: {\n checkOnly?: boolean\n approve?: boolean\n paymentUsdc?: string\n approvalUsdc?: string\n json?: boolean\n }) => {\n try {\n const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } =\n await import('./wallet/tools.js')\n const minimumApprovalUnits = parsePaymentApprovalUnits(\n opts.paymentUsdc ?? opts.approvalUsdc ?? '1'\n )\n const result = await prepareWalletForPaidCalls({\n minimumApprovalUnits,\n approve: opts.checkOnly ? false : opts.approve !== false,\n })\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n result,\n (_key, value) => (typeof value === 'bigint' ? value.toString() : value),\n 2\n )\n )\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 )\n .addCommand(\n createCliCommand('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('buy')\n .description('Show CIA subscription pass deposit guidance (the sink cannot refund deposits)')\n .addCommand(\n createCliCommand('day')\n .description('Show day-pass deposit guidance (SUBSCRIPTION_MONTH_USD / 30)')\n .action(async () => {\n try {\n await printSubscriptionPassGuidance('day')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('month')\n .description('Show month-pass deposit guidance at the list price')\n .action(async () => {\n try {\n await printSubscriptionPassGuidance('month')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nconst mcpCommand = program\n .command('mcp')\n .description('Low-level access to the Chain Insights MCP endpoint')\n .allowExcessArguments(false)\n .addCommand(\n createCliCommand('networks')\n .description('List the detailed Chain Insights capability matrix and tool support')\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 createCliCommand('tools')\n .description('List remote GraphRAG MCP tools only (cached for 24 hours)')\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 } =\n 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 } =\n await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name: 'chain-insights-cli', version: PACKAGE_VERSION })\n await client.connect(\n new StreamableHTTPClientTransport(new URL(graphMcpEndpoint), { fetch: paymentFetch })\n )\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\nmcpCommand.addCommand(\n createCliCommand('call')\n .description('Call a low-level MCP tool directly (advanced)')\n .option('--json', 'Print machine-readable JSON output')\n .argument('<tool>', 'Tool name to call')\n .argument('[args...]', 'Key=value arguments (e.g. address=0x1234... network=robinhood)')\n .action(async (tool: string, rawArgs: string[], opts: { json?: boolean }) => {\n try {\n const { parseMcpCallArgs } = await import('./mcp/call-args.js')\n const { assertPublicMcpToolName, validatePublicMcpToolArguments } =\n await import('./mcp/tool-visibility.js')\n const args = parseMcpCallArgs(rawArgs)\n assertPublicMcpToolName(tool)\n if (tool === 'aml_address_risk') {\n throw new Error(\n 'aml_address_risk is a CIA workflow. Run `cia workflow aml-address-risk` instead.'\n )\n }\n validatePublicMcpToolArguments(tool, args)\n\n if (tool === 'wallet_balance') {\n const { getWalletBalanceText } = await import('./wallet/tools.js')\n console.log(await getWalletBalanceText())\n return\n }\n\n if (tool === 'meta_network_capabilities') {\n await printNetworkCapabilities({ json: opts.json })\n return\n }\n\n if (tool === 'meta_help') {\n console.log(\n 'Chain Insights workflow tools: aml_address_risk. Low-level GraphRAG tools: graph_query and graph_query_batch. Metadata and payment tools: meta_* and wallet_balance.'\n )\n return\n }\n\n await withGraphMcpClient('chain-insights-cli-call', async (client, config) => {\n if (tool === 'meta_usage_status') {\n try {\n const result = await client.callTool({ name: 'usage_status', arguments: {} })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n } catch (err) {\n const {\n isMissingUsageStatusToolError,\n primitiveBackendUsageStatus,\n usageStatusText,\n } = await import('./mcp/usage-status.js')\n if (!isMissingUsageStatusToolError(err)) throw err\n const { resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n console.log(\n usageStatusText(primitiveBackendUsageStatus(resolveGraphMcpEndpoint(config)))\n )\n }\n return\n }\n if (tool === 'meta_subscription_status') {\n try {\n const { getWalletAccount } = await import('./wallet/tools.js')\n const account = await getWalletAccount()\n const result = await client.callTool({\n name: 'subscription_status',\n arguments: { wallet: account.address },\n })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n } catch (err) {\n const {\n isMissingSubscriptionStatusToolError,\n unavailableSubscriptionStatus,\n subscriptionStatusText,\n } = await import('./mcp/subscription-status.js')\n if (!isMissingSubscriptionStatusToolError(err)) throw err\n const { resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n console.log(\n subscriptionStatusText(\n unavailableSubscriptionStatus(\n resolveGraphMcpEndpoint(config),\n `subscription_status failed: ${(err as Error).message}`\n )\n )\n )\n }\n return\n }\n // graph_query and graph_query_batch can run past the SDK's 60 s default\n // while the server is still answering. Other tools keep that default.\n const { graphToolRequestOptions } = await import('./mcp/request-timeout.js')\n const requestOptions = graphToolRequestOptions(tool)\n const result = requestOptions\n ? await client.callTool({ name: tool, arguments: args }, undefined, requestOptions)\n : await client.callTool({ name: tool, arguments: args })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n })\n } catch (err) {\n const { formatMcpCallError } = await import('./mcp/tool-visibility.js')\n console.error(formatMcpCallError(tool, err))\n process.exit(1)\n }\n })\n)\n\n// parseAsync (not parse) so a rejected async action surfaces as a clean\n// one-line error and a non-zero exit, instead of an unhandled-rejection stack\n// trace. Commands with their own try/catch still exit(1) before this fires.\nprogram.parseAsync(normalizeAmlToolVersionArgv(process.argv)).catch((err) => {\n console.error((err as Error).message)\n process.exit(1)\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":[],"sources":["../src/investigation/workflows.ts","../src/mcp/print-result.ts","../src/cli.ts"],"sourcesContent":["export interface CiaWorkflow {\n name: string\n tool: string\n network: string\n description: string\n command: string\n}\n\nexport const CIA_WORKFLOWS: readonly CiaWorkflow[] = [\n {\n name: 'aml-address-risk',\n tool: 'aml_address_risk',\n network: 'robinhood',\n description: 'Screen one address for AML risk, behavior, and exchange exposure.',\n command: 'cia workflow aml-address-risk',\n },\n]\n\nconst NAME_WIDTH = 22\nconst NETWORK_WIDTH = 12\nconst COMMAND_WIDTH = 34\n\nfunction formatRow(values: string[]): string {\n return [\n values[0]?.padEnd(NAME_WIDTH),\n values[1]?.padEnd(NETWORK_WIDTH),\n values[2]?.padEnd(COMMAND_WIDTH),\n ].join(' ')\n}\n\nexport function formatCiaWorkflows(workflows: readonly CiaWorkflow[]): string {\n if (workflows.length === 0) return 'No CIA workflow tools available.'\n\n const rows = workflows.flatMap((workflow) => [\n formatRow([workflow.name, workflow.network, workflow.command]),\n ` ${workflow.description}`,\n ])\n\n return [\n 'CIA workflow tools',\n '',\n formatRow(['Workflow', 'Network', 'Run with']),\n formatRow(['-'.repeat(NAME_WIDTH), '-'.repeat(NETWORK_WIDTH), '-'.repeat(COMMAND_WIDTH)]),\n ...rows,\n ].join('\\n')\n}\n","export interface McpTextResult {\n content?: Array<{ type: string; text?: string }>\n isError?: boolean\n}\n\nexport interface McpPrintOptions {\n tool?: string\n json?: boolean\n}\n\ntype JsonRecord = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatTable(rows: Array<JsonRecord>): string[] {\n if (rows.length === 0) return []\n const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))]\n const values = rows.map((row) => columns.map((column) => displayValue(row[column])))\n const widths = columns.map((column, index) =>\n Math.max(column.length, ...values.map((row) => row[index]?.length ?? 0))\n )\n const line = (row: string[]): string =>\n row\n .map((value, index) => (index === row.length - 1 ? value : value.padEnd(widths[index] ?? 0)))\n .join(' | ')\n return [line(columns), widths.map((width) => '-'.repeat(width)).join('-+-'), ...values.map(line)]\n}\n\nfunction formatGraphResult(value: JsonRecord, fallbackTool?: string): string | null {\n const facts = isRecord(value.facts) ? value.facts : undefined\n const query = facts && isRecord(facts.query) ? facts.query : undefined\n const queries = facts && Array.isArray(facts.queries) ? facts.queries : undefined\n if (!query && !queries) return null\n\n const lines = [`Tool: ${displayValue(value.tool) || fallbackTool || 'MCP result'}`]\n const subject = isRecord(value.subject)\n ? value.subject\n : facts && isRecord(facts.subject)\n ? facts.subject\n : undefined\n if (subject?.network !== undefined) lines.push(`Network: ${displayValue(subject.network)}`)\n\n if (query) {\n const results = Array.isArray(query.results) ? query.results.filter(isRecord) : []\n if (query.count !== undefined) lines.push(`Rows: ${displayValue(query.count)}`)\n else lines.push(`Rows: ${results.length}`)\n if (query.billable_units !== undefined) {\n lines.push(`Billed units: ${displayValue(query.billable_units)}`)\n }\n if (query.elapsed_ms !== undefined) lines.push(`Elapsed: ${displayValue(query.elapsed_ms)} ms`)\n if (query.truncated !== undefined) lines.push(`Truncated: ${displayValue(query.truncated)}`)\n if (query.error !== undefined) lines.push(`Error: ${displayValue(query.error)}`)\n if (results.length > 0) lines.push('', 'Results:', ...formatTable(results))\n else lines.push('', 'Results: none')\n }\n\n if (queries) {\n lines.push(`Queries: ${queries.length}`)\n for (const entry of queries) {\n if (!isRecord(entry)) continue\n const id = displayValue(entry.id) || 'query'\n const results = Array.isArray(entry.results) ? entry.results.filter(isRecord) : []\n lines.push('', `[${id}]`)\n if (entry.error !== undefined) lines.push(`Error: ${displayValue(entry.error)}`)\n lines.push(`Rows: ${displayValue(entry.count ?? results.length)}`)\n if (results.length > 0) lines.push(...formatTable(results))\n else lines.push('Results: none')\n }\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Formats one MCP text block for terminal output. JSON is indented when the\n * caller requests `--json`; graph query envelopes are rendered as a compact\n * result summary and table by default.\n */\nexport function formatMcpTextContent(\n text: string,\n tool?: string,\n options: Pick<McpPrintOptions, 'json'> = {}\n): string {\n let parsed: unknown\n try {\n parsed = JSON.parse(text) as unknown\n } catch {\n return text\n }\n\n if (options.json) {\n try {\n return JSON.stringify(parsed, null, 2)\n } catch {\n return text\n }\n }\n\n if (isRecord(parsed)) {\n return formatGraphResult(parsed, tool) ?? JSON.stringify(parsed, null, 2)\n }\n return displayValue(parsed)\n}\n\n/**\n * Prints the text blocks of an MCP tool result to stdout. When the result is\n * flagged `isError`, throws with the tool's error text instead — MCP `callTool`\n * returns tool errors as ordinary results (it does not reject), so callers must\n * surface them as failures (non-zero exit) rather than printing to stdout and\n * exiting 0.\n */\nexport function printMcpTextContent(result: McpTextResult, options: McpPrintOptions = {}): void {\n const texts = (result.content ?? [])\n .filter((item) => item.type === 'text')\n .map((item) => item.text ?? '')\n\n if (result.isError) {\n throw new Error(texts.join('\\n').trim() || 'MCP tool returned an error')\n }\n\n for (const text of texts) console.log(formatMcpTextContent(text, options.tool, options))\n}\n","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'\nimport { CIA_WORKFLOWS, formatCiaWorkflows } from './investigation/workflows.js'\nimport { printMcpTextContent } from './mcp/print-result.js'\nimport type { SubscriptionPass, SubscriptionStatusFacts } from './mcp/subscription-status.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\nfunction createCliCommand(name: string): Command {\n return new Command(name).showHelpAfterError()\n}\n\nprogram\n .name('cia')\n .description('AML investigation toolkit for blockchain analysis')\n .version(PACKAGE_INFO.version)\n .showHelpAfterError()\n .option('--claude', 'Install Claude Code skills globally to ~/.claude/skills/')\n .option('--claude-desktop', 'Register the MCP proxy in Claude Desktop')\n .option('--codex', 'Install Codex skills globally to ~/.codex/skills/ and register MCP')\n .option(\n '--hermes',\n 'Install Hermes skills globally to ~/.hermes/skills/chain-insights/ and register MCP'\n )\n\n// Handle installer flags when invoked with no subcommand (bare `chain-insights --claude`)\nconst rawArgs = process.argv.slice(2)\nconst installerFlags = rawArgs.filter(\n (a) => a === '--claude' || a === '--claude-desktop' || a === '--codex' || a === '--hermes'\n)\n\n// Commander treats the root package `--version` option as global, so it would\n// consume the same flag on the AML workflow command before the child can route\n// a tool contract. Rewrite only the child-command form to a hidden alias. The\n// visible child help still documents `--version`, while root `cia --version`\n// remains the package version.\nfunction normalizeAmlToolVersionArgv(argv: string[]): string[] {\n const commandIndex = rawArgs.findIndex(\n (arg, index) => arg === 'aml-address-risk' && index === 1 && rawArgs[0] === 'workflow'\n )\n if (commandIndex === -1) return argv\n\n return argv.map((arg, index) => {\n const userArgIndex = index - 2\n if (userArgIndex <= commandIndex) return arg\n if (arg === '--version') return '--tool-version'\n if (arg.startsWith('--version=')) return `--tool-version=${arg.slice('--version='.length)}`\n return arg\n })\n}\n// A help/version request must never trigger a global install side effect — let\n// commander handle it and print help/version instead.\nconst wantsHelpOrVersion = rawArgs.some(\n (a) => a === '--help' || a === '-h' || a === '--version' || a === '-V'\n)\nif (installerFlags.length > 0 && !wantsHelpOrVersion && !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\n// Legacy mcp aliases for retired graph tools are not commands; reject them\n// before Commander can mis-parse them. Members are built by concatenation so\n// retired names never appear as literal source strings.\nconst retiredMcpAliases = new Set([['trace', '-funds'].join(''), ['track', '-funds'].join('')])\nif (rawArgs[0] === 'mcp' && retiredMcpAliases.has(rawArgs[1] ?? '')) {\n console.error(`error: unknown command '${rawArgs[1]}'`)\n process.exit(1)\n}\n\nfunction runInstaller(flag: '--claude' | '--claude-desktop' | '--codex' | '--hermes'): void {\n try {\n execFileSync(process.execPath, [installerPath, flag], { stdio: 'inherit' })\n } catch (err) {\n console.error('Installation failed:', (err as Error).message)\n process.exit(1)\n }\n}\n\nasync function withGraphMcpClient<T>(\n name: string,\n fn: (\n client: import('@modelcontextprotocol/sdk/client/index.js').Client,\n config: Awaited<ReturnType<typeof import('./config/index.js').loadConfig>>\n ) => Promise<T>\n): 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 // A dead or wrong endpoint (e.g. a stale `debug` config pointing at a stopped\n // local server) otherwise surfaces as a bare \"fetch failed\"; toGraphMcpEndpointError\n // names the endpoint and the cause, and passes real backend errors through.\n const { toGraphMcpEndpointError } = await import('./mcp/transport-error.js')\n const endpoint = resolveGraphMcpEndpoint(config)\n const paymentFetch = await createConfiguredGraphMcpFetch(config)\n const { Client } = await import('@modelcontextprotocol/sdk/client/index.js')\n const { StreamableHTTPClientTransport } =\n await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name, version: PACKAGE_VERSION })\n try {\n await client.connect(\n new StreamableHTTPClientTransport(new URL(endpoint), {\n fetch: paymentFetch,\n })\n )\n } catch (err) {\n throw toGraphMcpEndpointError(err, endpoint)\n }\n // Every CLI command builds its own client, separate from the MCP proxy's\n // one, so unattended scheduled CLI runs also write to the action log.\n const { installActionLogging } = await import('./mcp/action-log.js')\n installActionLogging(client)\n try {\n return await fn(client, config)\n } catch (err) {\n throw toGraphMcpEndpointError(err, endpoint)\n } finally {\n await client.close()\n }\n}\n\nasync function printNetworkCapabilities(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkCapabilities } =\n 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\nasync function printNetworkOverview(opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, formatNetworkOverview } = 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(formatNetworkOverview(document))\n }\n}\n\nasync function printNetworkCapability(name: string, opts: { json?: boolean }): Promise<void> {\n const { loadConfig } = await import('./config/index.js')\n const { fetchNetworkCapabilities, findNetworkCapability, formatNetworkCapability } =\n await import('./mcp/capabilities.js')\n const document = await fetchNetworkCapabilities(await loadConfig())\n const network = findNetworkCapability(document, name)\n if (!network) {\n const available = document.networks.map((candidate) => candidate.network).join(', ')\n const suffix = available ? ` Available networks: ${available}.` : ''\n throw new Error(\n `Network \"${name}\" is not supported.${suffix} Run \\`cia networks\\` to list supported networks.`\n )\n }\n if (opts.json) {\n console.log(JSON.stringify(network, null, 2))\n } else {\n console.log(formatNetworkCapability(network))\n }\n}\n\ntype SubscriptionStatusLookup =\n { kind: 'available'; facts: SubscriptionStatusFacts } | { kind: 'unavailable'; reason: string }\n\n/**\n * Fetches the caller's subscription facts for the deposit pre-sign guard.\n * The extension math is server-authoritative: the printed values come from\n * `subscription_status`. Any failure (no wallet, unreachable endpoint,\n * missing tool, error result) degrades to an unavailable lookup — the guard\n * must never block the flow on a server that lacks the tool.\n */\nasync function fetchSubscriptionStatusForCli(): Promise<SubscriptionStatusLookup> {\n try {\n const { getWalletAccount } = await import('./wallet/tools.js')\n const account = await getWalletAccount()\n return await withGraphMcpClient(\n 'chain-insights-cli-subscription-status',\n async (client): Promise<SubscriptionStatusLookup> => {\n const result = (await client.callTool({\n name: 'subscription_status',\n arguments: { wallet: account.address },\n })) as {\n content?: Array<{ type: string; text?: string }>\n structuredContent?: Record<string, unknown>\n isError?: boolean\n }\n const { parseSubscriptionStatusToolResult } = await import('./mcp/subscription-status.js')\n const facts = parseSubscriptionStatusToolResult(result)\n if (!facts) {\n return {\n kind: 'unavailable',\n reason: 'the graph endpoint returned no subscription facts',\n }\n }\n return { kind: 'available', facts }\n }\n )\n } catch (err) {\n return { kind: 'unavailable', reason: (err as Error).message }\n }\n}\n\nasync function printSubscriptionPassGuidance(pass: SubscriptionPass): Promise<void> {\n const {\n formatDepositGuardLine,\n formatDepositIrreversibilityWarning,\n formatSubscriptionPassHint,\n isDepositConfirmed,\n resolveSubscriptionMonthUsd,\n } = await import('./mcp/subscription-status.js')\n const hint = formatSubscriptionPassHint(pass, resolveSubscriptionMonthUsd())\n const status = await fetchSubscriptionStatusForCli()\n\n if (status.kind === 'available') {\n process.stderr.write(`${formatDepositGuardLine(status.facts, pass)}\\n`)\n process.stderr.write(\n 'The no-admin subscription sink cannot refund deposits. Type DEPOSIT to continue:\\n'\n )\n const { createInterface } = await import('node:readline/promises')\n const prompt = createInterface({ input: process.stdin, output: process.stderr })\n let answer: string\n try {\n answer = await prompt.question('> ')\n } finally {\n prompt.close()\n }\n process.stderr.write('\\n')\n if (!isDepositConfirmed(answer)) {\n throw new Error('Deposit cancelled. No deposit was made.')\n }\n console.log(hint)\n return\n }\n\n // Server lacks the tool (or is unreachable): generic irreversibility\n // warning, then proceed with the guidance.\n process.stderr.write(`${formatDepositIrreversibilityWarning(status.reason)}\\n`)\n console.log(hint)\n}\n\nfunction addAmlAddressRiskCommand(parent: Command, networksCommand: string): void {\n parent.addCommand(\n createCliCommand('aml-address-risk')\n .description(\n 'CIA workflow: screen an address for AML risk, exchange behavior, and optional comparison with another address'\n )\n .requiredOption('--address <address>', 'Full blockchain address to screen')\n .requiredOption(\n '--network <network>',\n `Network to query. Run \\`${networksCommand}\\` for supported networks.`\n )\n .option(\n '--compare-address <address>',\n 'Optional second address to compare against the screened address'\n )\n .option('--json', 'Print machine-readable JSON output')\n .option(\n '--version <version>',\n 'AML tool contract version. Omit to use the latest version (currently v1)'\n )\n .addOption(\n new Option('--tool-version <version>', 'Internal alias for the AML tool version').hideHelp()\n )\n .action(\n async (opts: {\n address: string\n network: string\n compareAddress?: string\n json?: boolean\n version?: string\n toolVersion?: string\n }) => {\n try {\n const { resolveAmlAddressRiskVersion } = await import('./investigation/public-tools.js')\n const requestedVersion = opts.toolVersion ?? opts.version\n resolveAmlAddressRiskVersion(requestedVersion)\n await withGraphMcpClient('chain-insights-cli-aml-address-risk', async (client) => {\n const { runAmlAddressRisk } = await import('./investigation/public-tools.js')\n const result = await runAmlAddressRisk(\n client,\n {\n address: opts.address,\n network: opts.network,\n compareAddress: opts.compareAddress,\n },\n requestedVersion\n )\n console.log(\n opts.json ? JSON.stringify(result.structuredContent, null, 2) : result.summaryText\n )\n })\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n }\n )\n )\n}\n\nprogram\n .command('networks')\n .description('Show supported network status and dataset overview')\n .option('--json', 'Print raw capability JSON')\n .action(async (opts: { json?: boolean }) => {\n try {\n await printNetworkOverview(opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('network')\n .description('Show details for one supported graph network')\n .argument('<name>', 'Network identifier or display name (for example: robinhood)')\n .option('--json', 'Print raw capability JSON for this network')\n .action(async (name: string, opts: { json?: boolean }) => {\n try {\n await printNetworkCapability(name, opts)\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n\nprogram\n .command('workflows')\n .description('List CIA workflow tools')\n .option('--json', 'Print the workflow catalog as JSON')\n .action((opts: { json?: boolean }) => {\n if (opts.json) {\n console.log(JSON.stringify(CIA_WORKFLOWS, null, 2))\n return\n }\n console.log(formatCiaWorkflows(CIA_WORKFLOWS))\n })\n\nconst workflowCommand = program.command('workflow').description('Run a high-level CIA workflow')\n\naddAmlAddressRiskCommand(workflowCommand, 'cia networks')\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 config = await loadConfig()\n const graphMcpStatus =\n config.graphMcpMode === 'debug' && config.graphMcpAuthToken?.trim()\n ? 'bearer access mode'\n : `${config.graphMcpMode} mode`\n console.log('Config: ', config.dataDir)\n console.log('Chain Insights Graph:', 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(\n `Chain Insights ${result.latestVersion} is available (current ${result.currentVersion}).`\n )\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 Chain Insights Graph debug mode')\n .addCommand(\n createCliCommand('on')\n .description('Enable Chain Insights Graph debug mode without x402 payments')\n .requiredOption('--token <token>', 'Debug bearer token')\n .option('--endpoint <url>', 'Chain Insights Graph 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('Chain Insights Graph debug mode enabled')\n if (opts.endpoint) console.log(`Graph endpoint: ${opts.endpoint}`)\n console.log('Payments: disabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('off')\n .description('Disable Chain Insights Graph 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('Chain Insights Graph debug mode disabled')\n console.log('Payments: enabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('status')\n .description('Show Chain Insights Graph payment/debug mode')\n .action(async () => {\n try {\n const { loadConfig } = await import('./config/index.js')\n const config = await loadConfig()\n console.log(`Chain Insights Graph mode: ${config.graphMcpMode}`)\n console.log(`Graph endpoint: ${config.graphMcpEndpoint}`)\n console.log(\n `Debug token: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`\n )\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 Chain Insights Graph test access key mode')\n .addCommand(\n createCliCommand('set')\n .description('Use a Chain Insights Graph test access key without x402 payments')\n .argument('<key>', 'Test access key')\n .option('--endpoint <url>', 'Chain Insights Graph 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('Chain Insights Graph 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 createCliCommand('clear')\n .description('Remove the Chain Insights Graph 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('Chain Insights Graph test access key cleared')\n console.log('Payments: enabled for Chain Insights Graph calls')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('status')\n .description('Show Chain Insights Graph 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(\n `Access key: ${config.graphMcpAuthToken?.trim() ? 'configured' : 'not configured'}`\n )\n console.log(\n `Payments: ${config.graphMcpAuthToken?.trim() ? 'disabled when accepted by server' : 'enabled'}`\n )\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nprogram\n .command('setup')\n .description('Configure external MCP clients')\n .addCommand(\n createCliCommand('claude-code')\n .alias('claude')\n .description('Install Claude Code skills and register the MCP proxy')\n .action(() => {\n runInstaller('--claude')\n })\n )\n .addCommand(\n createCliCommand('claude-desktop')\n .description('Register the MCP proxy in Claude Desktop, which draws the money-flow views')\n .action(() => {\n runInstaller('--claude-desktop')\n })\n )\n .addCommand(\n createCliCommand('codex')\n .description('Install Codex skills and register the MCP proxy')\n .action(() => {\n runInstaller('--codex')\n })\n )\n .addCommand(\n createCliCommand('hermes')\n .description('Install Hermes skills and register the MCP proxy')\n .action(() => {\n runInstaller('--hermes')\n })\n )\n\nprogram\n .command('config')\n .description('Read or write configuration values')\n .addCommand(\n createCliCommand('get')\n .description('Read one Chain Insights configuration value')\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 createCliCommand('set')\n .description('Write one Chain Insights configuration value')\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 =\n 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 createCliCommand('create')\n .description('Generate a new local Base payment wallet')\n .action(async () => {\n try {\n const { isWalletConfigured, setWalletPrivateKey, walletPath } =\n await import('./wallet/index.js')\n const { createInterface } = await import('node:readline/promises')\n const { formatWalletBackupWarning, generateWalletPrivateKey, isWalletBackupConfirmed } =\n await import('./wallet/create.js')\n\n if (await isWalletConfigured()) {\n throw new Error(\n 'A payment wallet already exists. Run `cia wallet address` to view it or use `cia wallet import <private-key> --force` to replace it.'\n )\n }\n\n const privateKey = generateWalletPrivateKey()\n const color = process.stderr.isTTY === true && process.env['NO_COLOR'] === undefined\n process.stderr.write(`${formatWalletBackupWarning(privateKey, { color })}\\n`)\n const prompt = createInterface({ input: process.stdin, output: process.stderr })\n let answer: string\n try {\n answer = await prompt.question('> ')\n } finally {\n prompt.close()\n }\n process.stderr.write('\\n')\n if (!isWalletBackupConfirmed(answer)) {\n throw new Error('Wallet creation cancelled. The wallet was not saved.')\n }\n\n const address = await setWalletPrivateKey(privateKey)\n console.log(`Wallet created: ${address}`)\n console.log(`Encrypted local copy: ${walletPath()}`)\n console.log('Next: cia wallet ready')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('import')\n .description('Import a Base payment wallet')\n .argument('<private-key>', '0x-prefixed EVM private key')\n .option(\n '--force',\n 'Replace an existing wallet (the previous key is backed up next to wallet.json)'\n )\n .action(async (privateKey: string, opts: { force?: boolean }) => {\n try {\n const { setWalletPrivateKey, isWalletConfigured } = await import('./wallet/index.js')\n const replacing = opts.force === true && (await isWalletConfigured())\n const address = await setWalletPrivateKey(privateKey, { force: opts.force })\n if (replacing) {\n console.log('Previous wallet key backed up next to ~/.chain-insights/wallet.json')\n }\n console.log(`Wallet imported: ${address}`)\n console.log(\n 'Keep your original private key backed up securely; it cannot be recovered from the encrypted local copy.'\n )\n console.log('Encrypted local copy: ~/.chain-insights/wallet.json')\n console.log('Next: cia wallet ready')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('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 createCliCommand('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 createCliCommand('ready')\n .description('Check and prepare the wallet for paid Chain Insights Graph 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(\n new Option('--approval-usdc <amount>', 'Deprecated alias for --payment-usdc').hideHelp()\n )\n .option('--json', 'Print machine-readable readiness metadata')\n .action(\n async (opts: {\n checkOnly?: boolean\n approve?: boolean\n paymentUsdc?: string\n approvalUsdc?: string\n json?: boolean\n }) => {\n try {\n const { formatWalletReadiness, parsePaymentApprovalUnits, prepareWalletForPaidCalls } =\n await import('./wallet/tools.js')\n const minimumApprovalUnits = parsePaymentApprovalUnits(\n opts.paymentUsdc ?? opts.approvalUsdc ?? '1'\n )\n const result = await prepareWalletForPaidCalls({\n minimumApprovalUnits,\n approve: opts.checkOnly ? false : opts.approve !== false,\n })\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n result,\n (_key, value) => (typeof value === 'bigint' ? value.toString() : value),\n 2\n )\n )\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 )\n .addCommand(\n createCliCommand('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('buy')\n .description('Show CIA subscription pass deposit guidance (the sink cannot refund deposits)')\n .addCommand(\n createCliCommand('day')\n .description('Show day-pass deposit guidance (SUBSCRIPTION_MONTH_USD / 30)')\n .action(async () => {\n try {\n await printSubscriptionPassGuidance('day')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n .addCommand(\n createCliCommand('month')\n .description('Show month-pass deposit guidance at the list price')\n .action(async () => {\n try {\n await printSubscriptionPassGuidance('month')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n })\n )\n\nconst mcpCommand = program\n .command('mcp')\n .description('Low-level access to the Chain Insights MCP endpoint')\n .allowExcessArguments(false)\n .addCommand(\n createCliCommand('networks')\n .description('List the detailed Chain Insights capability matrix and tool support')\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 createCliCommand('tools')\n .description('List remote GraphRAG MCP tools only (cached for 24 hours)')\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 } =\n 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 } =\n await import('@modelcontextprotocol/sdk/client/streamableHttp.js')\n const client = new Client({ name: 'chain-insights-cli', version: PACKAGE_VERSION })\n await client.connect(\n new StreamableHTTPClientTransport(new URL(graphMcpEndpoint), { fetch: paymentFetch })\n )\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\nmcpCommand.addCommand(\n createCliCommand('call')\n .description('Call a low-level MCP tool directly (advanced)')\n .option('--json', 'Print machine-readable JSON output')\n .argument('<tool>', 'Tool name to call')\n .argument('[args...]', 'Key=value arguments (e.g. address=0x1234... network=robinhood)')\n .action(async (tool: string, rawArgs: string[], opts: { json?: boolean }) => {\n try {\n const { parseMcpCallArgs } = await import('./mcp/call-args.js')\n const { assertPublicMcpToolName, validatePublicMcpToolArguments } =\n await import('./mcp/tool-visibility.js')\n const args = parseMcpCallArgs(rawArgs)\n assertPublicMcpToolName(tool)\n if (tool === 'aml_address_risk') {\n throw new Error(\n 'aml_address_risk is a CIA workflow. Run `cia workflow aml-address-risk` instead.'\n )\n }\n validatePublicMcpToolArguments(tool, args)\n\n if (tool === 'wallet_balance') {\n const { getWalletBalanceText } = await import('./wallet/tools.js')\n console.log(await getWalletBalanceText())\n return\n }\n\n if (tool === 'meta_network_capabilities') {\n await printNetworkCapabilities({ json: opts.json })\n return\n }\n\n if (tool === 'meta_help') {\n console.log(\n 'Chain Insights workflow tools: aml_address_risk. Low-level GraphRAG tools: graph_query and graph_query_batch. Metadata and payment tools: meta_* and wallet_balance.'\n )\n return\n }\n\n await withGraphMcpClient('chain-insights-cli-call', async (client, config) => {\n if (tool === 'meta_usage_status') {\n try {\n const result = await client.callTool({ name: 'usage_status', arguments: {} })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n } catch (err) {\n const {\n isMissingUsageStatusToolError,\n primitiveBackendUsageStatus,\n usageStatusText,\n } = await import('./mcp/usage-status.js')\n if (!isMissingUsageStatusToolError(err)) throw err\n const { resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n console.log(\n usageStatusText(primitiveBackendUsageStatus(resolveGraphMcpEndpoint(config)))\n )\n }\n return\n }\n if (tool === 'meta_subscription_status') {\n try {\n const { getWalletAccount } = await import('./wallet/tools.js')\n const account = await getWalletAccount()\n const result = await client.callTool({\n name: 'subscription_status',\n arguments: { wallet: account.address },\n })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n } catch (err) {\n const {\n isMissingSubscriptionStatusToolError,\n unavailableSubscriptionStatus,\n subscriptionStatusText,\n } = await import('./mcp/subscription-status.js')\n if (!isMissingSubscriptionStatusToolError(err)) throw err\n const { resolveGraphMcpEndpoint } = await import('./mcp/client.js')\n console.log(\n subscriptionStatusText(\n unavailableSubscriptionStatus(\n resolveGraphMcpEndpoint(config),\n `subscription_status failed: ${(err as Error).message}`\n )\n )\n )\n }\n return\n }\n // graph_query and graph_query_batch can run past the SDK's 60 s default\n // while the server is still answering. Other tools keep that default.\n const { graphToolRequestOptions } = await import('./mcp/request-timeout.js')\n const requestOptions = graphToolRequestOptions(tool)\n const result = requestOptions\n ? await client.callTool({ name: tool, arguments: args }, undefined, requestOptions)\n : await client.callTool({ name: tool, arguments: args })\n printMcpTextContent(\n result as { content?: Array<{ type: string; text?: string }>; isError?: boolean },\n { tool, json: opts.json }\n )\n })\n } catch (err) {\n const { formatMcpCallError } = await import('./mcp/tool-visibility.js')\n console.error(formatMcpCallError(tool, err))\n process.exit(1)\n }\n })\n)\n\n// parseAsync (not parse) so a rejected async action surfaces as a clean\n// one-line error and a non-zero exit, instead of an unhandled-rejection stack\n// trace. Commands with their own try/catch still exit(1) before this fires.\nprogram.parseAsync(normalizeAmlToolVersionArgv(process.argv)).catch((err) => {\n console.error((err as Error).message)\n process.exit(1)\n})\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-
|
|
2
|
-
import { d as prepareWalletForPaidCalls, f as resolveMaxAutoApprovalUnits, n as USDC_ADDRESS, t as PERMIT2_ADDRESS } from "./tools-
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
|
|
2
|
+
import { d as prepareWalletForPaidCalls, f as resolveMaxAutoApprovalUnits, n as USDC_ADDRESS, t as PERMIT2_ADDRESS } from "./tools-BnThuvE2.mjs";
|
|
3
3
|
import { privateKeyToAccount } from "viem/accounts";
|
|
4
4
|
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
|
|
5
5
|
import { ExactEvmScheme } from "@x402/evm";
|
|
@@ -297,7 +297,7 @@ function resolveGraphMcpEndpoint(config) {
|
|
|
297
297
|
return config.graphMcpEndpoint.trim();
|
|
298
298
|
}
|
|
299
299
|
async function createConfiguredGraphPaidOrFreeFetch() {
|
|
300
|
-
const { isWalletConfigured, decryptKey } = await import("./wallet-
|
|
300
|
+
const { isWalletConfigured, decryptKey } = await import("./wallet-GNDl3FkR.mjs").then((n) => n.s);
|
|
301
301
|
if (!await isWalletConfigured()) return createPaymentFailureReportingFetch(fetch);
|
|
302
302
|
return createMcpFetchClient(await decryptKey());
|
|
303
303
|
}
|
|
@@ -312,4 +312,4 @@ async function createConfiguredGraphMcpFetch(config) {
|
|
|
312
312
|
//#endregion
|
|
313
313
|
export { resolveGraphMcpEndpoint as a, createMcpFetchClient as i, applyMcpAuthHeaders as n, client_exports as r, PaymentRequiredError as t };
|
|
314
314
|
|
|
315
|
-
//# sourceMappingURL=client-
|
|
315
|
+
//# sourceMappingURL=client-gsLi528K.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-CHYskPnG.mjs","names":[],"sources":["../src/mcp/payment-asset-preference.ts","../src/mcp/wallet-proof.ts","../src/mcp/client.ts"],"sourcesContent":["/**\n * Payment-asset preference ordering for 402 `accepts` offers.\n *\n * Chain Insights Graph can quote a paid MCP call in more than one ERC-20\n * asset across networks (USDC on Base, USDG/CHOICE on Robinhood Chain). The\n * x402 client's default selector always pays with the first `accepts` entry\n * it can pay with, so re-ordering `accepts` by operator preference before\n * the payment scheme picks lets an operator route payments to a preferred\n * asset without any server-side change.\n */\n\nexport interface PaymentOptionLike {\n network: string // CAIP-2, e.g. \"eip155:8453\"\n asset: string // ERC-20 token contract address\n amount: string // base units\n extra?: Record<string, unknown>\n}\n\n/**\n * Known payment asset symbols by lowercase contract address. Extend this map\n * as new payment assets go live; an address not listed here can still be\n * targeted directly by address in CHAIN_INSIGHTS_PAYMENT_ASSET_PREFERENCE.\n */\nexport const KNOWN_PAYMENT_ASSET_SYMBOLS: Record<string, string> = {\n '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913': 'USDC', // Base\n '0x5fc5360d0400a0fd4f2af552add042d716f1d168': 'USDG', // Robinhood Chain\n '0x6e30a5f8fc61cd4e8550d2dd3cddea2a0196dc69': 'CHOICE', // Robinhood Chain (test token)\n}\n\n/**\n * Orders 402 `accepts` by the operator preference list (env\n * CHAIN_INSIGHTS_PAYMENT_ASSET_PREFERENCE, comma-separated symbols or\n * addresses, e.g. \"CHOICE,USDG,USDC\"). Unlisted assets keep server order\n * after listed ones. Empty preference -> server order (today's behavior).\n *\n * Pure: does not mutate `accepts`. Matching is case-insensitive for both\n * symbols and addresses, and the sort is stable so ties (unlisted assets,\n * or repeated preference entries) preserve server order.\n */\nexport function orderPaymentOptions(\n accepts: PaymentOptionLike[],\n preference: string,\n assetSymbols: Record<string, string>\n): PaymentOptionLike[] {\n const preferenceList = preference\n .split(',')\n .map((entry) => entry.trim().toLowerCase())\n .filter(Boolean)\n\n if (preferenceList.length === 0) return accepts\n\n const rankOf = (option: PaymentOptionLike): number => {\n const addressLower = option.asset.toLowerCase()\n const symbolLower = assetSymbols[addressLower]?.toLowerCase()\n const rank = preferenceList.findIndex(\n (entry) => entry === symbolLower || entry === addressLower\n )\n return rank === -1 ? preferenceList.length : rank\n }\n\n return [...accepts].sort((a, b) => rankOf(a) - rankOf(b))\n}\n","import type { Account } from 'viem'\n\ntype FetchLike = typeof fetch\ntype FetchInput = Parameters<FetchLike>[0]\ntype FetchInit = Parameters<FetchLike>[1]\n\nexport const CIA_WALLET_PROOF_HEADER = 'X-CIA-Wallet-Proof'\n\nexport function proofMessage(host: string, unix: number): string {\n return `cia-mcp-permit\\n${host}\\n${unix}`\n}\n\nexport function proofHostFromUrl(input: FetchInput): string {\n if (typeof input === 'string') {\n return new URL(input).host\n }\n if (input instanceof URL) {\n return input.host\n }\n return new URL(input.url).host\n}\n\nexport async function buildWalletProof(opts: {\n account: Pick<Account, 'address' | 'signMessage'>\n host: string\n now?: Date\n}): Promise<string> {\n if (!opts.account.signMessage) {\n throw new Error('wallet cannot sign a burnhole proof')\n }\n const unix = Math.floor((opts.now ?? new Date()).getTime() / 1000)\n const signature = await opts.account.signMessage({\n message: proofMessage(opts.host, unix),\n })\n const sigHex = signature.startsWith('0x') ? signature.slice(2) : signature\n return `v1;${opts.account.address.toLowerCase()};${unix};${sigHex}`\n}\n\nexport function createWalletProofFetch(\n account: Pick<Account, 'address' | 'signMessage'>,\n baseFetch: FetchLike,\n now: () => Date = () => new Date()\n): FetchLike {\n return (async (input: FetchInput, init?: FetchInit) => {\n if (!account.signMessage) {\n return baseFetch(input, init)\n }\n const headers = new Headers(\n init?.headers ?? (input instanceof Request ? input.headers : undefined)\n )\n headers.set(\n CIA_WALLET_PROOF_HEADER,\n await buildWalletProof({ account, host: proofHostFromUrl(input), now: now() })\n )\n return baseFetch(input, { ...init, headers })\n }) as FetchLike\n}\n","import { wrapFetchWithPaymentFromConfig } from '@x402/fetch'\nimport { ExactEvmScheme } from '@x402/evm'\nimport { UptoEvmScheme, type UptoEvmSchemeConfigByChainId } from '@x402/evm/upto/client'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport type { InvestigatorConfig } from '../config/schema.js'\nimport {\n prepareWalletForPaidCalls,\n resolveMaxAutoApprovalUnits,\n PERMIT2_ADDRESS,\n USDC_ADDRESS,\n} from '../wallet/tools.js'\nimport {\n orderPaymentOptions,\n KNOWN_PAYMENT_ASSET_SYMBOLS,\n type PaymentOptionLike,\n} from './payment-asset-preference.js'\nimport { createWalletProofFetch } from './wallet-proof.js'\n\ntype FetchLike = typeof fetch\ntype FetchInput = Parameters<FetchLike>[0]\ntype FetchInit = Parameters<FetchLike>[1]\n\n// Robinhood Chain — second EVM network accepted for x402 Permit2 payments\n// alongside Base Mainnet. The x402 SDK builds its own bare RPC client per\n// chain ID from this config (no viem chain-registry entry is needed: it\n// never imports `viem/chains`, it just does `createPublicClient({transport:\n// http(rpcUrl)})` keyed by CAIP-2 chain ID).\nexport const ROBINHOOD_CHAIN_ID = 4663\nexport const ROBINHOOD_NETWORK = 'eip155:4663'\nexport const ROBINHOOD_RPC_URL = 'https://rpc.mainnet.chain.robinhood.com'\n\nconst EVM_SCHEME_OPTIONS: UptoEvmSchemeConfigByChainId = {\n [ROBINHOOD_CHAIN_ID]: { rpcUrl: ROBINHOOD_RPC_URL },\n}\n\n/**\n * Reads the operator's payment-asset preference order (env\n * CHAIN_INSIGHTS_PAYMENT_ASSET_PREFERENCE, comma-separated symbols or\n * addresses). Empty/unset keeps server order.\n */\nexport function resolvePaymentAssetPreference(env: NodeJS.ProcessEnv = process.env): string {\n return env['CHAIN_INSIGHTS_PAYMENT_ASSET_PREFERENCE']?.trim() ?? ''\n}\n\n/**\n * Wraps `fetch` so that a 402 response's `accepts` offers are re-ordered by\n * the operator's payment-asset preference before the x402 client's default\n * selector (which always picks `accepts[0]`) runs. Must wrap the raw\n * transport `fetch` passed into `wrapFetchWithPaymentFromConfig`, not the\n * result of it, since the x402 client parses `accepts` from the first 402\n * response it sees.\n */\nfunction createAssetPreferenceReorderingFetch(baseFetch: FetchLike, preference: string): FetchLike {\n if (!preference) return baseFetch\n return (async (input: FetchInput, init?: FetchInit) => {\n const response = await baseFetch(input, init)\n if (response.status !== 402) return response\n const encoded = response.headers.get('payment-required')\n if (!encoded) return response\n\n let parsed: { accepts?: PaymentOptionLike[] } & Record<string, unknown>\n try {\n parsed = JSON.parse(Buffer.from(encoded, 'base64').toString('utf8'))\n } catch {\n return response\n }\n if (!Array.isArray(parsed.accepts) || parsed.accepts.length === 0) return response\n\n const reordered = orderPaymentOptions(parsed.accepts, preference, KNOWN_PAYMENT_ASSET_SYMBOLS)\n const reencoded = Buffer.from(JSON.stringify({ ...parsed, accepts: reordered })).toString(\n 'base64'\n )\n const headers = new Headers(response.headers)\n headers.set('payment-required', reencoded)\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n })\n }) as FetchLike\n}\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 `cia wallet ready` to check funding and finish one-time payment setup, ' +\n 'run `cia wallet topup` if it says the wallet needs USDC, ' +\n 'or `cia 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 asset?: 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<{\n scheme?: unknown\n network?: unknown\n amount?: unknown\n payTo?: unknown\n asset?: unknown\n }>\n }\n const reason =\n typeof parsed.error === 'string' && parsed.error.trim()\n ? parsed.error.trim()\n : 'payment_required'\n const firstRequirement = Array.isArray(parsed.accepts) ? parsed.accepts[0] : undefined\n const amount =\n 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:\n typeof firstRequirement?.payTo === 'string' ? firstRequirement.payTo.trim() : undefined,\n asset:\n typeof firstRequirement?.asset === 'string' ? firstRequirement.asset.trim() : undefined,\n }\n } catch {\n return null\n }\n}\n\n/**\n * True only for the one combination this client can auto-approve today:\n * USDC on Base, via the existing Base-only `wallet/tools.ts` allowance flow.\n * A requirement with no `asset` at all predates multi-asset 402 offers and\n * is treated as that same legacy USDC-on-Base case.\n */\nfunction isAutoApprovableBaseUsdc(requirement: PaymentRequirementDetails): boolean {\n if (requirement.network !== 'eip155:8453') return false\n if (!requirement.asset) return true\n return requirement.asset.toLowerCase() === USDC_ADDRESS.toLowerCase()\n}\n\n/**\n * Clear, actionable error for the case the auto-approval flow does not cover:\n * a Permit2 allowance is missing for a non-Base-USDC asset (e.g. USDG/CHOICE\n * on Robinhood Chain) and the server did not offer a gas-sponsored approval\n * extension. Names the token, the canonical Permit2 address, and the exact\n * approval call so the operator can run it manually.\n */\nfunction describePermit2ApprovalNeededError(requirement: PaymentRequirementDetails): string {\n const token = requirement.asset ?? 'the payment token'\n const networkSuffix = requirement.network ? ` on ${requirement.network}` : ''\n return (\n `Payment requires a one-time Permit2 approval for token ${token}${networkSuffix} before paid calls can settle, ` +\n 'and gas-sponsored approval is not available for this asset. ' +\n `Approve the canonical Permit2 contract ${PERMIT2_ADDRESS} to spend ${token} by calling ` +\n `approve(${PERMIT2_ADDRESS}, <amount>) on the token contract, then retry the call.`\n )\n}\n\nfunction describePaymentRequiredResponse(response: Response, payerAddress?: string): string {\n const requirement = paymentRequirementFromResponse(response)\n if (!requirement)\n 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 ]\n .filter(Boolean)\n .join(' ')\n const message = details\n ? `x402 payment failed: ${reason} (${details})`\n : `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 \\`cia 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 if (!isAutoApprovableBaseUsdc(requirement)) {\n throw new PaymentRequiredError(describePermit2ApprovalNeededError(requirement))\n }\n try {\n await prepareWalletForPaidCalls({\n account: paymentWallet,\n // The endpoint dictates requirement.amountUnits; cap it so a hostile\n // endpoint cannot drive an unbounded Permit2 approval / wallet drain.\n maxApprovalUnits: resolveMaxAutoApprovalUnits(),\n ...(requirement.amountUnits === undefined\n ? {}\n : { minimumApprovalUnits: requirement.amountUnits }),\n })\n } catch (err) {\n throw new PaymentRequiredError(\n 'Payment setup is not ready yet. Run `cia 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) or, when the\n * server offers it and the operator prefers it, a Permit2 asset on\n * Robinhood Chain (eip155:4663) — see ROBINHOOD_NETWORK.\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 // Shared across both networks: EVM_SCHEME_OPTIONS is keyed by chain ID, so\n // it only supplies an RPC URL for Robinhood Chain (4663) and leaves Base\n // (8453) exactly as before (no RPC configured — gas-sponsored approval\n // stays unavailable there too, unchanged from prior behavior).\n const uptoScheme = new UptoEvmScheme(account, EVM_SCHEME_OPTIONS)\n const paymentFetch = wrapFetchWithPaymentFromConfig(\n createAssetPreferenceReorderingFetch(\n createWalletProofFetch(account, fetch),\n resolvePaymentAssetPreference()\n ),\n {\n schemes: [\n {\n network: 'eip155:8453', // Base Mainnet — dynamic MCP pricing uses the x402 upto scheme\n client: uptoScheme,\n },\n {\n network: 'eip155:8453', // Base Mainnet — only supported chain in v1\n client: new ExactEvmScheme(account),\n },\n {\n network: ROBINHOOD_NETWORK, // Robinhood Chain — Permit2-only (upto scheme), same client instance\n client: uptoScheme,\n },\n ],\n }\n )\n const reportingFetch = createPaymentFailureReportingFetch(paymentFetch, account.address, {\n address: account.address,\n privateKey,\n })\n return authToken ? createHeaderFetch(authToken, reportingFetch) : reportingFetch\n}\n\n/**\n * Creates a bearer/debug-token fetch for local Chain Insights Graph testing.\n *\n * Chain Insights Graph deployments accept test access through the public debug header,\n * 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(\n authToken: string,\n baseFetch: FetchLike = fetch\n): FetchLike {\n const headerFetch = createHeaderFetch(authToken, baseFetch)\n return createPaymentFailureReportingFetch(headerFetch)\n}\n\nexport function resolveGraphMcpEndpoint(\n config: Pick<InvestigatorConfig, 'graphMcpEndpoint'>\n): string {\n return config.graphMcpEndpoint.trim()\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 createConfiguredGraphMcpFetch(\n config: Pick<InvestigatorConfig, 'graphMcpAuthToken' | 'graphMcpMode'>\n): Promise<FetchLike> {\n if (config.graphMcpMode === 'debug') {\n const authToken = config.graphMcpAuthToken?.trim()\n if (!authToken) {\n throw new Error(\n 'Chain Insights Graph debug mode requires graphMcpAuthToken. Run `cia access-key set <key>` or `cia debug on --token <token>`.'\n )\n }\n return createMcpAuthFetchClient(authToken)\n }\n\n return createConfiguredGraphPaidOrFreeFetch()\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client-gsLi528K.mjs","names":[],"sources":["../src/mcp/payment-asset-preference.ts","../src/mcp/wallet-proof.ts","../src/mcp/client.ts"],"sourcesContent":["/**\n * Payment-asset preference ordering for 402 `accepts` offers.\n *\n * Chain Insights Graph can quote a paid MCP call in more than one ERC-20\n * asset across networks (USDC on Base, USDG/CHOICE on Robinhood Chain). The\n * x402 client's default selector always pays with the first `accepts` entry\n * it can pay with, so re-ordering `accepts` by operator preference before\n * the payment scheme picks lets an operator route payments to a preferred\n * asset without any server-side change.\n */\n\nexport interface PaymentOptionLike {\n network: string // CAIP-2, e.g. \"eip155:8453\"\n asset: string // ERC-20 token contract address\n amount: string // base units\n extra?: Record<string, unknown>\n}\n\n/**\n * Known payment asset symbols by lowercase contract address. Extend this map\n * as new payment assets go live; an address not listed here can still be\n * targeted directly by address in CHAIN_INSIGHTS_PAYMENT_ASSET_PREFERENCE.\n */\nexport const KNOWN_PAYMENT_ASSET_SYMBOLS: Record<string, string> = {\n '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913': 'USDC', // Base\n '0x5fc5360d0400a0fd4f2af552add042d716f1d168': 'USDG', // Robinhood Chain\n '0x6e30a5f8fc61cd4e8550d2dd3cddea2a0196dc69': 'CHOICE', // Robinhood Chain (test token)\n}\n\n/**\n * Orders 402 `accepts` by the operator preference list (env\n * CHAIN_INSIGHTS_PAYMENT_ASSET_PREFERENCE, comma-separated symbols or\n * addresses, e.g. \"CHOICE,USDG,USDC\"). Unlisted assets keep server order\n * after listed ones. Empty preference -> server order (today's behavior).\n *\n * Pure: does not mutate `accepts`. Matching is case-insensitive for both\n * symbols and addresses, and the sort is stable so ties (unlisted assets,\n * or repeated preference entries) preserve server order.\n */\nexport function orderPaymentOptions(\n accepts: PaymentOptionLike[],\n preference: string,\n assetSymbols: Record<string, string>\n): PaymentOptionLike[] {\n const preferenceList = preference\n .split(',')\n .map((entry) => entry.trim().toLowerCase())\n .filter(Boolean)\n\n if (preferenceList.length === 0) return accepts\n\n const rankOf = (option: PaymentOptionLike): number => {\n const addressLower = option.asset.toLowerCase()\n const symbolLower = assetSymbols[addressLower]?.toLowerCase()\n const rank = preferenceList.findIndex(\n (entry) => entry === symbolLower || entry === addressLower\n )\n return rank === -1 ? preferenceList.length : rank\n }\n\n return [...accepts].sort((a, b) => rankOf(a) - rankOf(b))\n}\n","import type { Account } from 'viem'\n\ntype FetchLike = typeof fetch\ntype FetchInput = Parameters<FetchLike>[0]\ntype FetchInit = Parameters<FetchLike>[1]\n\nexport const CIA_WALLET_PROOF_HEADER = 'X-CIA-Wallet-Proof'\n\nexport function proofMessage(host: string, unix: number): string {\n return `cia-mcp-permit\\n${host}\\n${unix}`\n}\n\nexport function proofHostFromUrl(input: FetchInput): string {\n if (typeof input === 'string') {\n return new URL(input).host\n }\n if (input instanceof URL) {\n return input.host\n }\n return new URL(input.url).host\n}\n\nexport async function buildWalletProof(opts: {\n account: Pick<Account, 'address' | 'signMessage'>\n host: string\n now?: Date\n}): Promise<string> {\n if (!opts.account.signMessage) {\n throw new Error('wallet cannot sign a burnhole proof')\n }\n const unix = Math.floor((opts.now ?? new Date()).getTime() / 1000)\n const signature = await opts.account.signMessage({\n message: proofMessage(opts.host, unix),\n })\n const sigHex = signature.startsWith('0x') ? signature.slice(2) : signature\n return `v1;${opts.account.address.toLowerCase()};${unix};${sigHex}`\n}\n\nexport function createWalletProofFetch(\n account: Pick<Account, 'address' | 'signMessage'>,\n baseFetch: FetchLike,\n now: () => Date = () => new Date()\n): FetchLike {\n return (async (input: FetchInput, init?: FetchInit) => {\n if (!account.signMessage) {\n return baseFetch(input, init)\n }\n const headers = new Headers(\n init?.headers ?? (input instanceof Request ? input.headers : undefined)\n )\n headers.set(\n CIA_WALLET_PROOF_HEADER,\n await buildWalletProof({ account, host: proofHostFromUrl(input), now: now() })\n )\n return baseFetch(input, { ...init, headers })\n }) as FetchLike\n}\n","import { wrapFetchWithPaymentFromConfig } from '@x402/fetch'\nimport { ExactEvmScheme } from '@x402/evm'\nimport { UptoEvmScheme, type UptoEvmSchemeConfigByChainId } from '@x402/evm/upto/client'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport type { InvestigatorConfig } from '../config/schema.js'\nimport {\n prepareWalletForPaidCalls,\n resolveMaxAutoApprovalUnits,\n PERMIT2_ADDRESS,\n USDC_ADDRESS,\n} from '../wallet/tools.js'\nimport {\n orderPaymentOptions,\n KNOWN_PAYMENT_ASSET_SYMBOLS,\n type PaymentOptionLike,\n} from './payment-asset-preference.js'\nimport { createWalletProofFetch } from './wallet-proof.js'\n\ntype FetchLike = typeof fetch\ntype FetchInput = Parameters<FetchLike>[0]\ntype FetchInit = Parameters<FetchLike>[1]\n\n// Robinhood Chain — second EVM network accepted for x402 Permit2 payments\n// alongside Base Mainnet. The x402 SDK builds its own bare RPC client per\n// chain ID from this config (no viem chain-registry entry is needed: it\n// never imports `viem/chains`, it just does `createPublicClient({transport:\n// http(rpcUrl)})` keyed by CAIP-2 chain ID).\nexport const ROBINHOOD_CHAIN_ID = 4663\nexport const ROBINHOOD_NETWORK = 'eip155:4663'\nexport const ROBINHOOD_RPC_URL = 'https://rpc.mainnet.chain.robinhood.com'\n\nconst EVM_SCHEME_OPTIONS: UptoEvmSchemeConfigByChainId = {\n [ROBINHOOD_CHAIN_ID]: { rpcUrl: ROBINHOOD_RPC_URL },\n}\n\n/**\n * Reads the operator's payment-asset preference order (env\n * CHAIN_INSIGHTS_PAYMENT_ASSET_PREFERENCE, comma-separated symbols or\n * addresses). Empty/unset keeps server order.\n */\nexport function resolvePaymentAssetPreference(env: NodeJS.ProcessEnv = process.env): string {\n return env['CHAIN_INSIGHTS_PAYMENT_ASSET_PREFERENCE']?.trim() ?? ''\n}\n\n/**\n * Wraps `fetch` so that a 402 response's `accepts` offers are re-ordered by\n * the operator's payment-asset preference before the x402 client's default\n * selector (which always picks `accepts[0]`) runs. Must wrap the raw\n * transport `fetch` passed into `wrapFetchWithPaymentFromConfig`, not the\n * result of it, since the x402 client parses `accepts` from the first 402\n * response it sees.\n */\nfunction createAssetPreferenceReorderingFetch(baseFetch: FetchLike, preference: string): FetchLike {\n if (!preference) return baseFetch\n return (async (input: FetchInput, init?: FetchInit) => {\n const response = await baseFetch(input, init)\n if (response.status !== 402) return response\n const encoded = response.headers.get('payment-required')\n if (!encoded) return response\n\n let parsed: { accepts?: PaymentOptionLike[] } & Record<string, unknown>\n try {\n parsed = JSON.parse(Buffer.from(encoded, 'base64').toString('utf8'))\n } catch {\n return response\n }\n if (!Array.isArray(parsed.accepts) || parsed.accepts.length === 0) return response\n\n const reordered = orderPaymentOptions(parsed.accepts, preference, KNOWN_PAYMENT_ASSET_SYMBOLS)\n const reencoded = Buffer.from(JSON.stringify({ ...parsed, accepts: reordered })).toString(\n 'base64'\n )\n const headers = new Headers(response.headers)\n headers.set('payment-required', reencoded)\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n })\n }) as FetchLike\n}\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 `cia wallet ready` to check funding and finish one-time payment setup, ' +\n 'run `cia wallet topup` if it says the wallet needs USDC, ' +\n 'or `cia 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 asset?: 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<{\n scheme?: unknown\n network?: unknown\n amount?: unknown\n payTo?: unknown\n asset?: unknown\n }>\n }\n const reason =\n typeof parsed.error === 'string' && parsed.error.trim()\n ? parsed.error.trim()\n : 'payment_required'\n const firstRequirement = Array.isArray(parsed.accepts) ? parsed.accepts[0] : undefined\n const amount =\n 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:\n typeof firstRequirement?.payTo === 'string' ? firstRequirement.payTo.trim() : undefined,\n asset:\n typeof firstRequirement?.asset === 'string' ? firstRequirement.asset.trim() : undefined,\n }\n } catch {\n return null\n }\n}\n\n/**\n * True only for the one combination this client can auto-approve today:\n * USDC on Base, via the existing Base-only `wallet/tools.ts` allowance flow.\n * A requirement with no `asset` at all predates multi-asset 402 offers and\n * is treated as that same legacy USDC-on-Base case.\n */\nfunction isAutoApprovableBaseUsdc(requirement: PaymentRequirementDetails): boolean {\n if (requirement.network !== 'eip155:8453') return false\n if (!requirement.asset) return true\n return requirement.asset.toLowerCase() === USDC_ADDRESS.toLowerCase()\n}\n\n/**\n * Clear, actionable error for the case the auto-approval flow does not cover:\n * a Permit2 allowance is missing for a non-Base-USDC asset (e.g. USDG/CHOICE\n * on Robinhood Chain) and the server did not offer a gas-sponsored approval\n * extension. Names the token, the canonical Permit2 address, and the exact\n * approval call so the operator can run it manually.\n */\nfunction describePermit2ApprovalNeededError(requirement: PaymentRequirementDetails): string {\n const token = requirement.asset ?? 'the payment token'\n const networkSuffix = requirement.network ? ` on ${requirement.network}` : ''\n return (\n `Payment requires a one-time Permit2 approval for token ${token}${networkSuffix} before paid calls can settle, ` +\n 'and gas-sponsored approval is not available for this asset. ' +\n `Approve the canonical Permit2 contract ${PERMIT2_ADDRESS} to spend ${token} by calling ` +\n `approve(${PERMIT2_ADDRESS}, <amount>) on the token contract, then retry the call.`\n )\n}\n\nfunction describePaymentRequiredResponse(response: Response, payerAddress?: string): string {\n const requirement = paymentRequirementFromResponse(response)\n if (!requirement)\n 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 ]\n .filter(Boolean)\n .join(' ')\n const message = details\n ? `x402 payment failed: ${reason} (${details})`\n : `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 \\`cia 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 if (!isAutoApprovableBaseUsdc(requirement)) {\n throw new PaymentRequiredError(describePermit2ApprovalNeededError(requirement))\n }\n try {\n await prepareWalletForPaidCalls({\n account: paymentWallet,\n // The endpoint dictates requirement.amountUnits; cap it so a hostile\n // endpoint cannot drive an unbounded Permit2 approval / wallet drain.\n maxApprovalUnits: resolveMaxAutoApprovalUnits(),\n ...(requirement.amountUnits === undefined\n ? {}\n : { minimumApprovalUnits: requirement.amountUnits }),\n })\n } catch (err) {\n throw new PaymentRequiredError(\n 'Payment setup is not ready yet. Run `cia 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) or, when the\n * server offers it and the operator prefers it, a Permit2 asset on\n * Robinhood Chain (eip155:4663) — see ROBINHOOD_NETWORK.\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 // Shared across both networks: EVM_SCHEME_OPTIONS is keyed by chain ID, so\n // it only supplies an RPC URL for Robinhood Chain (4663) and leaves Base\n // (8453) exactly as before (no RPC configured — gas-sponsored approval\n // stays unavailable there too, unchanged from prior behavior).\n const uptoScheme = new UptoEvmScheme(account, EVM_SCHEME_OPTIONS)\n const paymentFetch = wrapFetchWithPaymentFromConfig(\n createAssetPreferenceReorderingFetch(\n createWalletProofFetch(account, fetch),\n resolvePaymentAssetPreference()\n ),\n {\n schemes: [\n {\n network: 'eip155:8453', // Base Mainnet — dynamic MCP pricing uses the x402 upto scheme\n client: uptoScheme,\n },\n {\n network: 'eip155:8453', // Base Mainnet — only supported chain in v1\n client: new ExactEvmScheme(account),\n },\n {\n network: ROBINHOOD_NETWORK, // Robinhood Chain — Permit2-only (upto scheme), same client instance\n client: uptoScheme,\n },\n ],\n }\n )\n const reportingFetch = createPaymentFailureReportingFetch(paymentFetch, account.address, {\n address: account.address,\n privateKey,\n })\n return authToken ? createHeaderFetch(authToken, reportingFetch) : reportingFetch\n}\n\n/**\n * Creates a bearer/debug-token fetch for local Chain Insights Graph testing.\n *\n * Chain Insights Graph deployments accept test access through the public debug header,\n * 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(\n authToken: string,\n baseFetch: FetchLike = fetch\n): FetchLike {\n const headerFetch = createHeaderFetch(authToken, baseFetch)\n return createPaymentFailureReportingFetch(headerFetch)\n}\n\nexport function resolveGraphMcpEndpoint(\n config: Pick<InvestigatorConfig, 'graphMcpEndpoint'>\n): string {\n return config.graphMcpEndpoint.trim()\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 createConfiguredGraphMcpFetch(\n config: Pick<InvestigatorConfig, 'graphMcpAuthToken' | 'graphMcpMode'>\n): Promise<FetchLike> {\n if (config.graphMcpMode === 'debug') {\n const authToken = config.graphMcpAuthToken?.trim()\n if (!authToken) {\n throw new Error(\n 'Chain Insights Graph debug mode requires graphMcpAuthToken. Run `cia access-key set <key>` or `cia debug on --token <token>`.'\n )\n }\n return createMcpAuthFetchClient(authToken)\n }\n\n return createConfiguredGraphPaidOrFreeFetch()\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-
|
|
2
|
-
import { i as graphMcpEndpointEnvOverride, n as parseInvestigatorConfig, t as DEFAULT_CONFIG } from "./schema-
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
|
|
2
|
+
import { i as graphMcpEndpointEnvOverride, n as parseInvestigatorConfig, t as DEFAULT_CONFIG } from "./schema-KjZqCHbu.mjs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
5
5
|
import os from "node:os";
|
|
@@ -73,4 +73,4 @@ async function resetConfigCache() {
|
|
|
73
73
|
//#endregion
|
|
74
74
|
export { saveConfig as i, loadConfig as n, resetConfigCache as r, config_exports as t };
|
|
75
75
|
|
|
76
|
-
//# sourceMappingURL=config-
|
|
76
|
+
//# sourceMappingURL=config-Br6VEK0O.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-
|
|
1
|
+
{"version":3,"file":"config-Br6VEK0O.mjs","names":[],"sources":["../src/config/index.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from 'node:fs/promises'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { DEFAULT_CONFIG, parseInvestigatorConfig, type InvestigatorConfig } from './schema.js'\nimport { graphMcpEndpointEnvOverride } from './mcp-endpoint.js'\n\n// Config path derived from HOME at call time so tests can override HOME.\nfunction configPath(): string {\n return path.join(os.homedir(), '.chain-insights', 'config.json')\n}\n\nlet _cached: InvestigatorConfig | null = null\n\nfunction applyRuntimeEnvOverrides(config: InvestigatorConfig): InvestigatorConfig {\n let graphMcpEndpoint: string | undefined\n try {\n graphMcpEndpoint = graphMcpEndpointEnvOverride()\n } catch (err) {\n throw new Error(`Invalid configuration in environment: ${(err as Error).message}`)\n }\n return graphMcpEndpoint ? parseInvestigatorConfig({ ...config, graphMcpEndpoint }) : config\n}\n\nasync function loadStoredConfig(): Promise<InvestigatorConfig> {\n const cfgPath = configPath()\n let raw: string\n try {\n raw = await readFile(cfgPath, 'utf8')\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return DEFAULT_CONFIG\n }\n throw new Error(`Unable to read config ${cfgPath}: ${(err as Error).message}`)\n }\n\n let parsedJson: unknown\n try {\n parsedJson = JSON.parse(raw) as unknown\n } catch (err) {\n throw new Error(`Invalid JSON in ${cfgPath}: ${(err as Error).message}`)\n }\n\n try {\n return parseInvestigatorConfig(parsedJson)\n } catch (err) {\n throw new Error(`Invalid configuration in ${cfgPath}: ${(err as Error).message}`)\n }\n}\n\nexport async function loadConfig(): Promise<InvestigatorConfig> {\n if (_cached) return _cached\n _cached = applyRuntimeEnvOverrides(await loadStoredConfig())\n return _cached\n}\n\nexport async function saveConfig(updates: Partial<InvestigatorConfig>): Promise<void> {\n const current = await loadStoredConfig()\n let next: InvestigatorConfig\n try {\n next = parseInvestigatorConfig({ ...current, ...updates })\n } catch (err) {\n throw new Error(`Invalid configuration update: ${(err as Error).message}`)\n }\n const p = configPath()\n await mkdir(path.dirname(p), { recursive: true })\n await writeFile(p, JSON.stringify(next, null, 2) + '\\n', { mode: 0o600 })\n _cached = applyRuntimeEnvOverrides(next)\n}\n\nexport async function resetConfigCache(): Promise<void> {\n _cached = null\n}\n"],"mappings":";;;;;;;;;;;AAOA,SAAS,aAAqB;CAC5B,OAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,mBAAmB,aAAa;AACjE;AAEA,IAAI,UAAqC;AAEzC,SAAS,yBAAyB,QAAgD;CAChF,IAAI;CACJ,IAAI;EACF,mBAAmB,4BAA4B;CACjD,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,yCAA0C,IAAc,SAAS;CACnF;CACA,OAAO,mBAAmB,wBAAwB;EAAE,GAAG;EAAQ;CAAiB,CAAC,IAAI;AACvF;AAEA,eAAe,mBAAgD;CAC7D,MAAM,UAAU,WAAW;CAC3B,IAAI;CACJ,IAAI;EACF,MAAM,MAAM,SAAS,SAAS,MAAM;CACtC,SAAS,KAAK;EACZ,IAAK,IAA8B,SAAS,UAC1C,OAAO;EAET,MAAM,IAAI,MAAM,yBAAyB,QAAQ,IAAK,IAAc,SAAS;CAC/E;CAEA,IAAI;CACJ,IAAI;EACF,aAAa,KAAK,MAAM,GAAG;CAC7B,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,mBAAmB,QAAQ,IAAK,IAAc,SAAS;CACzE;CAEA,IAAI;EACF,OAAO,wBAAwB,UAAU;CAC3C,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,4BAA4B,QAAQ,IAAK,IAAc,SAAS;CAClF;AACF;AAEA,eAAsB,aAA0C;CAC9D,IAAI,SAAS,OAAO;CACpB,UAAU,yBAAyB,MAAM,iBAAiB,CAAC;CAC3D,OAAO;AACT;AAEA,eAAsB,WAAW,SAAqD;CACpF,MAAM,UAAU,MAAM,iBAAiB;CACvC,IAAI;CACJ,IAAI;EACF,OAAO,wBAAwB;GAAE,GAAG;GAAS,GAAG;EAAQ,CAAC;CAC3D,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,iCAAkC,IAAc,SAAS;CAC3E;CACA,MAAM,IAAI,WAAW;CACrB,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;CAChD,MAAM,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;CACxE,UAAU,yBAAyB,IAAI;AACzC;AAEA,eAAsB,mBAAkC;CACtD,UAAU;AACZ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
|
|
2
|
-
const require_schema = require("./schema-
|
|
2
|
+
const require_schema = require("./schema-tX0U0-VI.cjs");
|
|
3
3
|
let node_path = require("node:path");
|
|
4
4
|
node_path = require_rolldown_runtime.__toESM(node_path, 1);
|
|
5
5
|
let node_fs_promises = require("node:fs/promises");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
|
|
2
2
|
import { generatePrivateKey } from "viem/accounts";
|
|
3
3
|
//#region src/wallet/create.ts
|
|
4
4
|
var create_exports = /* @__PURE__ */ __exportAll({
|
|
@@ -45,4 +45,4 @@ function formatWalletBackupWarning(privateKey, options = {}) {
|
|
|
45
45
|
//#endregion
|
|
46
46
|
export { isWalletBackupConfirmed as i, formatWalletBackupWarning as n, generateWalletPrivateKey as r, create_exports as t };
|
|
47
47
|
|
|
48
|
-
//# sourceMappingURL=create-
|
|
48
|
+
//# sourceMappingURL=create-CpfZq2fx.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-
|
|
1
|
+
{"version":3,"file":"create-CpfZq2fx.mjs","names":[],"sources":["../src/wallet/create.ts"],"sourcesContent":["import type { Hex } from 'viem'\nimport { generatePrivateKey } from 'viem/accounts'\n\nconst ANSI_RESET = '\\u001b[0m'\nconst ANSI_RED_BOLD = '\\u001b[1;31m'\nconst ANSI_YELLOW_BOLD = '\\u001b[1;33m'\n\nexport interface WalletBackupWarningOptions {\n color?: boolean\n width?: number\n}\n\nexport function generateWalletPrivateKey(): Hex {\n return generatePrivateKey()\n}\n\nexport function isWalletBackupConfirmed(answer: string): boolean {\n return answer === 'BACKED UP'\n}\n\nfunction paint(value: string, color: string | undefined): string {\n return color ? `${color}${value}${ANSI_RESET}` : value\n}\n\nexport function formatWalletBackupWarning(\n privateKey: string,\n options: WalletBackupWarningOptions = {}\n): string {\n const color = options.color === true\n const lines = [\n '⚠ BACK UP YOUR PRIVATE KEY NOW ⚠',\n '',\n 'This key controls your payment wallet.',\n 'It will not be shown again.',\n '',\n `Private key: ${privateKey}`,\n '',\n 'Type BACKED UP to continue:',\n ]\n const contentWidth = Math.max(options.width ?? 60, ...lines.map((line) => line.length))\n const horizontal = '─'.repeat(contentWidth + 2)\n const renderLine = (line: string, lineIndex: number): string => {\n const lineColor =\n lineIndex === 0\n ? ANSI_RED_BOLD\n : line.startsWith('Private key:')\n ? ANSI_YELLOW_BOLD\n : undefined\n return `│ ${paint(line, color ? lineColor : undefined)}${' '.repeat(contentWidth - line.length)} │`\n }\n return [`┌${horizontal}┐`, ...lines.map(renderLine), `└${horizontal}┘`].join('\\n')\n}\n"],"mappings":";;;;;;;;AAGA,MAAM,aAAa;AACnB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AAOzB,SAAgB,2BAAgC;CAC9C,OAAO,mBAAmB;AAC5B;AAEA,SAAgB,wBAAwB,QAAyB;CAC/D,OAAO,WAAW;AACpB;AAEA,SAAS,MAAM,OAAe,OAAmC;CAC/D,OAAO,QAAQ,GAAG,QAAQ,QAAQ,eAAe;AACnD;AAEA,SAAgB,0BACd,YACA,UAAsC,CAAC,GAC/B;CACR,MAAM,QAAQ,QAAQ,UAAU;CAChC,MAAM,QAAQ;EACZ;EACA;EACA;EACA;EACA;EACA,gBAAgB;EAChB;EACA;CACF;CACA,MAAM,eAAe,KAAK,IAAI,QAAQ,SAAS,IAAI,GAAG,MAAM,KAAK,SAAS,KAAK,MAAM,CAAC;CACtF,MAAM,aAAa,IAAI,OAAO,eAAe,CAAC;CAC9C,MAAM,cAAc,MAAc,cAA8B;EAC9D,MAAM,YACJ,cAAc,IACV,gBACA,KAAK,WAAW,cAAc,IAC5B,mBACA,KAAA;EACR,OAAO,KAAK,MAAM,MAAM,QAAQ,YAAY,KAAA,CAAS,IAAI,IAAI,OAAO,eAAe,KAAK,MAAM,EAAE;CAClG;CACA,OAAO;EAAC,IAAI,WAAW;EAAI,GAAG,MAAM,IAAI,UAAU;EAAG,IAAI,WAAW;CAAE,CAAC,CAAC,KAAK,IAAI;AACnF"}
|