@dexterai/mcp 1.1.0 → 1.1.1
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/dist/index.js +54 -46
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -113,7 +113,11 @@ function formatResource(r) {
|
|
|
113
113
|
qualityScore: r.qualityScore ?? null,
|
|
114
114
|
verified: r.verificationStatus === "pass",
|
|
115
115
|
totalCalls: r.totalSettlements ?? 0,
|
|
116
|
-
seller: r.seller?.displayName || null
|
|
116
|
+
seller: r.seller?.displayName || null,
|
|
117
|
+
sellerReputation: r.reputationScore ?? null,
|
|
118
|
+
authRequired: Boolean(r.authRequired),
|
|
119
|
+
authType: r.authType ?? null,
|
|
120
|
+
authHint: r.authHint ?? null
|
|
117
121
|
};
|
|
118
122
|
}
|
|
119
123
|
async function searchMarketplace(params, opts) {
|
|
@@ -123,8 +127,7 @@ async function searchMarketplace(params, opts) {
|
|
|
123
127
|
if (params.network) qs.set("network", params.network);
|
|
124
128
|
if (params.maxPriceUsdc != null) qs.set("maxPrice", String(params.maxPriceUsdc));
|
|
125
129
|
if (params.verifiedOnly) qs.set("verified", "true");
|
|
126
|
-
qs.set("sort", params.sort || "
|
|
127
|
-
qs.set("order", "desc");
|
|
130
|
+
qs.set("sort", params.sort || "marketplace");
|
|
128
131
|
qs.set("limit", String(Math.min(params.limit || 20, 50)));
|
|
129
132
|
const url = `${getApiBase(opts.dev)}${MARKETPLACE_PATH}?${qs}`;
|
|
130
133
|
const res = await fetch(url, {
|
|
@@ -150,7 +153,7 @@ function registerSearchTool(server, opts) {
|
|
|
150
153
|
network: z.string().optional().describe("Filter by payment network: 'solana', 'base', 'polygon'"),
|
|
151
154
|
maxPriceUsdc: z.number().optional().describe("Maximum price per call in USDC"),
|
|
152
155
|
verifiedOnly: z.boolean().optional().describe("Only return verified endpoints"),
|
|
153
|
-
sort: z.enum(["relevance", "quality_score", "settlements", "volume", "recent"]).optional().describe("Sort order (default:
|
|
156
|
+
sort: z.enum(["relevance", "quality_score", "settlements", "volume", "recent", "marketplace"]).optional().describe("Sort order (default: marketplace)"),
|
|
154
157
|
limit: z.number().optional().default(20).describe("Max results (1-50)")
|
|
155
158
|
},
|
|
156
159
|
async (args) => {
|
|
@@ -168,8 +171,11 @@ function registerSearchTool(server, opts) {
|
|
|
168
171
|
_meta: SEARCH_META
|
|
169
172
|
};
|
|
170
173
|
} catch (err) {
|
|
174
|
+
const payload = { error: err.message || "search_failed", success: false, count: 0, resources: [] };
|
|
171
175
|
return {
|
|
172
|
-
content: [{ type: "text", text: JSON.stringify(
|
|
176
|
+
content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
|
|
177
|
+
structuredContent: payload,
|
|
178
|
+
_meta: SEARCH_META,
|
|
173
179
|
isError: true
|
|
174
180
|
};
|
|
175
181
|
}
|
|
@@ -350,20 +356,6 @@ function parse402(body) {
|
|
|
350
356
|
firstAccept: obj.accepts[0] || null
|
|
351
357
|
};
|
|
352
358
|
}
|
|
353
|
-
async function createQrSession(accept, resourceUrl, dev) {
|
|
354
|
-
const sessionRes = await fetch(`${getApiBase(dev)}/v2/pay/session`, {
|
|
355
|
-
method: "POST",
|
|
356
|
-
headers: { "Content-Type": "application/json" },
|
|
357
|
-
body: JSON.stringify({
|
|
358
|
-
payTo: accept.payTo,
|
|
359
|
-
amount: String(accept.amount || accept.maxAmountRequired),
|
|
360
|
-
asset: accept.asset,
|
|
361
|
-
feePayer: accept.extra?.feePayer || "",
|
|
362
|
-
resourceUrl
|
|
363
|
-
})
|
|
364
|
-
});
|
|
365
|
-
return await sessionRes.json();
|
|
366
|
-
}
|
|
367
359
|
async function x402Fetch(params, wallet, opts) {
|
|
368
360
|
const requestHeaders = {
|
|
369
361
|
"Content-Type": "application/json",
|
|
@@ -408,30 +400,9 @@ async function x402Fetch(params, wallet, opts) {
|
|
|
408
400
|
return { status: 402, error: `Payment failed: ${err.message}`, requirements };
|
|
409
401
|
}
|
|
410
402
|
}
|
|
411
|
-
if (firstAccept && String(firstAccept.network || "").startsWith("solana")) {
|
|
412
|
-
try {
|
|
413
|
-
const session = await createQrSession(firstAccept, params.url, opts.dev);
|
|
414
|
-
if (!session.ok) {
|
|
415
|
-
return { status: 402, error: "Failed to create payment session", requirements };
|
|
416
|
-
}
|
|
417
|
-
return {
|
|
418
|
-
status: 402,
|
|
419
|
-
mode: "qr",
|
|
420
|
-
message: "Scan the QR code with Phantom or Solflare to pay, then this tool will automatically complete the request.",
|
|
421
|
-
qr: {
|
|
422
|
-
solanaPayUrl: session.solanaPayUrl,
|
|
423
|
-
nonce: session.nonce,
|
|
424
|
-
expiresAt: session.expiresAt
|
|
425
|
-
},
|
|
426
|
-
pollUrl: `${getApiBase(opts.dev)}/v2/pay/status/${session.nonce}`,
|
|
427
|
-
requirements
|
|
428
|
-
};
|
|
429
|
-
} catch {
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
403
|
return {
|
|
433
404
|
status: 402,
|
|
434
|
-
message: "Payment required.
|
|
405
|
+
message: "Payment required. Configure DEXTER_PRIVATE_KEY for canonical x402 settlement or provide payment-signature manually.",
|
|
435
406
|
requirements
|
|
436
407
|
};
|
|
437
408
|
}
|
|
@@ -485,13 +456,35 @@ async function cliFetch(url, opts) {
|
|
|
485
456
|
var init_fetch = __esm({
|
|
486
457
|
"src/tools/fetch.ts"() {
|
|
487
458
|
"use strict";
|
|
488
|
-
init_config();
|
|
489
459
|
init_widget_meta();
|
|
490
460
|
}
|
|
491
461
|
});
|
|
492
462
|
|
|
493
463
|
// src/tools/check.ts
|
|
494
464
|
import { z as z3 } from "zod";
|
|
465
|
+
function parsePaymentRequiredHeader(headerValue) {
|
|
466
|
+
if (!headerValue) return null;
|
|
467
|
+
const candidates = [headerValue];
|
|
468
|
+
try {
|
|
469
|
+
candidates.push(Buffer.from(headerValue, "base64").toString("utf-8"));
|
|
470
|
+
} catch {
|
|
471
|
+
}
|
|
472
|
+
try {
|
|
473
|
+
const normalized = headerValue.replace(/-/g, "+").replace(/_/g, "/");
|
|
474
|
+
candidates.push(Buffer.from(normalized, "base64").toString("utf-8"));
|
|
475
|
+
} catch {
|
|
476
|
+
}
|
|
477
|
+
for (const candidate of candidates) {
|
|
478
|
+
try {
|
|
479
|
+
const parsed = JSON.parse(candidate);
|
|
480
|
+
if (parsed && typeof parsed === "object") {
|
|
481
|
+
return parsed;
|
|
482
|
+
}
|
|
483
|
+
} catch {
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
return null;
|
|
487
|
+
}
|
|
495
488
|
async function checkEndpoint(url, method) {
|
|
496
489
|
const res = await fetch(url, {
|
|
497
490
|
method,
|
|
@@ -500,6 +493,15 @@ async function checkEndpoint(url, method) {
|
|
|
500
493
|
signal: AbortSignal.timeout(15e3)
|
|
501
494
|
});
|
|
502
495
|
if (res.status !== 402) {
|
|
496
|
+
if (res.status === 401 || res.status === 403) {
|
|
497
|
+
const bodyText = await res.text().catch(() => "");
|
|
498
|
+
return {
|
|
499
|
+
error: true,
|
|
500
|
+
statusCode: res.status,
|
|
501
|
+
authRequired: true,
|
|
502
|
+
message: bodyText || "Provider authentication required before x402 payment flow."
|
|
503
|
+
};
|
|
504
|
+
}
|
|
503
505
|
if (res.status >= 500) {
|
|
504
506
|
return { error: true, statusCode: res.status, message: "Server error" };
|
|
505
507
|
}
|
|
@@ -513,15 +515,21 @@ async function checkEndpoint(url, method) {
|
|
|
513
515
|
body = await res.json();
|
|
514
516
|
} catch {
|
|
515
517
|
}
|
|
518
|
+
const headerParsed = parsePaymentRequiredHeader(
|
|
519
|
+
res.headers.get("PAYMENT-REQUIRED") || res.headers.get("payment-required")
|
|
520
|
+
);
|
|
521
|
+
const source = headerParsed && typeof headerParsed === "object" ? headerParsed : body;
|
|
516
522
|
const accepts = body?.accepts;
|
|
517
|
-
|
|
523
|
+
const acceptsFromHeader = source?.accepts;
|
|
524
|
+
const effectiveAccepts = accepts?.length ? accepts : acceptsFromHeader;
|
|
525
|
+
if (!effectiveAccepts?.length) {
|
|
518
526
|
return {
|
|
519
527
|
requiresPayment: true,
|
|
520
528
|
statusCode: 402,
|
|
521
529
|
error: "No payment options found in 402 response"
|
|
522
530
|
};
|
|
523
531
|
}
|
|
524
|
-
const paymentOptions =
|
|
532
|
+
const paymentOptions = effectiveAccepts.map((a) => {
|
|
525
533
|
const amount = Number(a.amount || a.maxAmountRequired || 0);
|
|
526
534
|
const decimals = Number(a.extra && typeof a.extra === "object" && "decimals" in a.extra ? a.extra.decimals : 6);
|
|
527
535
|
return {
|
|
@@ -536,9 +544,9 @@ async function checkEndpoint(url, method) {
|
|
|
536
544
|
return {
|
|
537
545
|
requiresPayment: true,
|
|
538
546
|
statusCode: 402,
|
|
539
|
-
x402Version:
|
|
547
|
+
x402Version: source?.x402Version ?? 2,
|
|
540
548
|
paymentOptions,
|
|
541
|
-
resource:
|
|
549
|
+
resource: source?.resource
|
|
542
550
|
};
|
|
543
551
|
}
|
|
544
552
|
function registerCheckTool(server, opts) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/widget-meta.ts","../src/tools/search.ts","../src/wallet/index.ts","../src/tools/fetch.ts","../src/tools/check.ts","../src/tools/wallet-tool.ts","../src/server/index.ts","../src/cli/install/clients.ts","../src/cli/install/index.ts","../src/index.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname as pathDirname } from \"node:path\";\n\nexport const DATA_DIR = join(homedir(), \".dexterai-mcp\");\nexport const WALLET_FILE = join(DATA_DIR, \"wallet.json\");\n\nexport const DEXTER_API_PROD = process.env.DEXTER_API_URL || \"https://x402.dexter.cash\";\nexport const DEXTER_API_DEV = \"http://127.0.0.1:3030\";\nexport const SOLANA_RPC_URL = process.env.SOLANA_RPC_URL || \"https://api.dexter.cash/api/solana/rpc\";\n\nexport const MARKETPLACE_PATH = \"/api/facilitator/marketplace/resources\";\n\nexport function getApiBase(dev: boolean): string {\n return dev ? DEXTER_API_DEV : DEXTER_API_PROD;\n}\n\nfunction loadVersion(): string {\n try {\n const here = pathDirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(join(here, \"..\", \"package.json\"), \"utf-8\"));\n return pkg.version || \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const VERSION = loadVersion();\n","const WIDGET_DOMAIN = \"https://dexter.cash\";\n\nconst WIDGET_CSP = {\n resource_domains: [\n \"https://cdn.dexscreener.com\",\n \"https://raw.githubusercontent.com\",\n \"https://metadata.jup.ag\",\n ],\n};\n\nexport function widgetMeta(templateUri: string, invoking: string, invoked: string, description: string) {\n return {\n \"openai/outputTemplate\": templateUri,\n \"openai/resultCanProduceWidget\": true,\n \"openai/widgetAccessible\": true,\n \"openai/widgetDomain\": WIDGET_DOMAIN,\n \"openai/widgetPrefersBorder\": true,\n \"openai/widgetCSP\": WIDGET_CSP,\n \"openai/toolInvocation/invoking\": invoking,\n \"openai/toolInvocation/invoked\": invoked,\n \"openai/widgetDescription\": description,\n };\n}\n\nexport const SEARCH_META = widgetMeta(\n \"ui://dexter/x402-marketplace-search\",\n \"Searching marketplace\\u2026\",\n \"Results ready\",\n \"Shows paid API search results as interactive cards with quality rings, prices, and fetch buttons.\",\n);\n\nexport const FETCH_META = widgetMeta(\n \"ui://dexter/x402-fetch-result\",\n \"Calling API\\u2026\",\n \"Response received\",\n \"Shows API response data with payment receipt, transaction link, and settlement status.\",\n);\n\nexport const CHECK_META = widgetMeta(\n \"ui://dexter/x402-pricing\",\n \"Checking pricing\\u2026\",\n \"Pricing loaded\",\n \"Shows endpoint pricing per blockchain with payment amounts and a pay button.\",\n);\n\nexport const WALLET_META = widgetMeta(\n \"ui://dexter/x402-wallet\",\n \"Loading wallet\\u2026\",\n \"Wallet loaded\",\n \"Shows wallet address with copy button, USDC/SOL balances, and deposit QR code.\",\n);\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getApiBase, MARKETPLACE_PATH } from \"../config.js\";\nimport { SEARCH_META } from \"../widget-meta.js\";\n\ninterface SearchOpts {\n dev: boolean;\n}\n\ninterface MarketplaceResource {\n resourceUrl: string;\n displayName?: string;\n description?: string | null;\n method?: string;\n priceUsdc?: number | null;\n priceLabel?: string | null;\n priceNetwork?: string | null;\n qualityScore?: number | null;\n verificationStatus?: string | null;\n totalSettlements?: number;\n totalVolumeUsdc?: number;\n category?: string | null;\n seller?: { displayName?: string | null };\n reputationScore?: number | null;\n}\n\nfunction formatResource(r: MarketplaceResource) {\n return {\n name: r.displayName || r.resourceUrl,\n url: r.resourceUrl,\n method: r.method || \"GET\",\n price: r.priceLabel || (r.priceUsdc != null ? `$${r.priceUsdc.toFixed(2)}` : \"free\"),\n network: r.priceNetwork || null,\n description: r.description || \"\",\n category: r.category || \"uncategorized\",\n qualityScore: r.qualityScore ?? null,\n verified: r.verificationStatus === \"pass\",\n totalCalls: r.totalSettlements ?? 0,\n seller: r.seller?.displayName || null,\n };\n}\n\nasync function searchMarketplace(\n params: {\n query?: string;\n category?: string;\n network?: string;\n maxPriceUsdc?: number;\n verifiedOnly?: boolean;\n sort?: string;\n limit?: number;\n },\n opts: SearchOpts,\n) {\n const qs = new URLSearchParams();\n if (params.query) qs.set(\"search\", params.query);\n if (params.category) qs.set(\"category\", params.category);\n if (params.network) qs.set(\"network\", params.network);\n if (params.maxPriceUsdc != null) qs.set(\"maxPrice\", String(params.maxPriceUsdc));\n if (params.verifiedOnly) qs.set(\"verified\", \"true\");\n qs.set(\"sort\", params.sort || \"quality_score\");\n qs.set(\"order\", \"desc\");\n qs.set(\"limit\", String(Math.min(params.limit || 20, 50)));\n\n const url = `${getApiBase(opts.dev)}${MARKETPLACE_PATH}?${qs}`;\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!res.ok) {\n throw new Error(`Marketplace returned ${res.status}: ${await res.text().catch(() => \"\")}`);\n }\n\n const data = await res.json() as { resources?: MarketplaceResource[] };\n return {\n resources: (data.resources || []).map(formatResource),\n total: data.resources?.length || 0,\n };\n}\n\nexport function registerSearchTool(server: McpServer, opts: SearchOpts): void {\n server.tool(\n \"x402_search\",\n \"Search the Dexter x402 marketplace for paid API resources. \" +\n \"Returns services with pricing, quality scores, and verification status. \" +\n \"Use this to discover APIs an agent can pay for and call with x402_fetch.\",\n {\n query: z.string().optional().describe(\"Search term, e.g. 'token analysis', 'image generation'\"),\n category: z.string().optional().describe(\"Filter by category\"),\n network: z.string().optional().describe(\"Filter by payment network: 'solana', 'base', 'polygon'\"),\n maxPriceUsdc: z.number().optional().describe(\"Maximum price per call in USDC\"),\n verifiedOnly: z.boolean().optional().describe(\"Only return verified endpoints\"),\n sort: z\n .enum([\"relevance\", \"quality_score\", \"settlements\", \"volume\", \"recent\"])\n .optional()\n .describe(\"Sort order (default: quality_score)\"),\n limit: z.number().optional().default(20).describe(\"Max results (1-50)\"),\n },\n async (args) => {\n try {\n const result = await searchMarketplace(args, opts);\n const data = {\n success: true,\n count: result.total,\n resources: result.resources,\n tip: \"Use x402_fetch to call any of these endpoints.\",\n };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data,\n _meta: SEARCH_META,\n } as any;\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n\nexport async function cliSearch(query: string, opts: { dev: boolean }): Promise<void> {\n try {\n const result = await searchMarketplace({ query }, opts);\n console.log(JSON.stringify({ success: true, count: result.total, resources: result.resources }, null, 2));\n } catch (err: any) {\n console.log(JSON.stringify({ error: err.message || String(err) }, null, 2));\n process.exit(1);\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { Keypair, Connection, PublicKey } from \"@solana/web3.js\";\nimport { getAssociatedTokenAddress } from \"@solana/spl-token\";\nimport bs58 from \"bs58\";\nimport { DATA_DIR, WALLET_FILE, SOLANA_RPC_URL } from \"../config.js\";\n\nexport interface WalletInfo {\n solanaPrivateKey: string;\n solanaAddress: string;\n evmPrivateKey?: string;\n evmAddress?: string;\n createdAt: string;\n}\n\nexport interface LoadedWallet {\n info: WalletInfo;\n solanaKeypair: Keypair;\n}\n\nconst USDC_MINT = new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\n\nexport async function loadOrCreateWallet(): Promise<LoadedWallet | null> {\n // Env var override takes priority\n const envKey = process.env.DEXTER_PRIVATE_KEY || process.env.SOLANA_PRIVATE_KEY;\n if (envKey) {\n const keypair = keypairFromString(envKey);\n return {\n info: {\n solanaPrivateKey: bs58.encode(keypair.secretKey),\n solanaAddress: keypair.publicKey.toBase58(),\n createdAt: new Date().toISOString(),\n },\n solanaKeypair: keypair,\n };\n }\n\n if (existsSync(WALLET_FILE)) {\n try {\n const raw = readFileSync(WALLET_FILE, \"utf-8\");\n const data = JSON.parse(raw) as WalletInfo;\n if (!data.solanaPrivateKey) throw new Error(\"Missing solanaPrivateKey\");\n const keypair = keypairFromString(data.solanaPrivateKey);\n if (keypair.secretKey.length !== 64) throw new Error(\"Invalid key length\");\n return { info: data, solanaKeypair: keypair };\n } catch (err: any) {\n console.error(`[dexter-mcp] Corrupted wallet file: ${err.message}`);\n console.error(`[dexter-mcp] Backing up to ${WALLET_FILE}.bak and creating fresh wallet.`);\n try { copyFileSync(WALLET_FILE, WALLET_FILE + \".bak\"); } catch {}\n }\n }\n\n // Generate new wallet\n const keypair = Keypair.generate();\n const info: WalletInfo = {\n solanaPrivateKey: bs58.encode(keypair.secretKey),\n solanaAddress: keypair.publicKey.toBase58(),\n createdAt: new Date().toISOString(),\n };\n\n mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(WALLET_FILE, JSON.stringify(info, null, 2), { mode: 0o600 });\n\n console.error(`[dexter-mcp] New wallet created: ${info.solanaAddress}`);\n console.error(`[dexter-mcp] Saved to ${WALLET_FILE}`);\n console.error(`[dexter-mcp] Deposit USDC (Solana) to this address to start paying for x402 APIs.`);\n\n return { info, solanaKeypair: keypair };\n}\n\nfunction keypairFromString(key: string): Keypair {\n try {\n // Try base58\n return Keypair.fromSecretKey(bs58.decode(key));\n } catch {\n // Try JSON array\n try {\n const arr = JSON.parse(key);\n if (Array.isArray(arr)) {\n return Keypair.fromSecretKey(Uint8Array.from(arr));\n }\n } catch {}\n throw new Error(\"Invalid private key format. Expected base58 string or JSON byte array.\");\n }\n}\n\nexport async function getSolanaBalance(\n address: string,\n rpcUrl?: string,\n): Promise<{ sol: number; usdc: number }> {\n try {\n const connection = new Connection(rpcUrl || SOLANA_RPC_URL, \"confirmed\");\n const pubkey = new PublicKey(address);\n\n const [solBalance, usdcBalance] = await Promise.all([\n connection.getBalance(pubkey).catch(() => 0),\n getUsdcBalance(connection, pubkey),\n ]);\n\n return { sol: solBalance / 1e9, usdc: usdcBalance };\n } catch (err: any) {\n console.error(`[dexter-mcp] RPC error fetching balance: ${err.message}`);\n return { sol: 0, usdc: 0 };\n }\n}\n\nasync function getUsdcBalance(connection: Connection, owner: PublicKey): Promise<number> {\n try {\n const ata = await getAssociatedTokenAddress(USDC_MINT, owner);\n const info = await connection.getTokenAccountBalance(ata);\n return Number(info.value.uiAmount ?? 0);\n } catch {\n return 0;\n }\n}\n\nexport async function showWalletInfo(opts: { dev: boolean }): Promise<void> {\n const wallet = await loadOrCreateWallet();\n if (!wallet) {\n console.log(JSON.stringify({ error: \"Failed to load wallet\" }));\n process.exit(1);\n }\n\n const balance = await getSolanaBalance(wallet.info.solanaAddress);\n\n console.log(JSON.stringify({\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n balances: {\n sol: balance.sol,\n usdc: balance.usdc,\n },\n walletFile: WALLET_FILE,\n tip: balance.usdc === 0\n ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.`\n : undefined,\n }, null, 2));\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { LoadedWallet } from \"../wallet/index.js\";\nimport { getApiBase } from \"../config.js\";\nimport { FETCH_META } from \"../widget-meta.js\";\n\ninterface FetchOpts {\n dev: boolean;\n}\n\nasync function parseResponse(res: Response): Promise<unknown> {\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"json\")) {\n try { return await res.json(); } catch { return await res.text(); }\n }\n return await res.text();\n}\n\nfunction extractSettlement(res: Response): unknown {\n const header = res.headers.get(\"payment-response\") || res.headers.get(\"PAYMENT-RESPONSE\");\n if (!header) return null;\n try { return JSON.parse(atob(header)); } catch {\n try { return JSON.parse(header); } catch { return null; }\n }\n}\n\nfunction parse402(body: unknown): { requirements: Record<string, unknown> | null; firstAccept: Record<string, unknown> | null } {\n const obj = body as Record<string, unknown> | null;\n if (!obj?.accepts || !Array.isArray(obj.accepts)) return { requirements: null, firstAccept: null };\n return {\n requirements: { accepts: obj.accepts, x402Version: obj.x402Version ?? 2, resource: obj.resource },\n firstAccept: obj.accepts[0] as Record<string, unknown> || null,\n };\n}\n\nasync function createQrSession(\n accept: Record<string, unknown>,\n resourceUrl: string,\n dev: boolean,\n): Promise<Record<string, unknown>> {\n const sessionRes = await fetch(`${getApiBase(dev)}/v2/pay/session`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n payTo: accept.payTo,\n amount: String(accept.amount || accept.maxAmountRequired),\n asset: accept.asset,\n feePayer: (accept.extra as Record<string, unknown>)?.feePayer || \"\",\n resourceUrl,\n }),\n });\n return await sessionRes.json() as Record<string, unknown>;\n}\n\nasync function pollSessionStatus(nonce: string, dev: boolean, maxAttempts = 60): Promise<Record<string, unknown>> {\n for (let i = 0; i < maxAttempts; i++) {\n await new Promise((r) => setTimeout(r, 2000));\n const res = await fetch(`${getApiBase(dev)}/v2/pay/status/${nonce}`);\n const status = await res.json() as Record<string, unknown>;\n if (status.state === \"paid\" || status.state === \"expired\") return status;\n }\n return { state: \"timeout\" };\n}\n\nasync function x402Fetch(\n params: { url: string; method: string; body?: string; headers?: Record<string, string> },\n wallet: LoadedWallet | null,\n opts: FetchOpts,\n): Promise<Record<string, unknown>> {\n const requestHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(params.headers || {}),\n };\n const fetchOpts: RequestInit = {\n method: params.method || \"GET\",\n headers: requestHeaders,\n };\n if (params.body && params.method !== \"GET\") {\n fetchOpts.body = params.body;\n }\n\n const probeRes = await fetch(params.url, { ...fetchOpts, signal: AbortSignal.timeout(15_000) });\n\n if (probeRes.status !== 402) {\n return { status: probeRes.status, data: await parseResponse(probeRes) };\n }\n\n let body402: unknown = null;\n try { body402 = await probeRes.json(); } catch {\n try { body402 = await probeRes.text(); } catch {}\n }\n\n const { requirements, firstAccept } = parse402(body402);\n\n // Mode 1: Local wallet auto-pay\n if (wallet) {\n try {\n const { wrapFetch } = await import(\"@dexterai/x402/client\");\n const x402FetchFn = wrapFetch(fetch, {\n walletPrivateKey: wallet.info.solanaPrivateKey,\n });\n\n const paidRes = await x402FetchFn(params.url, fetchOpts);\n const data = await parseResponse(paidRes);\n const settlement = extractSettlement(paidRes);\n\n return {\n status: paidRes.status,\n data,\n payment: settlement ? { settled: true, details: settlement } : { settled: false },\n };\n } catch (err: any) {\n return { status: 402, error: `Payment failed: ${err.message}`, requirements };\n }\n }\n\n // Mode 2: QR pay (no local wallet)\n if (firstAccept && String(firstAccept.network || \"\").startsWith(\"solana\")) {\n try {\n const session = await createQrSession(firstAccept, params.url, opts.dev);\n\n if (!session.ok) {\n return { status: 402, error: \"Failed to create payment session\", requirements };\n }\n\n return {\n status: 402,\n mode: \"qr\",\n message: \"Scan the QR code with Phantom or Solflare to pay, then this tool will automatically complete the request.\",\n qr: {\n solanaPayUrl: session.solanaPayUrl,\n nonce: session.nonce,\n expiresAt: session.expiresAt,\n },\n pollUrl: `${getApiBase(opts.dev)}/v2/pay/status/${session.nonce}`,\n requirements,\n };\n } catch {\n // Fall through to manual mode\n }\n }\n\n // Fallback: return raw requirements\n return {\n status: 402,\n message: \"Payment required. Set DEXTER_PRIVATE_KEY for auto-pay, or use a Solana wallet to pay manually.\",\n requirements,\n };\n}\n\nexport function registerFetchTool(\n server: McpServer,\n wallet: LoadedWallet | null,\n opts: FetchOpts,\n): void {\n const hasWallet = wallet !== null;\n\n server.tool(\n \"x402_fetch\",\n hasWallet\n ? \"Call any x402-protected API with automatic payment. \" +\n \"Signs and pays using your local wallet. Returns the API response directly.\"\n : \"Call any x402-protected API. Returns payment requirements. \" +\n \"Configure DEXTER_PRIVATE_KEY to enable automatic payment.\",\n {\n url: z.string().url().describe(\"The x402 resource URL to call\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\"])\n .default(\"GET\")\n .describe(\"HTTP method\"),\n body: z.string().optional().describe(\"JSON request body for POST/PUT\"),\n },\n async (args) => {\n try {\n const result = await x402Fetch(\n { url: args.url, method: args.method, body: args.body },\n wallet,\n opts,\n );\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n _meta: FETCH_META,\n } as any;\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n\nexport async function cliFetch(\n url: string,\n opts: { method: string; body?: string; dev: boolean },\n): Promise<void> {\n try {\n const { loadOrCreateWallet } = await import(\"../wallet/index.js\");\n const wallet = await loadOrCreateWallet();\n const result = await x402Fetch(\n { url, method: opts.method, body: opts.body },\n wallet,\n opts,\n );\n console.log(JSON.stringify(result, null, 2));\n } catch (err: any) {\n const msg = err.cause?.code === \"ENOTFOUND\"\n ? `Could not reach ${url} — DNS lookup failed`\n : err.name === \"TimeoutError\"\n ? `Request to ${url} timed out`\n : err.message || String(err);\n console.log(JSON.stringify({ error: msg }, null, 2));\n process.exit(1);\n }\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { CHECK_META } from \"../widget-meta.js\";\n\ninterface CheckOpts {\n dev: boolean;\n}\n\nasync function checkEndpoint(url: string, method: string): Promise<Record<string, unknown>> {\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: method !== \"GET\" ? \"{}\" : undefined,\n signal: AbortSignal.timeout(15_000),\n });\n\n if (res.status !== 402) {\n if (res.status >= 500) {\n return { error: true, statusCode: res.status, message: \"Server error\" };\n }\n if (res.status >= 400) {\n return { error: true, statusCode: res.status, message: `Client error: ${res.status}` };\n }\n return { requiresPayment: false, statusCode: res.status, free: true };\n }\n\n let body: Record<string, unknown> | null = null;\n try {\n body = await res.json() as Record<string, unknown>;\n } catch {}\n\n const accepts = body?.accepts as Array<Record<string, unknown>> | undefined;\n if (!accepts?.length) {\n return {\n requiresPayment: true,\n statusCode: 402,\n error: \"No payment options found in 402 response\",\n };\n }\n\n const paymentOptions = accepts.map((a) => {\n const amount = Number(a.amount || a.maxAmountRequired || 0);\n const decimals = Number(a.extra && typeof a.extra === \"object\" && \"decimals\" in a.extra\n ? (a.extra as Record<string, unknown>).decimals\n : 6);\n return {\n price: amount / Math.pow(10, decimals),\n priceFormatted: `$${(amount / Math.pow(10, decimals)).toFixed(decimals > 2 ? 4 : 2)}`,\n network: a.network,\n scheme: a.scheme,\n asset: a.asset,\n payTo: a.payTo,\n };\n });\n\n return {\n requiresPayment: true,\n statusCode: 402,\n x402Version: body?.x402Version ?? 2,\n paymentOptions,\n resource: body?.resource,\n };\n}\n\nexport function registerCheckTool(server: McpServer, opts: CheckOpts): void {\n server.tool(\n \"x402_check\",\n \"Check if an endpoint requires x402 payment and see its pricing. \" +\n \"Does NOT make a payment — just probes for requirements.\",\n {\n url: z.string().url().describe(\"The URL to check\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\"])\n .default(\"GET\")\n .describe(\"HTTP method to probe with\"),\n },\n async (args) => {\n try {\n const result = await checkEndpoint(args.url, args.method);\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n _meta: CHECK_META,\n } as any;\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { LoadedWallet } from \"../wallet/index.js\";\nimport { getSolanaBalance } from \"../wallet/index.js\";\nimport { WALLET_FILE } from \"../config.js\";\nimport { WALLET_META } from \"../widget-meta.js\";\n\ninterface WalletToolOpts {\n dev: boolean;\n}\n\nexport function registerWalletTool(\n server: McpServer,\n wallet: LoadedWallet | null,\n opts: WalletToolOpts,\n): void {\n server.tool(\n \"x402_wallet\",\n \"Show wallet address, USDC balance, and deposit instructions. \" +\n \"The wallet is used to automatically pay for x402 API calls.\",\n {},\n async () => {\n if (!wallet) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({\n error: \"No wallet configured\",\n tip: \"Set DEXTER_PRIVATE_KEY env var or run `npx @dexterai/mcp wallet` to create one.\",\n }, null, 2),\n },\n ],\n };\n }\n\n try {\n const balance = await getSolanaBalance(wallet.info.solanaAddress);\n const data = {\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n networkName: \"Solana Mainnet\",\n balances: { sol: balance.sol, usdc: balance.usdc },\n walletFile: WALLET_FILE,\n tip: balance.usdc === 0\n ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.`\n : undefined,\n };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data,\n _meta: WALLET_META,\n } as any;\n } catch (err: any) {\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify({ error: err.message }) },\n ],\n isError: true,\n };\n }\n },\n );\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { VERSION } from \"../config.js\";\nimport { registerSearchTool } from \"../tools/search.js\";\nimport { registerFetchTool } from \"../tools/fetch.js\";\nimport { registerCheckTool } from \"../tools/check.js\";\nimport { registerWalletTool } from \"../tools/wallet-tool.js\";\nimport { loadOrCreateWallet } from \"../wallet/index.js\";\n\nexport interface ServerOptions {\n transport: \"stdio\" | \"http\";\n dev: boolean;\n}\n\nexport async function startServer(opts: ServerOptions): Promise<void> {\n let wallet;\n try {\n wallet = await loadOrCreateWallet();\n } catch (err: any) {\n console.error(`[dexter-mcp] Wallet initialization failed: ${err.message}`);\n console.error(\"[dexter-mcp] Starting in search-only mode. Set DEXTER_PRIVATE_KEY or fix ~/.dexterai-mcp/wallet.json to enable payments.\");\n wallet = null;\n }\n\n const server = new McpServer({\n name: \"Dexter x402 Gateway\",\n version: VERSION,\n });\n\n registerSearchTool(server, opts);\n registerFetchTool(server, wallet, opts);\n registerCheckTool(server, opts);\n registerWalletTool(server, wallet, opts);\n\n if (opts.transport !== \"stdio\") {\n console.error(\"HTTP transport not yet implemented. Use --transport=stdio\");\n process.exit(1);\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n const shutdown = async () => {\n await server.close();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport type ClientId =\n | \"cursor\"\n | \"claude-code\"\n | \"codex\"\n | \"vscode\"\n | \"windsurf\"\n | \"gemini-cli\";\n\ninterface ClientMeta {\n name: string;\n description: string;\n}\n\nexport const CLIENTS: Record<ClientId, ClientMeta> = {\n cursor: {\n name: \"Cursor\",\n description: \"Cursor AI code editor\",\n },\n \"claude-code\": {\n name: \"Claude Code\",\n description: \"Anthropic Claude Code CLI\",\n },\n codex: {\n name: \"Codex\",\n description: \"OpenAI Codex CLI\",\n },\n vscode: {\n name: \"VS Code\",\n description: \"Visual Studio Code with MCP support\",\n },\n windsurf: {\n name: \"Windsurf\",\n description: \"Codeium Windsurf editor\",\n },\n \"gemini-cli\": {\n name: \"Gemini CLI\",\n description: \"Google Gemini CLI\",\n },\n};\n\ninterface ClientConfig {\n configPath: string;\n sectionKey: string;\n entry: Record<string, unknown>;\n manual?: boolean;\n}\n\nconst SERVER_CMD = {\n command: \"npx\",\n args: [\"-y\", \"@dexterai/mcp@latest\"],\n};\n\nconst SERVER_CMD_DEV = {\n command: \"node\",\n args: [process.cwd() + \"/dist/index.js\", \"--dev\"],\n};\n\nfunction getConfigDir(): string {\n const platform = process.platform;\n if (platform === \"win32\") {\n return process.env.APPDATA || join(homedir(), \"AppData\", \"Roaming\");\n }\n if (platform === \"darwin\") {\n return join(homedir(), \"Library\", \"Application Support\");\n }\n return process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n}\n\nexport function getClientConfig(client: ClientId, dev: boolean): ClientConfig {\n const cmd = dev ? SERVER_CMD_DEV : SERVER_CMD;\n\n switch (client) {\n case \"cursor\":\n return {\n configPath: join(homedir(), \".cursor\", \"mcp.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"claude-code\":\n return {\n configPath: join(homedir(), \".claude.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"codex\": {\n const codexHome = process.env.CODEX_HOME || join(homedir(), \".codex\");\n return {\n configPath: join(codexHome, \"config.toml\"),\n sectionKey: \"mcp_servers\",\n entry: cmd,\n manual: true, // TOML requires different handling\n };\n }\n\n case \"vscode\": {\n const configDir = getConfigDir();\n const vscodeDirs = [\"Code\", \"Code - Insiders\"];\n const dir = vscodeDirs.find((d) => existsSync(join(configDir, d))) || \"Code\";\n return {\n configPath: join(configDir, dir, \"User\", \"mcp.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n }\n\n case \"windsurf\":\n return {\n configPath: join(homedir(), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"gemini-cli\":\n return {\n configPath: join(homedir(), \".gemini\", \"settings.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { loadOrCreateWallet } from \"../../wallet/index.js\";\nimport { getClientConfig, CLIENTS, type ClientId } from \"./clients.js\";\n\ninterface InstallOpts {\n client?: string;\n yes: boolean;\n dev: boolean;\n}\n\nexport async function runInstall(opts: InstallOpts): Promise<void> {\n // Step 1: ensure wallet exists\n console.log(\"Setting up wallet...\");\n const wallet = await loadOrCreateWallet();\n if (!wallet) {\n console.error(\"Failed to create wallet. Exiting.\");\n process.exit(1);\n }\n console.log(`Wallet: ${wallet.info.solanaAddress}\\n`);\n\n // Step 2: pick client\n let clientId = opts.client as ClientId | undefined;\n\n if (!clientId) {\n if (opts.yes) {\n console.error(\"--client is required when using --yes\");\n process.exit(1);\n }\n\n console.log(\"Select an AI client to install into:\\n\");\n const ids = Object.keys(CLIENTS) as ClientId[];\n ids.forEach((id, i) => console.log(` ${i + 1}. ${CLIENTS[id].name}`));\n console.log();\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(\"Choice (number): \", resolve);\n });\n rl.close();\n\n const idx = parseInt(answer, 10) - 1;\n if (idx < 0 || idx >= ids.length) {\n console.error(\"Invalid choice.\");\n process.exit(1);\n }\n clientId = ids[idx];\n }\n\n if (!CLIENTS[clientId]) {\n console.error(`Unknown client: ${clientId}`);\n console.error(`Available: ${Object.keys(CLIENTS).join(\", \")}`);\n process.exit(1);\n }\n\n // Step 3: write config\n const config = getClientConfig(clientId, opts.dev);\n\n if (config.manual) {\n console.log(`\\n${CLIENTS[clientId].name} requires manual configuration.\\n`);\n console.log(\"Add this to your MCP config:\\n\");\n console.log(JSON.stringify(config.entry, null, 2));\n console.log(`\\nConfig file: ${config.configPath}`);\n return;\n }\n\n console.log(`\\nInstalling into ${CLIENTS[clientId].name}...`);\n\n mkdirSync(dirname(config.configPath), { recursive: true });\n\n let existing: Record<string, unknown> = {};\n if (existsSync(config.configPath)) {\n const raw = readFileSync(config.configPath, \"utf-8\");\n try {\n existing = JSON.parse(raw);\n } catch {\n console.error(`Warning: ${config.configPath} contains invalid JSON. Backing up and creating fresh.`);\n copyFileSync(config.configPath, config.configPath + \".bak\");\n existing = {};\n }\n // Back up valid configs too\n if (Object.keys(existing).length > 0) {\n copyFileSync(config.configPath, config.configPath + \".bak\");\n }\n }\n\n const section = (existing[config.sectionKey] as Record<string, unknown>) || {};\n section[\"dexter-x402\"] = config.entry;\n existing[config.sectionKey] = section;\n\n writeFileSync(config.configPath, JSON.stringify(existing, null, 2) + \"\\n\");\n\n console.log(`Written to ${config.configPath}`);\n console.log(`\\nDexter x402 Gateway installed for ${CLIENTS[clientId].name}.`);\n console.log(`Wallet: ${wallet.info.solanaAddress}`);\n console.log(`\\nDeposit USDC (Solana) to start paying for x402 APIs.`);\n}\n","import yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\n\nasync function main() {\n await yargs(hideBin(process.argv))\n .scriptName(\"@dexterai/mcp\")\n .usage(\"$0 [command] [options]\")\n .option(\"dev\", {\n type: \"boolean\",\n description: \"Use localhost endpoints instead of production\",\n default: false,\n })\n .command(\n [\"$0\", \"server\"],\n \"Start the MCP server (default)\",\n (y) =>\n y.option(\"transport\", {\n choices: [\"stdio\", \"http\"] as const,\n default: \"stdio\" as const,\n description: \"Transport mode\",\n }),\n async (args) => {\n const { startServer } = await import(\"./server/index.js\");\n await startServer({\n transport: args.transport,\n dev: args.dev,\n });\n },\n )\n .command(\n \"install\",\n \"Install Dexter MCP into an AI client (Cursor, Claude, Codex, etc.)\",\n (y) =>\n y\n .option(\"client\", {\n type: \"string\",\n description: \"Client to install into\",\n })\n .option(\"yes\", {\n alias: \"y\",\n type: \"boolean\",\n description: \"Skip prompts\",\n default: false,\n }),\n async (args) => {\n const { runInstall } = await import(\"./cli/install/index.js\");\n await runInstall({ client: args.client, yes: args.yes, dev: args.dev });\n },\n )\n .command(\n \"wallet\",\n \"Show wallet address and balances\",\n () => {},\n async (args) => {\n const { showWalletInfo } = await import(\"./wallet/index.js\");\n await showWalletInfo({ dev: args.dev });\n },\n )\n .command(\n \"search <query>\",\n \"Search the Dexter x402 marketplace\",\n (y) =>\n y.positional(\"query\", { type: \"string\", demandOption: true }),\n async (args) => {\n const { cliSearch } = await import(\"./tools/search.js\");\n await cliSearch(args.query!, { dev: args.dev });\n },\n )\n .command(\n \"fetch <url>\",\n \"Fetch an x402-protected resource with automatic payment\",\n (y) =>\n y\n .positional(\"url\", { type: \"string\", demandOption: true })\n .option(\"method\", {\n choices: [\"GET\", \"POST\", \"PUT\", \"DELETE\"] as const,\n default: \"GET\" as const,\n })\n .option(\"body\", { type: \"string\", description: \"JSON request body\" }),\n async (args) => {\n const { cliFetch } = await import(\"./tools/fetch.js\");\n await cliFetch(args.url!, {\n method: args.method,\n body: args.body,\n dev: args.dev,\n });\n },\n )\n .strict()\n .help()\n .parseAsync();\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n"],"mappings":"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","names":["readFileSync","keypair","z","loadOrCreateWallet","z","homedir","join","existsSync","existsSync","readFileSync","writeFileSync","mkdirSync","copyFileSync","startServer","runInstall","showWalletInfo","cliSearch","cliFetch"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/widget-meta.ts","../src/tools/search.ts","../src/wallet/index.ts","../src/tools/fetch.ts","../src/tools/check.ts","../src/tools/wallet-tool.ts","../src/server/index.ts","../src/cli/install/clients.ts","../src/cli/install/index.ts","../src/index.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname as pathDirname } from \"node:path\";\n\nexport const DATA_DIR = join(homedir(), \".dexterai-mcp\");\nexport const WALLET_FILE = join(DATA_DIR, \"wallet.json\");\n\nexport const DEXTER_API_PROD = process.env.DEXTER_API_URL || \"https://x402.dexter.cash\";\nexport const DEXTER_API_DEV = \"http://127.0.0.1:3030\";\nexport const SOLANA_RPC_URL = process.env.SOLANA_RPC_URL || \"https://api.dexter.cash/api/solana/rpc\";\n\nexport const MARKETPLACE_PATH = \"/api/facilitator/marketplace/resources\";\n\nexport function getApiBase(dev: boolean): string {\n return dev ? DEXTER_API_DEV : DEXTER_API_PROD;\n}\n\nfunction loadVersion(): string {\n try {\n const here = pathDirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(join(here, \"..\", \"package.json\"), \"utf-8\"));\n return pkg.version || \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const VERSION = loadVersion();\n","const WIDGET_DOMAIN = \"https://dexter.cash\";\n\nconst WIDGET_CSP = {\n resource_domains: [\n \"https://cdn.dexscreener.com\",\n \"https://raw.githubusercontent.com\",\n \"https://metadata.jup.ag\",\n ],\n};\n\nexport function widgetMeta(templateUri: string, invoking: string, invoked: string, description: string) {\n return {\n \"openai/outputTemplate\": templateUri,\n \"openai/resultCanProduceWidget\": true,\n \"openai/widgetAccessible\": true,\n \"openai/widgetDomain\": WIDGET_DOMAIN,\n \"openai/widgetPrefersBorder\": true,\n \"openai/widgetCSP\": WIDGET_CSP,\n \"openai/toolInvocation/invoking\": invoking,\n \"openai/toolInvocation/invoked\": invoked,\n \"openai/widgetDescription\": description,\n };\n}\n\nexport const SEARCH_META = widgetMeta(\n \"ui://dexter/x402-marketplace-search\",\n \"Searching marketplace\\u2026\",\n \"Results ready\",\n \"Shows paid API search results as interactive cards with quality rings, prices, and fetch buttons.\",\n);\n\nexport const FETCH_META = widgetMeta(\n \"ui://dexter/x402-fetch-result\",\n \"Calling API\\u2026\",\n \"Response received\",\n \"Shows API response data with payment receipt, transaction link, and settlement status.\",\n);\n\nexport const CHECK_META = widgetMeta(\n \"ui://dexter/x402-pricing\",\n \"Checking pricing\\u2026\",\n \"Pricing loaded\",\n \"Shows endpoint pricing per blockchain with payment amounts and a pay button.\",\n);\n\nexport const WALLET_META = widgetMeta(\n \"ui://dexter/x402-wallet\",\n \"Loading wallet\\u2026\",\n \"Wallet loaded\",\n \"Shows wallet address with copy button, USDC/SOL balances, and deposit QR code.\",\n);\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getApiBase, MARKETPLACE_PATH } from \"../config.js\";\nimport { SEARCH_META } from \"../widget-meta.js\";\n\ninterface SearchOpts {\n dev: boolean;\n}\n\ninterface MarketplaceResource {\n resourceUrl: string;\n displayName?: string;\n description?: string | null;\n method?: string;\n priceUsdc?: number | null;\n priceLabel?: string | null;\n priceNetwork?: string | null;\n qualityScore?: number | null;\n verificationStatus?: string | null;\n totalSettlements?: number;\n totalVolumeUsdc?: number;\n category?: string | null;\n seller?: { displayName?: string | null };\n reputationScore?: number | null;\n authRequired?: boolean;\n authType?: string | null;\n authHint?: string | null;\n}\n\nfunction formatResource(r: MarketplaceResource) {\n return {\n name: r.displayName || r.resourceUrl,\n url: r.resourceUrl,\n method: r.method || \"GET\",\n price: r.priceLabel || (r.priceUsdc != null ? `$${r.priceUsdc.toFixed(2)}` : \"free\"),\n network: r.priceNetwork || null,\n description: r.description || \"\",\n category: r.category || \"uncategorized\",\n qualityScore: r.qualityScore ?? null,\n verified: r.verificationStatus === \"pass\",\n totalCalls: r.totalSettlements ?? 0,\n seller: r.seller?.displayName || null,\n sellerReputation: r.reputationScore ?? null,\n authRequired: Boolean(r.authRequired),\n authType: r.authType ?? null,\n authHint: r.authHint ?? null,\n };\n}\n\nasync function searchMarketplace(\n params: {\n query?: string;\n category?: string;\n network?: string;\n maxPriceUsdc?: number;\n verifiedOnly?: boolean;\n sort?: string;\n limit?: number;\n },\n opts: SearchOpts,\n) {\n const qs = new URLSearchParams();\n if (params.query) qs.set(\"search\", params.query);\n if (params.category) qs.set(\"category\", params.category);\n if (params.network) qs.set(\"network\", params.network);\n if (params.maxPriceUsdc != null) qs.set(\"maxPrice\", String(params.maxPriceUsdc));\n if (params.verifiedOnly) qs.set(\"verified\", \"true\");\n qs.set(\"sort\", params.sort || \"marketplace\");\n qs.set(\"limit\", String(Math.min(params.limit || 20, 50)));\n\n const url = `${getApiBase(opts.dev)}${MARKETPLACE_PATH}?${qs}`;\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!res.ok) {\n throw new Error(`Marketplace returned ${res.status}: ${await res.text().catch(() => \"\")}`);\n }\n\n const data = await res.json() as { resources?: MarketplaceResource[] };\n return {\n resources: (data.resources || []).map(formatResource),\n total: data.resources?.length || 0,\n };\n}\n\nexport function registerSearchTool(server: McpServer, opts: SearchOpts): void {\n server.tool(\n \"x402_search\",\n \"Search the Dexter x402 marketplace for paid API resources. \" +\n \"Returns services with pricing, quality scores, and verification status. \" +\n \"Use this to discover APIs an agent can pay for and call with x402_fetch.\",\n {\n query: z.string().optional().describe(\"Search term, e.g. 'token analysis', 'image generation'\"),\n category: z.string().optional().describe(\"Filter by category\"),\n network: z.string().optional().describe(\"Filter by payment network: 'solana', 'base', 'polygon'\"),\n maxPriceUsdc: z.number().optional().describe(\"Maximum price per call in USDC\"),\n verifiedOnly: z.boolean().optional().describe(\"Only return verified endpoints\"),\n sort: z\n .enum([\"relevance\", \"quality_score\", \"settlements\", \"volume\", \"recent\", \"marketplace\"])\n .optional()\n .describe(\"Sort order (default: marketplace)\"),\n limit: z.number().optional().default(20).describe(\"Max results (1-50)\"),\n },\n async (args) => {\n try {\n const result = await searchMarketplace(args, opts);\n const data = {\n success: true,\n count: result.total,\n resources: result.resources,\n tip: \"Use x402_fetch to call any of these endpoints.\",\n };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data,\n _meta: SEARCH_META,\n } as any;\n } catch (err: any) {\n const payload = { error: err.message || \"search_failed\", success: false, count: 0, resources: [] };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(payload, null, 2) }],\n structuredContent: payload,\n _meta: SEARCH_META,\n isError: true,\n } as any;\n }\n },\n );\n}\n\nexport async function cliSearch(query: string, opts: { dev: boolean }): Promise<void> {\n try {\n const result = await searchMarketplace({ query }, opts);\n console.log(JSON.stringify({ success: true, count: result.total, resources: result.resources }, null, 2));\n } catch (err: any) {\n console.log(JSON.stringify({ error: err.message || String(err) }, null, 2));\n process.exit(1);\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { Keypair, Connection, PublicKey } from \"@solana/web3.js\";\nimport { getAssociatedTokenAddress } from \"@solana/spl-token\";\nimport bs58 from \"bs58\";\nimport { DATA_DIR, WALLET_FILE, SOLANA_RPC_URL } from \"../config.js\";\n\nexport interface WalletInfo {\n solanaPrivateKey: string;\n solanaAddress: string;\n evmPrivateKey?: string;\n evmAddress?: string;\n createdAt: string;\n}\n\nexport interface LoadedWallet {\n info: WalletInfo;\n solanaKeypair: Keypair;\n}\n\nconst USDC_MINT = new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\n\nexport async function loadOrCreateWallet(): Promise<LoadedWallet | null> {\n // Env var override takes priority\n const envKey = process.env.DEXTER_PRIVATE_KEY || process.env.SOLANA_PRIVATE_KEY;\n if (envKey) {\n const keypair = keypairFromString(envKey);\n return {\n info: {\n solanaPrivateKey: bs58.encode(keypair.secretKey),\n solanaAddress: keypair.publicKey.toBase58(),\n createdAt: new Date().toISOString(),\n },\n solanaKeypair: keypair,\n };\n }\n\n if (existsSync(WALLET_FILE)) {\n try {\n const raw = readFileSync(WALLET_FILE, \"utf-8\");\n const data = JSON.parse(raw) as WalletInfo;\n if (!data.solanaPrivateKey) throw new Error(\"Missing solanaPrivateKey\");\n const keypair = keypairFromString(data.solanaPrivateKey);\n if (keypair.secretKey.length !== 64) throw new Error(\"Invalid key length\");\n return { info: data, solanaKeypair: keypair };\n } catch (err: any) {\n console.error(`[dexter-mcp] Corrupted wallet file: ${err.message}`);\n console.error(`[dexter-mcp] Backing up to ${WALLET_FILE}.bak and creating fresh wallet.`);\n try { copyFileSync(WALLET_FILE, WALLET_FILE + \".bak\"); } catch {}\n }\n }\n\n // Generate new wallet\n const keypair = Keypair.generate();\n const info: WalletInfo = {\n solanaPrivateKey: bs58.encode(keypair.secretKey),\n solanaAddress: keypair.publicKey.toBase58(),\n createdAt: new Date().toISOString(),\n };\n\n mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(WALLET_FILE, JSON.stringify(info, null, 2), { mode: 0o600 });\n\n console.error(`[dexter-mcp] New wallet created: ${info.solanaAddress}`);\n console.error(`[dexter-mcp] Saved to ${WALLET_FILE}`);\n console.error(`[dexter-mcp] Deposit USDC (Solana) to this address to start paying for x402 APIs.`);\n\n return { info, solanaKeypair: keypair };\n}\n\nfunction keypairFromString(key: string): Keypair {\n try {\n // Try base58\n return Keypair.fromSecretKey(bs58.decode(key));\n } catch {\n // Try JSON array\n try {\n const arr = JSON.parse(key);\n if (Array.isArray(arr)) {\n return Keypair.fromSecretKey(Uint8Array.from(arr));\n }\n } catch {}\n throw new Error(\"Invalid private key format. Expected base58 string or JSON byte array.\");\n }\n}\n\nexport async function getSolanaBalance(\n address: string,\n rpcUrl?: string,\n): Promise<{ sol: number; usdc: number }> {\n try {\n const connection = new Connection(rpcUrl || SOLANA_RPC_URL, \"confirmed\");\n const pubkey = new PublicKey(address);\n\n const [solBalance, usdcBalance] = await Promise.all([\n connection.getBalance(pubkey).catch(() => 0),\n getUsdcBalance(connection, pubkey),\n ]);\n\n return { sol: solBalance / 1e9, usdc: usdcBalance };\n } catch (err: any) {\n console.error(`[dexter-mcp] RPC error fetching balance: ${err.message}`);\n return { sol: 0, usdc: 0 };\n }\n}\n\nasync function getUsdcBalance(connection: Connection, owner: PublicKey): Promise<number> {\n try {\n const ata = await getAssociatedTokenAddress(USDC_MINT, owner);\n const info = await connection.getTokenAccountBalance(ata);\n return Number(info.value.uiAmount ?? 0);\n } catch {\n return 0;\n }\n}\n\nexport async function showWalletInfo(opts: { dev: boolean }): Promise<void> {\n const wallet = await loadOrCreateWallet();\n if (!wallet) {\n console.log(JSON.stringify({ error: \"Failed to load wallet\" }));\n process.exit(1);\n }\n\n const balance = await getSolanaBalance(wallet.info.solanaAddress);\n\n console.log(JSON.stringify({\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n balances: {\n sol: balance.sol,\n usdc: balance.usdc,\n },\n walletFile: WALLET_FILE,\n tip: balance.usdc === 0\n ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.`\n : undefined,\n }, null, 2));\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { LoadedWallet } from \"../wallet/index.js\";\nimport { getApiBase } from \"../config.js\";\nimport { FETCH_META } from \"../widget-meta.js\";\n\ninterface FetchOpts {\n dev: boolean;\n}\n\nasync function parseResponse(res: Response): Promise<unknown> {\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"json\")) {\n try { return await res.json(); } catch { return await res.text(); }\n }\n return await res.text();\n}\n\nfunction extractSettlement(res: Response): unknown {\n const header = res.headers.get(\"payment-response\") || res.headers.get(\"PAYMENT-RESPONSE\");\n if (!header) return null;\n try { return JSON.parse(atob(header)); } catch {\n try { return JSON.parse(header); } catch { return null; }\n }\n}\n\nfunction parse402(body: unknown): { requirements: Record<string, unknown> | null; firstAccept: Record<string, unknown> | null } {\n const obj = body as Record<string, unknown> | null;\n if (!obj?.accepts || !Array.isArray(obj.accepts)) return { requirements: null, firstAccept: null };\n return {\n requirements: { accepts: obj.accepts, x402Version: obj.x402Version ?? 2, resource: obj.resource },\n firstAccept: obj.accepts[0] as Record<string, unknown> || null,\n };\n}\n\nasync function x402Fetch(\n params: { url: string; method: string; body?: string; headers?: Record<string, string> },\n wallet: LoadedWallet | null,\n opts: FetchOpts,\n): Promise<Record<string, unknown>> {\n const requestHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(params.headers || {}),\n };\n const fetchOpts: RequestInit = {\n method: params.method || \"GET\",\n headers: requestHeaders,\n };\n if (params.body && params.method !== \"GET\") {\n fetchOpts.body = params.body;\n }\n\n const probeRes = await fetch(params.url, { ...fetchOpts, signal: AbortSignal.timeout(15_000) });\n\n if (probeRes.status !== 402) {\n return { status: probeRes.status, data: await parseResponse(probeRes) };\n }\n\n let body402: unknown = null;\n try { body402 = await probeRes.json(); } catch {\n try { body402 = await probeRes.text(); } catch {}\n }\n\n const { requirements, firstAccept } = parse402(body402);\n\n // Mode 1: Local wallet auto-pay\n if (wallet) {\n try {\n const { wrapFetch } = await import(\"@dexterai/x402/client\");\n const x402FetchFn = wrapFetch(fetch, {\n walletPrivateKey: wallet.info.solanaPrivateKey,\n });\n\n const paidRes = await x402FetchFn(params.url, fetchOpts);\n const data = await parseResponse(paidRes);\n const settlement = extractSettlement(paidRes);\n\n return {\n status: paidRes.status,\n data,\n payment: settlement ? { settled: true, details: settlement } : { settled: false },\n };\n } catch (err: any) {\n return { status: 402, error: `Payment failed: ${err.message}`, requirements };\n }\n }\n\n // No local signing wallet: return canonical x402 requirements only.\n // Clients must settle using x402 payment-signature flow and retry.\n return {\n status: 402,\n message: \"Payment required. Configure DEXTER_PRIVATE_KEY for canonical x402 settlement or provide payment-signature manually.\",\n requirements,\n };\n}\n\nexport function registerFetchTool(\n server: McpServer,\n wallet: LoadedWallet | null,\n opts: FetchOpts,\n): void {\n const hasWallet = wallet !== null;\n\n server.tool(\n \"x402_fetch\",\n hasWallet\n ? \"Call any x402-protected API with automatic payment. \" +\n \"Signs and pays using your local wallet. Returns the API response directly.\"\n : \"Call any x402-protected API. Returns payment requirements. \" +\n \"Configure DEXTER_PRIVATE_KEY to enable automatic payment.\",\n {\n url: z.string().url().describe(\"The x402 resource URL to call\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\"])\n .default(\"GET\")\n .describe(\"HTTP method\"),\n body: z.string().optional().describe(\"JSON request body for POST/PUT\"),\n },\n async (args) => {\n try {\n const result = await x402Fetch(\n { url: args.url, method: args.method, body: args.body },\n wallet,\n opts,\n );\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n _meta: FETCH_META,\n } as any;\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n\nexport async function cliFetch(\n url: string,\n opts: { method: string; body?: string; dev: boolean },\n): Promise<void> {\n try {\n const { loadOrCreateWallet } = await import(\"../wallet/index.js\");\n const wallet = await loadOrCreateWallet();\n const result = await x402Fetch(\n { url, method: opts.method, body: opts.body },\n wallet,\n opts,\n );\n console.log(JSON.stringify(result, null, 2));\n } catch (err: any) {\n const msg = err.cause?.code === \"ENOTFOUND\"\n ? `Could not reach ${url} — DNS lookup failed`\n : err.name === \"TimeoutError\"\n ? `Request to ${url} timed out`\n : err.message || String(err);\n console.log(JSON.stringify({ error: msg }, null, 2));\n process.exit(1);\n }\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { CHECK_META } from \"../widget-meta.js\";\n\ninterface CheckOpts {\n dev: boolean;\n}\n\nfunction parsePaymentRequiredHeader(headerValue: string | null): Record<string, unknown> | null {\n if (!headerValue) return null;\n const candidates = [headerValue];\n try { candidates.push(Buffer.from(headerValue, \"base64\").toString(\"utf-8\")); } catch {}\n try {\n const normalized = headerValue.replace(/-/g, \"+\").replace(/_/g, \"/\");\n candidates.push(Buffer.from(normalized, \"base64\").toString(\"utf-8\"));\n } catch {}\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate);\n if (parsed && typeof parsed === \"object\") {\n return parsed as Record<string, unknown>;\n }\n } catch {}\n }\n return null;\n}\n\nasync function checkEndpoint(url: string, method: string): Promise<Record<string, unknown>> {\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: method !== \"GET\" ? \"{}\" : undefined,\n signal: AbortSignal.timeout(15_000),\n });\n\n if (res.status !== 402) {\n if (res.status === 401 || res.status === 403) {\n const bodyText = await res.text().catch(() => \"\");\n return {\n error: true,\n statusCode: res.status,\n authRequired: true,\n message: bodyText || \"Provider authentication required before x402 payment flow.\",\n };\n }\n if (res.status >= 500) {\n return { error: true, statusCode: res.status, message: \"Server error\" };\n }\n if (res.status >= 400) {\n return { error: true, statusCode: res.status, message: `Client error: ${res.status}` };\n }\n return { requiresPayment: false, statusCode: res.status, free: true };\n }\n\n let body: Record<string, unknown> | null = null;\n try {\n body = await res.json() as Record<string, unknown>;\n } catch {}\n\n const headerParsed = parsePaymentRequiredHeader(\n res.headers.get(\"PAYMENT-REQUIRED\") || res.headers.get(\"payment-required\"),\n );\n const source = (headerParsed && typeof headerParsed === \"object\") ? headerParsed : body;\n const accepts = body?.accepts as Array<Record<string, unknown>> | undefined;\n const acceptsFromHeader = source?.accepts as Array<Record<string, unknown>> | undefined;\n const effectiveAccepts = accepts?.length ? accepts : acceptsFromHeader;\n if (!effectiveAccepts?.length) {\n return {\n requiresPayment: true,\n statusCode: 402,\n error: \"No payment options found in 402 response\",\n };\n }\n\n const paymentOptions = effectiveAccepts.map((a) => {\n const amount = Number(a.amount || a.maxAmountRequired || 0);\n const decimals = Number(a.extra && typeof a.extra === \"object\" && \"decimals\" in a.extra\n ? (a.extra as Record<string, unknown>).decimals\n : 6);\n return {\n price: amount / Math.pow(10, decimals),\n priceFormatted: `$${(amount / Math.pow(10, decimals)).toFixed(decimals > 2 ? 4 : 2)}`,\n network: a.network,\n scheme: a.scheme,\n asset: a.asset,\n payTo: a.payTo,\n };\n });\n\n return {\n requiresPayment: true,\n statusCode: 402,\n x402Version: source?.x402Version ?? 2,\n paymentOptions,\n resource: source?.resource,\n };\n}\n\nexport function registerCheckTool(server: McpServer, opts: CheckOpts): void {\n server.tool(\n \"x402_check\",\n \"Check if an endpoint requires x402 payment and see its pricing. \" +\n \"Does NOT make a payment — just probes for requirements.\",\n {\n url: z.string().url().describe(\"The URL to check\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\"])\n .default(\"GET\")\n .describe(\"HTTP method to probe with\"),\n },\n async (args) => {\n try {\n const result = await checkEndpoint(args.url, args.method);\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n _meta: CHECK_META,\n } as any;\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { LoadedWallet } from \"../wallet/index.js\";\nimport { getSolanaBalance } from \"../wallet/index.js\";\nimport { WALLET_FILE } from \"../config.js\";\nimport { WALLET_META } from \"../widget-meta.js\";\n\ninterface WalletToolOpts {\n dev: boolean;\n}\n\nexport function registerWalletTool(\n server: McpServer,\n wallet: LoadedWallet | null,\n opts: WalletToolOpts,\n): void {\n server.tool(\n \"x402_wallet\",\n \"Show wallet address, USDC balance, and deposit instructions. \" +\n \"The wallet is used to automatically pay for x402 API calls.\",\n {},\n async () => {\n if (!wallet) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({\n error: \"No wallet configured\",\n tip: \"Set DEXTER_PRIVATE_KEY env var or run `npx @dexterai/mcp wallet` to create one.\",\n }, null, 2),\n },\n ],\n };\n }\n\n try {\n const balance = await getSolanaBalance(wallet.info.solanaAddress);\n const data = {\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n networkName: \"Solana Mainnet\",\n balances: { sol: balance.sol, usdc: balance.usdc },\n walletFile: WALLET_FILE,\n tip: balance.usdc === 0\n ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.`\n : undefined,\n };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data,\n _meta: WALLET_META,\n } as any;\n } catch (err: any) {\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify({ error: err.message }) },\n ],\n isError: true,\n };\n }\n },\n );\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { VERSION } from \"../config.js\";\nimport { registerSearchTool } from \"../tools/search.js\";\nimport { registerFetchTool } from \"../tools/fetch.js\";\nimport { registerCheckTool } from \"../tools/check.js\";\nimport { registerWalletTool } from \"../tools/wallet-tool.js\";\nimport { loadOrCreateWallet } from \"../wallet/index.js\";\n\nexport interface ServerOptions {\n transport: \"stdio\" | \"http\";\n dev: boolean;\n}\n\nexport async function startServer(opts: ServerOptions): Promise<void> {\n let wallet;\n try {\n wallet = await loadOrCreateWallet();\n } catch (err: any) {\n console.error(`[dexter-mcp] Wallet initialization failed: ${err.message}`);\n console.error(\"[dexter-mcp] Starting in search-only mode. Set DEXTER_PRIVATE_KEY or fix ~/.dexterai-mcp/wallet.json to enable payments.\");\n wallet = null;\n }\n\n const server = new McpServer({\n name: \"Dexter x402 Gateway\",\n version: VERSION,\n });\n\n registerSearchTool(server, opts);\n registerFetchTool(server, wallet, opts);\n registerCheckTool(server, opts);\n registerWalletTool(server, wallet, opts);\n\n if (opts.transport !== \"stdio\") {\n console.error(\"HTTP transport not yet implemented. Use --transport=stdio\");\n process.exit(1);\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n const shutdown = async () => {\n await server.close();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport type ClientId =\n | \"cursor\"\n | \"claude-code\"\n | \"codex\"\n | \"vscode\"\n | \"windsurf\"\n | \"gemini-cli\";\n\ninterface ClientMeta {\n name: string;\n description: string;\n}\n\nexport const CLIENTS: Record<ClientId, ClientMeta> = {\n cursor: {\n name: \"Cursor\",\n description: \"Cursor AI code editor\",\n },\n \"claude-code\": {\n name: \"Claude Code\",\n description: \"Anthropic Claude Code CLI\",\n },\n codex: {\n name: \"Codex\",\n description: \"OpenAI Codex CLI\",\n },\n vscode: {\n name: \"VS Code\",\n description: \"Visual Studio Code with MCP support\",\n },\n windsurf: {\n name: \"Windsurf\",\n description: \"Codeium Windsurf editor\",\n },\n \"gemini-cli\": {\n name: \"Gemini CLI\",\n description: \"Google Gemini CLI\",\n },\n};\n\ninterface ClientConfig {\n configPath: string;\n sectionKey: string;\n entry: Record<string, unknown>;\n manual?: boolean;\n}\n\nconst SERVER_CMD = {\n command: \"npx\",\n args: [\"-y\", \"@dexterai/mcp@latest\"],\n};\n\nconst SERVER_CMD_DEV = {\n command: \"node\",\n args: [process.cwd() + \"/dist/index.js\", \"--dev\"],\n};\n\nfunction getConfigDir(): string {\n const platform = process.platform;\n if (platform === \"win32\") {\n return process.env.APPDATA || join(homedir(), \"AppData\", \"Roaming\");\n }\n if (platform === \"darwin\") {\n return join(homedir(), \"Library\", \"Application Support\");\n }\n return process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n}\n\nexport function getClientConfig(client: ClientId, dev: boolean): ClientConfig {\n const cmd = dev ? SERVER_CMD_DEV : SERVER_CMD;\n\n switch (client) {\n case \"cursor\":\n return {\n configPath: join(homedir(), \".cursor\", \"mcp.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"claude-code\":\n return {\n configPath: join(homedir(), \".claude.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"codex\": {\n const codexHome = process.env.CODEX_HOME || join(homedir(), \".codex\");\n return {\n configPath: join(codexHome, \"config.toml\"),\n sectionKey: \"mcp_servers\",\n entry: cmd,\n manual: true, // TOML requires different handling\n };\n }\n\n case \"vscode\": {\n const configDir = getConfigDir();\n const vscodeDirs = [\"Code\", \"Code - Insiders\"];\n const dir = vscodeDirs.find((d) => existsSync(join(configDir, d))) || \"Code\";\n return {\n configPath: join(configDir, dir, \"User\", \"mcp.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n }\n\n case \"windsurf\":\n return {\n configPath: join(homedir(), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"gemini-cli\":\n return {\n configPath: join(homedir(), \".gemini\", \"settings.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { loadOrCreateWallet } from \"../../wallet/index.js\";\nimport { getClientConfig, CLIENTS, type ClientId } from \"./clients.js\";\n\ninterface InstallOpts {\n client?: string;\n yes: boolean;\n dev: boolean;\n}\n\nexport async function runInstall(opts: InstallOpts): Promise<void> {\n // Step 1: ensure wallet exists\n console.log(\"Setting up wallet...\");\n const wallet = await loadOrCreateWallet();\n if (!wallet) {\n console.error(\"Failed to create wallet. Exiting.\");\n process.exit(1);\n }\n console.log(`Wallet: ${wallet.info.solanaAddress}\\n`);\n\n // Step 2: pick client\n let clientId = opts.client as ClientId | undefined;\n\n if (!clientId) {\n if (opts.yes) {\n console.error(\"--client is required when using --yes\");\n process.exit(1);\n }\n\n console.log(\"Select an AI client to install into:\\n\");\n const ids = Object.keys(CLIENTS) as ClientId[];\n ids.forEach((id, i) => console.log(` ${i + 1}. ${CLIENTS[id].name}`));\n console.log();\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(\"Choice (number): \", resolve);\n });\n rl.close();\n\n const idx = parseInt(answer, 10) - 1;\n if (idx < 0 || idx >= ids.length) {\n console.error(\"Invalid choice.\");\n process.exit(1);\n }\n clientId = ids[idx];\n }\n\n if (!CLIENTS[clientId]) {\n console.error(`Unknown client: ${clientId}`);\n console.error(`Available: ${Object.keys(CLIENTS).join(\", \")}`);\n process.exit(1);\n }\n\n // Step 3: write config\n const config = getClientConfig(clientId, opts.dev);\n\n if (config.manual) {\n console.log(`\\n${CLIENTS[clientId].name} requires manual configuration.\\n`);\n console.log(\"Add this to your MCP config:\\n\");\n console.log(JSON.stringify(config.entry, null, 2));\n console.log(`\\nConfig file: ${config.configPath}`);\n return;\n }\n\n console.log(`\\nInstalling into ${CLIENTS[clientId].name}...`);\n\n mkdirSync(dirname(config.configPath), { recursive: true });\n\n let existing: Record<string, unknown> = {};\n if (existsSync(config.configPath)) {\n const raw = readFileSync(config.configPath, \"utf-8\");\n try {\n existing = JSON.parse(raw);\n } catch {\n console.error(`Warning: ${config.configPath} contains invalid JSON. Backing up and creating fresh.`);\n copyFileSync(config.configPath, config.configPath + \".bak\");\n existing = {};\n }\n // Back up valid configs too\n if (Object.keys(existing).length > 0) {\n copyFileSync(config.configPath, config.configPath + \".bak\");\n }\n }\n\n const section = (existing[config.sectionKey] as Record<string, unknown>) || {};\n section[\"dexter-x402\"] = config.entry;\n existing[config.sectionKey] = section;\n\n writeFileSync(config.configPath, JSON.stringify(existing, null, 2) + \"\\n\");\n\n console.log(`Written to ${config.configPath}`);\n console.log(`\\nDexter x402 Gateway installed for ${CLIENTS[clientId].name}.`);\n console.log(`Wallet: ${wallet.info.solanaAddress}`);\n console.log(`\\nDeposit USDC (Solana) to start paying for x402 APIs.`);\n}\n","import yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\n\nasync function main() {\n await yargs(hideBin(process.argv))\n .scriptName(\"@dexterai/mcp\")\n .usage(\"$0 [command] [options]\")\n .option(\"dev\", {\n type: \"boolean\",\n description: \"Use localhost endpoints instead of production\",\n default: false,\n })\n .command(\n [\"$0\", \"server\"],\n \"Start the MCP server (default)\",\n (y) =>\n y.option(\"transport\", {\n choices: [\"stdio\", \"http\"] as const,\n default: \"stdio\" as const,\n description: \"Transport mode\",\n }),\n async (args) => {\n const { startServer } = await import(\"./server/index.js\");\n await startServer({\n transport: args.transport,\n dev: args.dev,\n });\n },\n )\n .command(\n \"install\",\n \"Install Dexter MCP into an AI client (Cursor, Claude, Codex, etc.)\",\n (y) =>\n y\n .option(\"client\", {\n type: \"string\",\n description: \"Client to install into\",\n })\n .option(\"yes\", {\n alias: \"y\",\n type: \"boolean\",\n description: \"Skip prompts\",\n default: false,\n }),\n async (args) => {\n const { runInstall } = await import(\"./cli/install/index.js\");\n await runInstall({ client: args.client, yes: args.yes, dev: args.dev });\n },\n )\n .command(\n \"wallet\",\n \"Show wallet address and balances\",\n () => {},\n async (args) => {\n const { showWalletInfo } = await import(\"./wallet/index.js\");\n await showWalletInfo({ dev: args.dev });\n },\n )\n .command(\n \"search <query>\",\n \"Search the Dexter x402 marketplace\",\n (y) =>\n y.positional(\"query\", { type: \"string\", demandOption: true }),\n async (args) => {\n const { cliSearch } = await import(\"./tools/search.js\");\n await cliSearch(args.query!, { dev: args.dev });\n },\n )\n .command(\n \"fetch <url>\",\n \"Fetch an x402-protected resource with automatic payment\",\n (y) =>\n y\n .positional(\"url\", { type: \"string\", demandOption: true })\n .option(\"method\", {\n choices: [\"GET\", \"POST\", \"PUT\", \"DELETE\"] as const,\n default: \"GET\" as const,\n })\n .option(\"body\", { type: \"string\", description: \"JSON request body\" }),\n async (args) => {\n const { cliFetch } = await import(\"./tools/fetch.js\");\n await cliFetch(args.url!, {\n method: args.method,\n body: args.body,\n dev: args.dev,\n });\n },\n )\n .strict()\n .help()\n .parseAsync();\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,WAAW,mBAAmB;AAWhC,SAAS,WAAW,KAAsB;AAC/C,SAAO,MAAM,iBAAiB;AAChC;AAEA,SAAS,cAAsB;AAC7B,MAAI;AACF,UAAM,OAAO,YAAY,cAAc,YAAY,GAAG,CAAC;AACvD,UAAM,MAAM,KAAK,MAAM,aAAa,KAAK,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC;AAC9E,WAAO,IAAI,WAAW;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA3BA,IAMa,UACA,aAEA,iBACA,gBACA,gBAEA,kBAgBA;AA7Bb;AAAA;AAAA;AAMO,IAAM,WAAW,KAAK,QAAQ,GAAG,eAAe;AAChD,IAAM,cAAc,KAAK,UAAU,aAAa;AAEhD,IAAM,kBAAkB,QAAQ,IAAI,kBAAkB;AACtD,IAAM,iBAAiB;AACvB,IAAM,iBAAiB,QAAQ,IAAI,kBAAkB;AAErD,IAAM,mBAAmB;AAgBzB,IAAM,UAAU,YAAY;AAAA;AAAA;;;ACnB5B,SAAS,WAAW,aAAqB,UAAkB,SAAiB,aAAqB;AACtG,SAAO;AAAA,IACL,yBAAyB;AAAA,IACzB,iCAAiC;AAAA,IACjC,2BAA2B;AAAA,IAC3B,uBAAuB;AAAA,IACvB,8BAA8B;AAAA,IAC9B,oBAAoB;AAAA,IACpB,kCAAkC;AAAA,IAClC,iCAAiC;AAAA,IACjC,4BAA4B;AAAA,EAC9B;AACF;AAtBA,IAAM,eAEA,YAsBO,aAOA,YAOA,YAOA;AA7Cb;AAAA;AAAA;AAAA,IAAM,gBAAgB;AAEtB,IAAM,aAAa;AAAA,MACjB,kBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAgBO,IAAM,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEO,IAAM,aAAa;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEO,IAAM,aAAa;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEO,IAAM,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;AClDA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,SAAS;AA6BlB,SAAS,eAAe,GAAwB;AAC9C,SAAO;AAAA,IACL,MAAM,EAAE,eAAe,EAAE;AAAA,IACzB,KAAK,EAAE;AAAA,IACP,QAAQ,EAAE,UAAU;AAAA,IACpB,OAAO,EAAE,eAAe,EAAE,aAAa,OAAO,IAAI,EAAE,UAAU,QAAQ,CAAC,CAAC,KAAK;AAAA,IAC7E,SAAS,EAAE,gBAAgB;AAAA,IAC3B,aAAa,EAAE,eAAe;AAAA,IAC9B,UAAU,EAAE,YAAY;AAAA,IACxB,cAAc,EAAE,gBAAgB;AAAA,IAChC,UAAU,EAAE,uBAAuB;AAAA,IACnC,YAAY,EAAE,oBAAoB;AAAA,IAClC,QAAQ,EAAE,QAAQ,eAAe;AAAA,IACjC,kBAAkB,EAAE,mBAAmB;AAAA,IACvC,cAAc,QAAQ,EAAE,YAAY;AAAA,IACpC,UAAU,EAAE,YAAY;AAAA,IACxB,UAAU,EAAE,YAAY;AAAA,EAC1B;AACF;AAEA,eAAe,kBACb,QASA,MACA;AACA,QAAM,KAAK,IAAI,gBAAgB;AAC/B,MAAI,OAAO,MAAO,IAAG,IAAI,UAAU,OAAO,KAAK;AAC/C,MAAI,OAAO,SAAU,IAAG,IAAI,YAAY,OAAO,QAAQ;AACvD,MAAI,OAAO,QAAS,IAAG,IAAI,WAAW,OAAO,OAAO;AACpD,MAAI,OAAO,gBAAgB,KAAM,IAAG,IAAI,YAAY,OAAO,OAAO,YAAY,CAAC;AAC/E,MAAI,OAAO,aAAc,IAAG,IAAI,YAAY,MAAM;AAClD,KAAG,IAAI,QAAQ,OAAO,QAAQ,aAAa;AAC3C,KAAG,IAAI,SAAS,OAAO,KAAK,IAAI,OAAO,SAAS,IAAI,EAAE,CAAC,CAAC;AAExD,QAAM,MAAM,GAAG,WAAW,KAAK,GAAG,CAAC,GAAG,gBAAgB,IAAI,EAAE;AAC5D,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,SAAS,EAAE,QAAQ,mBAAmB;AAAA,IACtC,QAAQ,YAAY,QAAQ,IAAM;AAAA,EACpC,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,wBAAwB,IAAI,MAAM,KAAK,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE,CAAC,EAAE;AAAA,EAC3F;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,SAAO;AAAA,IACL,YAAY,KAAK,aAAa,CAAC,GAAG,IAAI,cAAc;AAAA,IACpD,OAAO,KAAK,WAAW,UAAU;AAAA,EACnC;AACF;AAEO,SAAS,mBAAmB,QAAmB,MAAwB;AAC5E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IAGA;AAAA,MACE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wDAAwD;AAAA,MAC9F,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oBAAoB;AAAA,MAC7D,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wDAAwD;AAAA,MAChG,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,MAC7E,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,MAC9E,MAAM,EACH,KAAK,CAAC,aAAa,iBAAiB,eAAe,UAAU,UAAU,aAAa,CAAC,EACrF,SAAS,EACT,SAAS,mCAAmC;AAAA,MAC/C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,SAAS,oBAAoB;AAAA,IACxE;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,MAAM,IAAI;AACjD,cAAM,OAAO;AAAA,UACX,SAAS;AAAA,UACT,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB,KAAK;AAAA,QACP;AACA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,UACxE,mBAAmB;AAAA,UACnB,OAAO;AAAA,QACT;AAAA,MACF,SAAS,KAAU;AACjB,cAAM,UAAU,EAAE,OAAO,IAAI,WAAW,iBAAiB,SAAS,OAAO,OAAO,GAAG,WAAW,CAAC,EAAE;AACjG,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE,CAAC;AAAA,UAC3E,mBAAmB;AAAA,UACnB,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,UAAU,OAAe,MAAuC;AACpF,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB,EAAE,MAAM,GAAG,IAAI;AACtD,YAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,OAAO,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA,EAC1G,SAAS,KAAU;AACjB,YAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI,WAAW,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;AAC1E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AA5IA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,YAAY,gBAAAA,eAAc,eAAe,WAAW,oBAAoB;AACjF,SAAS,SAAS,YAAY,iBAAiB;AAC/C,SAAS,iCAAiC;AAC1C,OAAO,UAAU;AAkBjB,eAAsB,qBAAmD;AAEvE,QAAM,SAAS,QAAQ,IAAI,sBAAsB,QAAQ,IAAI;AAC7D,MAAI,QAAQ;AACV,UAAMC,WAAU,kBAAkB,MAAM;AACxC,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,kBAAkB,KAAK,OAAOA,SAAQ,SAAS;AAAA,QAC/C,eAAeA,SAAQ,UAAU,SAAS;AAAA,QAC1C,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAAA,MACA,eAAeA;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,QAAI;AACF,YAAM,MAAMD,cAAa,aAAa,OAAO;AAC7C,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,UAAI,CAAC,KAAK,iBAAkB,OAAM,IAAI,MAAM,0BAA0B;AACtE,YAAMC,WAAU,kBAAkB,KAAK,gBAAgB;AACvD,UAAIA,SAAQ,UAAU,WAAW,GAAI,OAAM,IAAI,MAAM,oBAAoB;AACzE,aAAO,EAAE,MAAM,MAAM,eAAeA,SAAQ;AAAA,IAC9C,SAAS,KAAU;AACjB,cAAQ,MAAM,uCAAuC,IAAI,OAAO,EAAE;AAClE,cAAQ,MAAM,8BAA8B,WAAW,iCAAiC;AACxF,UAAI;AAAE,qBAAa,aAAa,cAAc,MAAM;AAAA,MAAG,QAAQ;AAAA,MAAC;AAAA,IAClE;AAAA,EACF;AAGA,QAAM,UAAU,QAAQ,SAAS;AACjC,QAAM,OAAmB;AAAA,IACvB,kBAAkB,KAAK,OAAO,QAAQ,SAAS;AAAA,IAC/C,eAAe,QAAQ,UAAU,SAAS;AAAA,IAC1C,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,YAAU,UAAU,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACpD,gBAAc,aAAa,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAEzE,UAAQ,MAAM,oCAAoC,KAAK,aAAa,EAAE;AACtE,UAAQ,MAAM,yBAAyB,WAAW,EAAE;AACpD,UAAQ,MAAM,mFAAmF;AAEjG,SAAO,EAAE,MAAM,eAAe,QAAQ;AACxC;AAEA,SAAS,kBAAkB,KAAsB;AAC/C,MAAI;AAEF,WAAO,QAAQ,cAAc,KAAK,OAAO,GAAG,CAAC;AAAA,EAC/C,QAAQ;AAEN,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,UAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,eAAO,QAAQ,cAAc,WAAW,KAAK,GAAG,CAAC;AAAA,MACnD;AAAA,IACF,QAAQ;AAAA,IAAC;AACT,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC1F;AACF;AAEA,eAAsB,iBACpB,SACA,QACwC;AACxC,MAAI;AACF,UAAM,aAAa,IAAI,WAAW,UAAU,gBAAgB,WAAW;AACvE,UAAM,SAAS,IAAI,UAAU,OAAO;AAEpC,UAAM,CAAC,YAAY,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,MAClD,WAAW,WAAW,MAAM,EAAE,MAAM,MAAM,CAAC;AAAA,MAC3C,eAAe,YAAY,MAAM;AAAA,IACnC,CAAC;AAED,WAAO,EAAE,KAAK,aAAa,KAAK,MAAM,YAAY;AAAA,EACpD,SAAS,KAAU;AACjB,YAAQ,MAAM,4CAA4C,IAAI,OAAO,EAAE;AACvE,WAAO,EAAE,KAAK,GAAG,MAAM,EAAE;AAAA,EAC3B;AACF;AAEA,eAAe,eAAe,YAAwB,OAAmC;AACvF,MAAI;AACF,UAAM,MAAM,MAAM,0BAA0B,WAAW,KAAK;AAC5D,UAAM,OAAO,MAAM,WAAW,uBAAuB,GAAG;AACxD,WAAO,OAAO,KAAK,MAAM,YAAY,CAAC;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,eAAe,MAAuC;AAC1E,QAAM,SAAS,MAAM,mBAAmB;AACxC,MAAI,CAAC,QAAQ;AACX,YAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,wBAAwB,CAAC,CAAC;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,MAAM,iBAAiB,OAAO,KAAK,aAAa;AAEhE,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,SAAS,OAAO,KAAK;AAAA,IACrB,SAAS;AAAA,IACT,UAAU;AAAA,MACR,KAAK,QAAQ;AAAA,MACb,MAAM,QAAQ;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,IACZ,KAAK,QAAQ,SAAS,IAClB,4BAA4B,OAAO,KAAK,aAAa,oCACrD;AAAA,EACN,GAAG,MAAM,CAAC,CAAC;AACb;AAxIA,IAmBM;AAnBN;AAAA;AAAA;AAIA;AAeA,IAAM,YAAY,IAAI,UAAU,8CAA8C;AAAA;AAAA;;;ACnB9E;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,KAAAC,UAAS;AAUlB,eAAe,cAAc,KAAiC;AAC5D,QAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACvD,MAAI,YAAY,SAAS,MAAM,GAAG;AAChC,QAAI;AAAE,aAAO,MAAM,IAAI,KAAK;AAAA,IAAG,QAAQ;AAAE,aAAO,MAAM,IAAI,KAAK;AAAA,IAAG;AAAA,EACpE;AACA,SAAO,MAAM,IAAI,KAAK;AACxB;AAEA,SAAS,kBAAkB,KAAwB;AACjD,QAAM,SAAS,IAAI,QAAQ,IAAI,kBAAkB,KAAK,IAAI,QAAQ,IAAI,kBAAkB;AACxF,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI;AAAE,WAAO,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,EAAG,QAAQ;AAC7C,QAAI;AAAE,aAAO,KAAK,MAAM,MAAM;AAAA,IAAG,QAAQ;AAAE,aAAO;AAAA,IAAM;AAAA,EAC1D;AACF;AAEA,SAAS,SAAS,MAA8G;AAC9H,QAAM,MAAM;AACZ,MAAI,CAAC,KAAK,WAAW,CAAC,MAAM,QAAQ,IAAI,OAAO,EAAG,QAAO,EAAE,cAAc,MAAM,aAAa,KAAK;AACjG,SAAO;AAAA,IACL,cAAc,EAAE,SAAS,IAAI,SAAS,aAAa,IAAI,eAAe,GAAG,UAAU,IAAI,SAAS;AAAA,IAChG,aAAa,IAAI,QAAQ,CAAC,KAAgC;AAAA,EAC5D;AACF;AAEA,eAAe,UACb,QACA,QACA,MACkC;AAClC,QAAM,iBAAyC;AAAA,IAC7C,gBAAgB;AAAA,IAChB,GAAI,OAAO,WAAW,CAAC;AAAA,EACzB;AACA,QAAM,YAAyB;AAAA,IAC7B,QAAQ,OAAO,UAAU;AAAA,IACzB,SAAS;AAAA,EACX;AACA,MAAI,OAAO,QAAQ,OAAO,WAAW,OAAO;AAC1C,cAAU,OAAO,OAAO;AAAA,EAC1B;AAEA,QAAM,WAAW,MAAM,MAAM,OAAO,KAAK,EAAE,GAAG,WAAW,QAAQ,YAAY,QAAQ,IAAM,EAAE,CAAC;AAE9F,MAAI,SAAS,WAAW,KAAK;AAC3B,WAAO,EAAE,QAAQ,SAAS,QAAQ,MAAM,MAAM,cAAc,QAAQ,EAAE;AAAA,EACxE;AAEA,MAAI,UAAmB;AACvB,MAAI;AAAE,cAAU,MAAM,SAAS,KAAK;AAAA,EAAG,QAAQ;AAC7C,QAAI;AAAE,gBAAU,MAAM,SAAS,KAAK;AAAA,IAAG,QAAQ;AAAA,IAAC;AAAA,EAClD;AAEA,QAAM,EAAE,cAAc,YAAY,IAAI,SAAS,OAAO;AAGtD,MAAI,QAAQ;AACV,QAAI;AACF,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,uBAAuB;AAC1D,YAAM,cAAc,UAAU,OAAO;AAAA,QACnC,kBAAkB,OAAO,KAAK;AAAA,MAChC,CAAC;AAED,YAAM,UAAU,MAAM,YAAY,OAAO,KAAK,SAAS;AACvD,YAAM,OAAO,MAAM,cAAc,OAAO;AACxC,YAAM,aAAa,kBAAkB,OAAO;AAE5C,aAAO;AAAA,QACL,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,SAAS,aAAa,EAAE,SAAS,MAAM,SAAS,WAAW,IAAI,EAAE,SAAS,MAAM;AAAA,MAClF;AAAA,IACF,SAAS,KAAU;AACjB,aAAO,EAAE,QAAQ,KAAK,OAAO,mBAAmB,IAAI,OAAO,IAAI,aAAa;AAAA,IAC9E;AAAA,EACF;AAIA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,kBACd,QACA,QACA,MACM;AACN,QAAM,YAAY,WAAW;AAE7B,SAAO;AAAA,IACL;AAAA,IACA,YACI,mIAEA;AAAA,IAEJ;AAAA,MACE,KAAKA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,+BAA+B;AAAA,MAC9D,QAAQA,GACL,KAAK,CAAC,OAAO,QAAQ,OAAO,QAAQ,CAAC,EACrC,QAAQ,KAAK,EACb,SAAS,aAAa;AAAA,MACzB,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,IACvE;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB,EAAE,KAAK,KAAK,KAAK,QAAQ,KAAK,QAAQ,MAAM,KAAK,KAAK;AAAA,UACtD;AAAA,UACA;AAAA,QACF;AACA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,UAC1E,mBAAmB;AAAA,UACnB,OAAO;AAAA,QACT;AAAA,MACF,SAAS,KAAU;AACjB,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,QAAQ,CAAC,EAAE,CAAC;AAAA,UACjF,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,SACpB,KACA,MACe;AACf,MAAI;AACF,UAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,UAAM,SAAS,MAAMA,oBAAmB;AACxC,UAAM,SAAS,MAAM;AAAA,MACnB,EAAE,KAAK,QAAQ,KAAK,QAAQ,MAAM,KAAK,KAAK;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AACA,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC7C,SAAS,KAAU;AACjB,UAAM,MAAM,IAAI,OAAO,SAAS,cAC5B,mBAAmB,GAAG,8BACtB,IAAI,SAAS,iBACX,cAAc,GAAG,eACjB,IAAI,WAAW,OAAO,GAAG;AAC/B,YAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI,GAAG,MAAM,CAAC,CAAC;AACnD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAlKA;AAAA;AAAA;AAIA;AAAA;AAAA;;;ACJA,SAAS,KAAAC,UAAS;AAQlB,SAAS,2BAA2B,aAA4D;AAC9F,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,aAAa,CAAC,WAAW;AAC/B,MAAI;AAAE,eAAW,KAAK,OAAO,KAAK,aAAa,QAAQ,EAAE,SAAS,OAAO,CAAC;AAAA,EAAG,QAAQ;AAAA,EAAC;AACtF,MAAI;AACF,UAAM,aAAa,YAAY,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AACnE,eAAW,KAAK,OAAO,KAAK,YAAY,QAAQ,EAAE,SAAS,OAAO,CAAC;AAAA,EACrE,QAAQ;AAAA,EAAC;AAET,aAAW,aAAa,YAAY;AAClC,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,SAAS;AACnC,UAAI,UAAU,OAAO,WAAW,UAAU;AACxC,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AACA,SAAO;AACT;AAEA,eAAe,cAAc,KAAa,QAAkD;AAC1F,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B;AAAA,IACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,WAAW,QAAQ,OAAO;AAAA,IAChC,QAAQ,YAAY,QAAQ,IAAM;AAAA,EACpC,CAAC;AAED,MAAI,IAAI,WAAW,KAAK;AACtB,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,YAAM,WAAW,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAChD,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY,IAAI;AAAA,QAChB,cAAc;AAAA,QACd,SAAS,YAAY;AAAA,MACvB;AAAA,IACF;AACA,QAAI,IAAI,UAAU,KAAK;AACrB,aAAO,EAAE,OAAO,MAAM,YAAY,IAAI,QAAQ,SAAS,eAAe;AAAA,IACxE;AACA,QAAI,IAAI,UAAU,KAAK;AACrB,aAAO,EAAE,OAAO,MAAM,YAAY,IAAI,QAAQ,SAAS,iBAAiB,IAAI,MAAM,GAAG;AAAA,IACvF;AACA,WAAO,EAAE,iBAAiB,OAAO,YAAY,IAAI,QAAQ,MAAM,KAAK;AAAA,EACtE;AAEA,MAAI,OAAuC;AAC3C,MAAI;AACF,WAAO,MAAM,IAAI,KAAK;AAAA,EACxB,QAAQ;AAAA,EAAC;AAET,QAAM,eAAe;AAAA,IACnB,IAAI,QAAQ,IAAI,kBAAkB,KAAK,IAAI,QAAQ,IAAI,kBAAkB;AAAA,EAC3E;AACA,QAAM,SAAU,gBAAgB,OAAO,iBAAiB,WAAY,eAAe;AACnF,QAAM,UAAU,MAAM;AACtB,QAAM,oBAAoB,QAAQ;AAClC,QAAM,mBAAmB,SAAS,SAAS,UAAU;AACrD,MAAI,CAAC,kBAAkB,QAAQ;AAC7B,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,iBAAiB,iBAAiB,IAAI,CAAC,MAAM;AACjD,UAAM,SAAS,OAAO,EAAE,UAAU,EAAE,qBAAqB,CAAC;AAC1D,UAAM,WAAW,OAAO,EAAE,SAAS,OAAO,EAAE,UAAU,YAAY,cAAc,EAAE,QAC7E,EAAE,MAAkC,WACrC,CAAC;AACL,WAAO;AAAA,MACL,OAAO,SAAS,KAAK,IAAI,IAAI,QAAQ;AAAA,MACrC,gBAAgB,KAAK,SAAS,KAAK,IAAI,IAAI,QAAQ,GAAG,QAAQ,WAAW,IAAI,IAAI,CAAC,CAAC;AAAA,MACnF,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,IACX;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,aAAa,QAAQ,eAAe;AAAA,IACpC;AAAA,IACA,UAAU,QAAQ;AAAA,EACpB;AACF;AAEO,SAAS,kBAAkB,QAAmB,MAAuB;AAC1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IAEA;AAAA,MACE,KAAKA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,kBAAkB;AAAA,MACjD,QAAQA,GACL,KAAK,CAAC,OAAO,QAAQ,OAAO,QAAQ,CAAC,EACrC,QAAQ,KAAK,EACb,SAAS,2BAA2B;AAAA,IACzC;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,SAAS,MAAM,cAAc,KAAK,KAAK,KAAK,MAAM;AACxD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,UAC1E,mBAAmB;AAAA,UACnB,OAAO;AAAA,QACT;AAAA,MACF,SAAS,KAAU;AACjB,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,QAAQ,CAAC,EAAE,CAAC;AAAA,UACjF,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AA/HA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACSO,SAAS,mBACd,QACA,QACA,MACM;AACN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IAEA,CAAC;AAAA,IACD,YAAY;AACV,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB,OAAO;AAAA,gBACP,KAAK;AAAA,cACP,GAAG,MAAM,CAAC;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,UAAU,MAAM,iBAAiB,OAAO,KAAK,aAAa;AAChE,cAAM,OAAO;AAAA,UACX,SAAS,OAAO,KAAK;AAAA,UACrB,SAAS;AAAA,UACT,aAAa;AAAA,UACb,UAAU,EAAE,KAAK,QAAQ,KAAK,MAAM,QAAQ,KAAK;AAAA,UACjD,YAAY;AAAA,UACZ,KAAK,QAAQ,SAAS,IAClB,4BAA4B,OAAO,KAAK,aAAa,oCACrD;AAAA,QACN;AACA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,UACxE,mBAAmB;AAAA,UACnB,OAAO;AAAA,QACT;AAAA,MACF,SAAS,KAAU;AACjB,eAAO;AAAA,UACL,SAAS;AAAA,YACP,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,QAAQ,CAAC,EAAE;AAAA,UACxE;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AA/DA;AAAA;AAAA;AAGA;AACA;AACA;AAAA;AAAA;;;ACLA;AAAA;AAAA;AAAA;AAAA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AAarC,eAAsB,YAAY,MAAoC;AACpE,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,mBAAmB;AAAA,EACpC,SAAS,KAAU;AACjB,YAAQ,MAAM,8CAA8C,IAAI,OAAO,EAAE;AACzE,YAAQ,MAAM,0HAA0H;AACxI,aAAS;AAAA,EACX;AAEA,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAED,qBAAmB,QAAQ,IAAI;AAC/B,oBAAkB,QAAQ,QAAQ,IAAI;AACtC,oBAAkB,QAAQ,IAAI;AAC9B,qBAAmB,QAAQ,QAAQ,IAAI;AAEvC,MAAI,KAAK,cAAc,SAAS;AAC9B,YAAQ,MAAM,2DAA2D;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAE9B,QAAM,WAAW,YAAY;AAC3B,UAAM,OAAO,MAAM;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;AAhDA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACPA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AACrB,SAAS,cAAAC,mBAAkB;AA2D3B,SAAS,eAAuB;AAC9B,QAAM,WAAW,QAAQ;AACzB,MAAI,aAAa,SAAS;AACxB,WAAO,QAAQ,IAAI,WAAWD,MAAKD,SAAQ,GAAG,WAAW,SAAS;AAAA,EACpE;AACA,MAAI,aAAa,UAAU;AACzB,WAAOC,MAAKD,SAAQ,GAAG,WAAW,qBAAqB;AAAA,EACzD;AACA,SAAO,QAAQ,IAAI,mBAAmBC,MAAKD,SAAQ,GAAG,SAAS;AACjE;AAEO,SAAS,gBAAgB,QAAkB,KAA4B;AAC5E,QAAM,MAAM,MAAM,iBAAiB;AAEnC,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,QACL,YAAYC,MAAKD,SAAQ,GAAG,WAAW,UAAU;AAAA,QACjD,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,YAAYC,MAAKD,SAAQ,GAAG,cAAc;AAAA,QAC1C,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IAEF,KAAK,SAAS;AACZ,YAAM,YAAY,QAAQ,IAAI,cAAcC,MAAKD,SAAQ,GAAG,QAAQ;AACpE,aAAO;AAAA,QACL,YAAYC,MAAK,WAAW,aAAa;AAAA,QACzC,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA;AAAA,MACV;AAAA,IACF;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,YAAY,aAAa;AAC/B,YAAM,aAAa,CAAC,QAAQ,iBAAiB;AAC7C,YAAM,MAAM,WAAW,KAAK,CAAC,MAAMC,YAAWD,MAAK,WAAW,CAAC,CAAC,CAAC,KAAK;AACtE,aAAO;AAAA,QACL,YAAYA,MAAK,WAAW,KAAK,QAAQ,UAAU;AAAA,QACnD,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,YAAYA,MAAKD,SAAQ,GAAG,YAAY,YAAY,iBAAiB;AAAA,QACrE,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,YAAYC,MAAKD,SAAQ,GAAG,WAAW,eAAe;AAAA,QACtD,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,EACJ;AACF;AA7HA,IAiBa,SAkCP,YAKA;AAxDN;AAAA;AAAA;AAiBO,IAAM,UAAwC;AAAA,MACnD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AASA,IAAM,aAAa;AAAA,MACjB,SAAS;AAAA,MACT,MAAM,CAAC,MAAM,sBAAsB;AAAA,IACrC;AAEA,IAAM,iBAAiB;AAAA,MACrB,SAAS;AAAA,MACT,MAAM,CAAC,QAAQ,IAAI,IAAI,kBAAkB,OAAO;AAAA,IAClD;AAAA;AAAA;;;AC3DA;AAAA;AAAA;AAAA;AAAA,SAAS,cAAAG,aAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,YAAW,gBAAAC,qBAAoB;AACjF,SAAS,eAAe;AAUxB,eAAsB,WAAW,MAAkC;AAEjE,UAAQ,IAAI,sBAAsB;AAClC,QAAM,SAAS,MAAM,mBAAmB;AACxC,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,mCAAmC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,IAAI,WAAW,OAAO,KAAK,aAAa;AAAA,CAAI;AAGpD,MAAI,WAAW,KAAK;AAEpB,MAAI,CAAC,UAAU;AACb,QAAI,KAAK,KAAK;AACZ,cAAQ,MAAM,uCAAuC;AACrD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,IAAI,wCAAwC;AACpD,UAAM,MAAM,OAAO,KAAK,OAAO;AAC/B,QAAI,QAAQ,CAAC,IAAI,MAAM,QAAQ,IAAI,KAAK,IAAI,CAAC,KAAK,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;AACrE,YAAQ,IAAI;AAEZ,UAAM,WAAW,MAAM,OAAO,UAAe;AAC7C,UAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,UAAM,SAAS,MAAM,IAAI,QAAgB,CAAC,YAAY;AACpD,SAAG,SAAS,qBAAqB,OAAO;AAAA,IAC1C,CAAC;AACD,OAAG,MAAM;AAET,UAAM,MAAM,SAAS,QAAQ,EAAE,IAAI;AACnC,QAAI,MAAM,KAAK,OAAO,IAAI,QAAQ;AAChC,cAAQ,MAAM,iBAAiB;AAC/B,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,eAAW,IAAI,GAAG;AAAA,EACpB;AAEA,MAAI,CAAC,QAAQ,QAAQ,GAAG;AACtB,YAAQ,MAAM,mBAAmB,QAAQ,EAAE;AAC3C,YAAQ,MAAM,cAAc,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,SAAS,gBAAgB,UAAU,KAAK,GAAG;AAEjD,MAAI,OAAO,QAAQ;AACjB,YAAQ,IAAI;AAAA,EAAK,QAAQ,QAAQ,EAAE,IAAI;AAAA,CAAmC;AAC1E,YAAQ,IAAI,gCAAgC;AAC5C,YAAQ,IAAI,KAAK,UAAU,OAAO,OAAO,MAAM,CAAC,CAAC;AACjD,YAAQ,IAAI;AAAA,eAAkB,OAAO,UAAU,EAAE;AACjD;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,kBAAqB,QAAQ,QAAQ,EAAE,IAAI,KAAK;AAE5D,EAAAD,WAAU,QAAQ,OAAO,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAEzD,MAAI,WAAoC,CAAC;AACzC,MAAIH,YAAW,OAAO,UAAU,GAAG;AACjC,UAAM,MAAMC,cAAa,OAAO,YAAY,OAAO;AACnD,QAAI;AACF,iBAAW,KAAK,MAAM,GAAG;AAAA,IAC3B,QAAQ;AACN,cAAQ,MAAM,YAAY,OAAO,UAAU,wDAAwD;AACnG,MAAAG,cAAa,OAAO,YAAY,OAAO,aAAa,MAAM;AAC1D,iBAAW,CAAC;AAAA,IACd;AAEA,QAAI,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AACpC,MAAAA,cAAa,OAAO,YAAY,OAAO,aAAa,MAAM;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,UAAW,SAAS,OAAO,UAAU,KAAiC,CAAC;AAC7E,UAAQ,aAAa,IAAI,OAAO;AAChC,WAAS,OAAO,UAAU,IAAI;AAE9B,EAAAF,eAAc,OAAO,YAAY,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,IAAI;AAEzE,UAAQ,IAAI,cAAc,OAAO,UAAU,EAAE;AAC7C,UAAQ,IAAI;AAAA,oCAAuC,QAAQ,QAAQ,EAAE,IAAI,GAAG;AAC5E,UAAQ,IAAI,WAAW,OAAO,KAAK,aAAa,EAAE;AAClD,UAAQ,IAAI;AAAA,qDAAwD;AACtE;AAjGA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACHA,OAAO,WAAW;AAClB,SAAS,eAAe;AAExB,eAAe,OAAO;AACpB,QAAM,MAAM,QAAQ,QAAQ,IAAI,CAAC,EAC9B,WAAW,eAAe,EAC1B,MAAM,wBAAwB,EAC9B,OAAO,OAAO;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA;AAAA,IACC,CAAC,MAAM,QAAQ;AAAA,IACf;AAAA,IACA,CAAC,MACC,EAAE,OAAO,aAAa;AAAA,MACpB,SAAS,CAAC,SAAS,MAAM;AAAA,MACzB,SAAS;AAAA,MACT,aAAa;AAAA,IACf,CAAC;AAAA,IACH,OAAO,SAAS;AACd,YAAM,EAAE,aAAAG,aAAY,IAAI,MAAM;AAC9B,YAAMA,aAAY;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,KAAK,KAAK;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,MACC,EACG,OAAO,UAAU;AAAA,MAChB,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC,EACA,OAAO,OAAO;AAAA,MACb,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACL,OAAO,SAAS;AACd,YAAM,EAAE,YAAAC,YAAW,IAAI,MAAM;AAC7B,YAAMA,YAAW,EAAE,QAAQ,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,IACxE;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IAAC;AAAA,IACP,OAAO,SAAS;AACd,YAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AACjC,YAAMA,gBAAe,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,IACxC;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,MACC,EAAE,WAAW,SAAS,EAAE,MAAM,UAAU,cAAc,KAAK,CAAC;AAAA,IAC9D,OAAO,SAAS;AACd,YAAM,EAAE,WAAAC,WAAU,IAAI,MAAM;AAC5B,YAAMA,WAAU,KAAK,OAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,IAChD;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,MACC,EACG,WAAW,OAAO,EAAE,MAAM,UAAU,cAAc,KAAK,CAAC,EACxD,OAAO,UAAU;AAAA,MAChB,SAAS,CAAC,OAAO,QAAQ,OAAO,QAAQ;AAAA,MACxC,SAAS;AAAA,IACX,CAAC,EACA,OAAO,QAAQ,EAAE,MAAM,UAAU,aAAa,oBAAoB,CAAC;AAAA,IACxE,OAAO,SAAS;AACd,YAAM,EAAE,UAAAC,UAAS,IAAI,MAAM;AAC3B,YAAMA,UAAS,KAAK,KAAM;AAAA,QACxB,QAAQ,KAAK;AAAA,QACb,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF,EACC,OAAO,EACP,KAAK,EACL,WAAW;AAChB;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,GAAG;AACjB,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["readFileSync","keypair","z","loadOrCreateWallet","z","homedir","join","existsSync","existsSync","readFileSync","writeFileSync","mkdirSync","copyFileSync","startServer","runInstall","showWalletInfo","cliSearch","cliFetch"]}
|