@arcdot/agent 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/client/paymentParse.ts","../src/settle/pay.ts","../src/arc/chain.ts","../src/auth/challenge.ts","../src/settle/paymentId.ts","../src/wallet/store.ts","../src/client/gateway.ts","../src/mcp/proxy.ts","../src/mcp/toolNames.ts","../src/client/mcp.ts","../src/cli.ts"],"sourcesContent":["/** Shared constants — mirror next-app Arc locks (18-decimal native USDC). */\n\nexport const ARC_CHAIN_ID = 5042 as const;\nexport const ARC_RPC_URL_DEFAULT = \"https://rpc.mainnet.arc.io\" as const;\nexport const ARC_EXPLORER = \"https://explorer.arc.io\" as const;\nexport const GATEWAY_FEE_WEI_DEFAULT = 10_000_000_000_000_000n;\n\nexport type GatewayAuthMessage = {\n domain: \"arcdot.gateway\";\n chainId: typeof ARC_CHAIN_ID;\n gateway: `0x${string}`;\n txHash: `0x${string}`;\n feeWei: string;\n service: string;\n inputHash: `0x${string}`;\n issuedAt: number;\n expiresAt: number;\n};\n\nexport type PaymentProof = {\n txHash: `0x${string}`;\n address: `0x${string}`;\n signature: `0x${string}`;\n issuedAt: number;\n expiresAt: number;\n};\n","/** Parse gateway 402 and MCP payment-needed payloads. */\n\nexport type PaymentInstructions = {\n chainId: number;\n gateway: `0x${string}`;\n seller: `0x${string}` | null;\n feeWei: string;\n feeUsdc?: string;\n method?: string;\n};\n\nexport function isGateway402Body(value: unknown): boolean {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n if (v.ok !== false || v.status !== 402) return false;\n const err = v.error;\n if (!err || typeof err !== \"object\") return false;\n return Boolean((err as { payment?: unknown }).payment);\n}\n\nexport function parsePaymentRequired(\n body: unknown,\n): PaymentInstructions | null {\n if (!isGateway402Body(body)) return null;\n const payment = (body as { error: { payment: PaymentInstructions } }).error\n .payment;\n if (!payment?.gateway || !payment.feeWei) return null;\n return payment;\n}\n\n/** MCP tools/call often returns payment JSON as text content. */\nexport function parseMcpPaymentNeeded(toolResult: unknown): {\n payment: PaymentInstructions;\n serviceSlug: string;\n raw: unknown;\n} | null {\n const text = extractMcpText(toolResult);\n if (!text) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== \"object\") return null;\n const obj = parsed as Record<string, unknown>;\n const err = obj.error as\n | {\n code?: string;\n payment?: PaymentInstructions;\n service?: { slug?: string };\n }\n | undefined;\n if (obj.status === 402 || err?.code === \"PAYMENT_REQUIRED\") {\n const payment = err?.payment;\n if (!payment?.gateway || !payment.feeWei) return null;\n const slug =\n err?.service?.slug ||\n (typeof obj.service === \"string\" ? obj.service : \"\") ||\n \"\";\n return { payment, serviceSlug: slug, raw: parsed };\n }\n return null;\n}\n\nfunction extractMcpText(toolResult: unknown): string | null {\n if (!toolResult || typeof toolResult !== \"object\") return null;\n const r = toolResult as {\n content?: Array<{ type?: string; text?: string }>;\n structuredContent?: unknown;\n };\n if (Array.isArray(r.content)) {\n const texts = r.content\n .filter((c) => c?.type === \"text\" && typeof c.text === \"string\")\n .map((c) => c.text as string);\n if (texts.length) return texts.join(\"\\n\");\n }\n if (typeof (toolResult as { text?: string }).text === \"string\") {\n return (toolResult as { text: string }).text;\n }\n return null;\n}\n\nexport function paymentDepositArgs(payment: PaymentInstructions): {\n feeWei: bigint;\n seller: `0x${string}`;\n gateway: `0x${string}`;\n} {\n if (!payment.seller) {\n throw new Error(\"Payment instructions missing seller address\");\n }\n return {\n feeWei: BigInt(payment.feeWei),\n seller: payment.seller,\n gateway: payment.gateway,\n };\n}\n","import {\n createPublicClient,\n createWalletClient,\n formatEther,\n http,\n type Hex,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { arcMainnet, promptGatewayAbi, resolveRpcUrl } from \"../arc/chain.js\";\nimport {\n buildAuthChallenge,\n buildGatewayAuthMessage,\n} from \"../auth/challenge.js\";\nimport type { PaymentProof } from \"../constants.js\";\nimport { makePaymentId } from \"./paymentId.js\";\n\nexport type SettleParams = {\n privateKey: Hex;\n gateway: `0x${string}`;\n seller: `0x${string}`;\n service: string;\n feeWei: bigint;\n input: unknown;\n rpcUrl?: string;\n};\n\nexport type SettleResult = {\n paymentId: Hex;\n proof: PaymentProof;\n feeWei: bigint;\n};\n\n/** On-chain deposit + EIP-191 proof for gateway / MCP retry. */\nexport async function settlePayment(\n params: SettleParams,\n): Promise<SettleResult> {\n const account = privateKeyToAccount(params.privateKey);\n const chain = arcMainnet(params.rpcUrl);\n const rpcUrl = resolveRpcUrl(params.rpcUrl);\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(rpcUrl),\n });\n\n const paymentId = makePaymentId({\n payer: account.address,\n service: params.service,\n nonce: Date.now(),\n });\n\n const txHash = await walletClient.writeContract({\n address: params.gateway,\n abi: promptGatewayAbi,\n functionName: \"depositPayment\",\n args: [paymentId, params.seller],\n value: params.feeWei,\n chain,\n account,\n });\n\n await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n const now = Math.floor(Date.now() / 1000);\n const authMessage = buildGatewayAuthMessage({\n gateway: params.gateway,\n txHash,\n feeWei: params.feeWei,\n service: params.service,\n input: params.input,\n issuedAt: now,\n expiresAt: now + 120,\n });\n const signature = await walletClient.signMessage({\n account,\n message: buildAuthChallenge(authMessage),\n });\n\n return {\n paymentId,\n feeWei: params.feeWei,\n proof: {\n txHash,\n address: account.address,\n signature,\n issuedAt: now,\n expiresAt: now + 120,\n },\n };\n}\n\nexport async function getNativeBalance(\n address: `0x${string}`,\n rpcUrl?: string,\n): Promise<{ wei: bigint; formatted: string }> {\n const publicClient = createPublicClient({\n chain: arcMainnet(rpcUrl),\n transport: http(resolveRpcUrl(rpcUrl)),\n });\n const wei = await publicClient.getBalance({ address });\n return { wei, formatted: formatEther(wei) };\n}\n","import { defineChain } from \"viem\";\nimport { ARC_CHAIN_ID, ARC_EXPLORER, ARC_RPC_URL_DEFAULT } from \"../constants.js\";\n\nexport function resolveRpcUrl(override?: string): string {\n return (\n override ||\n process.env.ARC_RPC_URL ||\n process.env.NEXT_PUBLIC_ARC_RPC_URL ||\n ARC_RPC_URL_DEFAULT\n );\n}\n\nexport function arcMainnet(rpcUrl?: string) {\n return defineChain({\n id: ARC_CHAIN_ID,\n name: \"Arc\",\n nativeCurrency: { name: \"USDC\", symbol: \"USDC\", decimals: 18 },\n rpcUrls: {\n default: { http: [resolveRpcUrl(rpcUrl)] },\n },\n blockExplorers: {\n default: { name: \"Arc Explorer\", url: ARC_EXPLORER },\n },\n });\n}\n\n/** Minimal PromptGateway ABI for buyer settle. */\nexport const promptGatewayAbi = [\n {\n type: \"function\",\n name: \"depositPayment\",\n stateMutability: \"payable\",\n inputs: [\n { name: \"paymentId\", type: \"bytes32\" },\n { name: \"seller\", type: \"address\" },\n ],\n outputs: [],\n },\n {\n type: \"function\",\n name: \"minFee\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n","import { keccak256, stringToBytes, type Hex } from \"viem\";\nimport { ARC_CHAIN_ID, type GatewayAuthMessage } from \"../constants.js\";\n\nexport function hashGatewayInput(input: unknown): Hex {\n return keccak256(stringToBytes(JSON.stringify(input ?? null)));\n}\n\nexport function buildAuthChallenge(msg: GatewayAuthMessage): string {\n return [\n \"arcdot.gateway\",\n `chainId:${msg.chainId}`,\n `gateway:${msg.gateway.toLowerCase()}`,\n `txHash:${msg.txHash.toLowerCase()}`,\n `feeWei:${msg.feeWei}`,\n `service:${msg.service}`,\n `inputHash:${msg.inputHash.toLowerCase()}`,\n `issuedAt:${msg.issuedAt}`,\n `expiresAt:${msg.expiresAt}`,\n ].join(\"\\n\");\n}\n\nexport function buildGatewayAuthMessage(params: {\n gateway: `0x${string}`;\n txHash: Hex;\n feeWei: bigint;\n service: string;\n input: unknown;\n issuedAt: number;\n expiresAt: number;\n}): GatewayAuthMessage {\n return {\n domain: \"arcdot.gateway\",\n chainId: ARC_CHAIN_ID,\n gateway: params.gateway,\n txHash: params.txHash,\n feeWei: params.feeWei.toString(),\n service: params.service,\n inputHash: hashGatewayInput(params.input),\n issuedAt: params.issuedAt,\n expiresAt: params.expiresAt,\n };\n}\n","import { encodeAbiParameters, keccak256, type Hex } from \"viem\";\n\nexport function makePaymentId(params: {\n payer: `0x${string}`;\n service: string;\n nonce: string | number | bigint;\n}): Hex {\n return keccak256(\n encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"string\" },\n { type: \"uint256\" },\n ],\n [params.payer, params.service, BigInt(params.nonce)],\n ),\n );\n}\n","import { mkdirSync, readFileSync, writeFileSync, existsSync, chmodSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Hex } from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\n\nexport type StoredWallet = {\n address: `0x${string}`;\n privateKey: Hex;\n createdAt: string;\n};\n\nfunction walletDir(): string {\n return process.env.ARCDOT_HOME?.trim() || join(homedir(), \".arcdot\");\n}\n\nexport function walletPath(): string {\n return join(walletDir(), \"wallet.json\");\n}\n\nfunction isHexKey(key: string): key is Hex {\n return /^0x[a-fA-F0-9]{64}$/.test(key);\n}\n\n/** Prefer ARCDOT_PRIVATE_KEY, then AGENT_PRIVATE_KEY, then ~/.arcdot/wallet.json */\nexport function resolvePrivateKey(): Hex {\n const fromEnv =\n process.env.ARCDOT_PRIVATE_KEY?.trim() ||\n process.env.AGENT_PRIVATE_KEY?.trim();\n if (fromEnv) {\n if (!isHexKey(fromEnv)) {\n throw new Error(\n \"ARCDOT_PRIVATE_KEY / AGENT_PRIVATE_KEY must be a 0x-prefixed 32-byte hex key.\",\n );\n }\n return fromEnv;\n }\n const stored = loadWallet();\n if (!stored) {\n throw new Error(\n \"No agent wallet found. Run: npx @arcdot/agent wallet create\",\n );\n }\n return stored.privateKey;\n}\n\nexport function loadWallet(): StoredWallet | null {\n const path = walletPath();\n if (!existsSync(path)) return null;\n const raw = JSON.parse(readFileSync(path, \"utf8\")) as StoredWallet;\n if (!raw.address || !isHexKey(raw.privateKey)) {\n throw new Error(`Corrupt wallet file at ${path}`);\n }\n return raw;\n}\n\nexport function createWallet(opts?: { force?: boolean }): StoredWallet {\n const path = walletPath();\n if (existsSync(path) && !opts?.force) {\n throw new Error(\n `Wallet already exists at ${path}. Pass --force to overwrite, or use wallet address.`,\n );\n }\n mkdirSync(walletDir(), { recursive: true });\n const privateKey = generatePrivateKey();\n const account = privateKeyToAccount(privateKey);\n const wallet: StoredWallet = {\n address: account.address,\n privateKey,\n createdAt: new Date().toISOString(),\n };\n writeFileSync(path, JSON.stringify(wallet, null, 2) + \"\\n\", {\n encoding: \"utf8\",\n mode: 0o600,\n });\n try {\n chmodSync(path, 0o600);\n } catch {\n // Windows may ignore mode; best-effort\n }\n return wallet;\n}\n\nexport function walletAccountFromKey(privateKey: Hex) {\n return privateKeyToAccount(privateKey);\n}\n","import type { Hex } from \"viem\";\nimport type { PaymentProof } from \"../constants.js\";\nimport { GATEWAY_FEE_WEI_DEFAULT } from \"../constants.js\";\nimport {\n parsePaymentRequired,\n paymentDepositArgs,\n} from \"./paymentParse.js\";\nimport { settlePayment } from \"../settle/pay.js\";\nimport { resolvePrivateKey } from \"../wallet/store.js\";\n\nexport type GatewayCallResult =\n | { ok: true; status: 200; body: Record<string, unknown> }\n | { ok: false; status: number; body: unknown };\n\nexport type CatalogService = {\n slug: string;\n price_wei: string;\n seller: `0x${string}`;\n title?: string;\n};\n\nexport async function fetchService(\n origin: string,\n slug: string,\n): Promise<CatalogService> {\n const res = await fetch(new URL(`/api/services/${slug}`, origin));\n const json = (await res.json()) as {\n service?: {\n slug: string;\n price_wei: string;\n seller?: string;\n owner_address?: string;\n title?: string;\n };\n error?: string;\n };\n if (!res.ok || !json.service) {\n throw new Error(json.error || `Service not found: ${slug}`);\n }\n const sellerRaw = json.service.seller || json.service.owner_address;\n if (!sellerRaw || !/^0x[a-fA-F0-9]{40}$/.test(sellerRaw)) {\n throw new Error(\"Service is missing a valid seller address\");\n }\n return {\n slug: json.service.slug,\n price_wei: json.service.price_wei,\n seller: sellerRaw as `0x${string}`,\n title: json.service.title,\n };\n}\n\nexport async function resolveGateway(\n origin: string,\n override?: `0x${string}`,\n): Promise<`0x${string}`> {\n if (override && override.length === 42) return override;\n if (process.env.ARCDOT_GATEWAY?.startsWith(\"0x\")) {\n return process.env.ARCDOT_GATEWAY as `0x${string}`;\n }\n const res = await fetch(new URL(\"/api/services\", origin));\n const json = (await res.json()) as { gateway?: string | null };\n if (json.gateway && json.gateway.length === 42) {\n return json.gateway as `0x${string}`;\n }\n throw new Error(\n \"Gateway address not configured on host. Set ARCDOT_GATEWAY or deploy PromptGateway.\",\n );\n}\n\nasync function postGatewayPaid(params: {\n origin: string;\n service: string;\n input: unknown;\n proof: PaymentProof;\n feeWei: bigint;\n clientRequestId?: string;\n}): Promise<GatewayCallResult> {\n const body = {\n service: params.service,\n input: params.input,\n clientRequestId: params.clientRequestId,\n auth: {\n issuedAt: params.proof.issuedAt,\n expiresAt: params.proof.expiresAt,\n },\n };\n const res = await fetch(new URL(\"/api/gateway\", params.origin), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Arc-Tx-Hash\": params.proof.txHash,\n \"X-Arc-Address\": params.proof.address,\n \"X-Arc-Signature\": params.proof.signature,\n },\n body: JSON.stringify(body),\n });\n const json = await res.json();\n if (res.status === 200 && json?.ok === true) {\n return { ok: true, status: 200, body: json as Record<string, unknown> };\n }\n return { ok: false, status: res.status, body: json };\n}\n\n/**\n * Unlock a catalog service with auto-settle:\n * try unpaid → on 402 deposit + sign → retry paid.\n */\nexport async function unlockWithAutoSettle(params: {\n origin: string;\n service: string;\n input: unknown;\n privateKey?: Hex;\n gateway?: `0x${string}`;\n rpcUrl?: string;\n clientRequestId?: string;\n}): Promise<{\n gateway: GatewayCallResult;\n txHash?: Hex;\n paymentId?: Hex;\n settled: boolean;\n}> {\n const privateKey = params.privateKey ?? resolvePrivateKey();\n const origin = params.origin.replace(/\\/$/, \"\");\n\n // Probe unpaid to get payment instructions (or succeed if free — gateway always paid for catalog tools)\n const probe = await fetch(new URL(\"/api/gateway\", origin), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n service: params.service,\n input: params.input,\n clientRequestId: params.clientRequestId,\n }),\n });\n const probeJson = await probe.json();\n\n if (probe.status === 200 && probeJson?.ok === true) {\n return {\n gateway: { ok: true, status: 200, body: probeJson },\n settled: false,\n };\n }\n\n const payment = parsePaymentRequired(probeJson);\n const service = await fetchService(origin, params.service);\n const gatewayAddr =\n params.gateway ||\n (payment ? payment.gateway : await resolveGateway(origin));\n\n let feeWei = BigInt(service.price_wei);\n let seller = service.seller;\n if (payment) {\n const args = paymentDepositArgs(payment);\n feeWei = args.feeWei;\n seller = args.seller;\n }\n if (feeWei <= 0n) feeWei = GATEWAY_FEE_WEI_DEFAULT;\n\n const settled = await settlePayment({\n privateKey,\n gateway: gatewayAddr,\n seller,\n service: params.service,\n feeWei,\n input: params.input,\n rpcUrl: params.rpcUrl,\n });\n\n const gateway = await postGatewayPaid({\n origin,\n service: params.service,\n input: params.input,\n proof: settled.proof,\n feeWei: settled.feeWei,\n clientRequestId: params.clientRequestId,\n });\n\n return {\n gateway,\n txHash: settled.proof.txHash,\n paymentId: settled.paymentId,\n settled: true,\n };\n}\n","/**\n * Stdio MCP proxy: Cursor ↔ this process ↔ remote arcdot /api/mcp.\n * Auto-settles paid tools from ~/.arcdot/wallet (or ARCDOT_PRIVATE_KEY).\n */\n\nimport { createInterface } from \"node:readline\";\nimport { callMcpToolWithAutoSettle, mcpRpc } from \"../client/mcp.js\";\n\ntype JsonRpcMsg = {\n jsonrpc?: string;\n id?: string | number | null;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: unknown;\n};\n\nfunction write(msg: object) {\n process.stdout.write(JSON.stringify(msg) + \"\\n\");\n}\n\nfunction ok(id: string | number | null | undefined, result: unknown) {\n write({ jsonrpc: \"2.0\", id: id ?? null, result });\n}\n\nfunction fail(\n id: string | number | null | undefined,\n code: number,\n message: string,\n) {\n write({\n jsonrpc: \"2.0\",\n id: id ?? null,\n error: { code, message },\n });\n}\n\nexport async function runMcpProxy(origin: string) {\n const base = origin.replace(/\\/$/, \"\");\n const rl = createInterface({ input: process.stdin, crlfDelay: Infinity });\n\n // Log to stderr only — stdout is MCP JSON-RPC\n console.error(`[arcdot] MCP proxy → ${base}/api/mcp`);\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n let msg: JsonRpcMsg;\n try {\n msg = JSON.parse(trimmed) as JsonRpcMsg;\n } catch {\n fail(null, -32700, \"Parse error\");\n continue;\n }\n\n const id = msg.id;\n const method = msg.method;\n\n // Notifications (no id) — acknowledge silently for initialized\n if (method === \"notifications/initialized\" || id === undefined) {\n if (method && method.startsWith(\"notifications/\")) continue;\n }\n\n try {\n if (method === \"initialize\") {\n const remote = await mcpRpc(base, \"initialize\", msg.params);\n if (remote.error) {\n fail(id, remote.error.code, remote.error.message);\n } else {\n // Ensure we advertise as a proxy client-compatible server\n const result = remote.result as Record<string, unknown> | undefined;\n ok(id, result ?? {\n protocolVersion: \"2024-11-05\",\n capabilities: { tools: {} },\n serverInfo: { name: \"arcdot-proxy\", version: \"0.1.0\" },\n });\n }\n continue;\n }\n\n if (method === \"ping\") {\n ok(id, {});\n continue;\n }\n\n if (method === \"tools/list\") {\n const remote = await mcpRpc(base, \"tools/list\", msg.params);\n if (remote.error) fail(id, remote.error.code, remote.error.message);\n else ok(id, remote.result);\n continue;\n }\n\n if (method === \"tools/call\") {\n const p = msg.params as {\n name?: string;\n arguments?: Record<string, unknown>;\n };\n if (!p?.name) {\n fail(id, -32602, \"tools/call requires params.name\");\n continue;\n }\n const remote = await callMcpToolWithAutoSettle({\n origin: base,\n name: p.name,\n arguments: p.arguments,\n });\n if (remote.error) fail(id, remote.error.code, remote.error.message);\n else ok(id, remote.result);\n continue;\n }\n\n // Forward other methods if any\n if (method) {\n const remote = await mcpRpc(base, method, msg.params);\n if (remote.error) fail(id, remote.error.code, remote.error.message);\n else ok(id, remote.result);\n continue;\n }\n\n fail(id, -32600, \"Invalid Request\");\n } catch (err) {\n fail(\n id,\n -32000,\n err instanceof Error ? err.message : \"Proxy error\",\n );\n }\n }\n}\n","/** Mirror next-app tool naming: arcdot_<slug with underscores>. */\n\nexport function toolNameForSlug(slug: string): string {\n return `arcdot_${slug.replace(/-/g, \"_\")}`;\n}\n\nexport function slugFromToolName(name: string): string | null {\n if (!name.startsWith(\"arcdot_\")) return null;\n if (name === \"arcdot_catalog\" || name === \"arcdot_health\") return null;\n return name.slice(\"arcdot_\".length).replace(/_/g, \"-\");\n}\n","import type { Hex } from \"viem\";\nimport { slugFromToolName } from \"../mcp/toolNames.js\";\nimport {\n parseMcpPaymentNeeded,\n paymentDepositArgs,\n} from \"./paymentParse.js\";\nimport { settlePayment } from \"../settle/pay.js\";\nimport { resolvePrivateKey } from \"../wallet/store.js\";\nimport { resolveGateway } from \"./gateway.js\";\n\nexport type JsonRpcRequest = {\n jsonrpc: \"2.0\";\n id: string | number | null;\n method: string;\n params?: unknown;\n};\n\nexport type JsonRpcResponse = {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n};\n\nexport async function mcpRpc(\n origin: string,\n method: string,\n params?: unknown,\n id: number = 1,\n): Promise<JsonRpcResponse> {\n const endpoint = new URL(\"/api/mcp\", origin.replace(/\\/$/, \"\"));\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id,\n method,\n params: params ?? {},\n }),\n });\n return (await res.json()) as JsonRpcResponse;\n}\n\n/**\n * Call a remote MCP tool; on PAYMENT_REQUIRED, settle from local wallet and retry.\n */\nexport async function callMcpToolWithAutoSettle(params: {\n origin: string;\n name: string;\n arguments?: Record<string, unknown>;\n privateKey?: Hex;\n rpcUrl?: string;\n gateway?: `0x${string}`;\n}): Promise<JsonRpcResponse> {\n const origin = params.origin.replace(/\\/$/, \"\");\n const args = { ...(params.arguments ?? {}) };\n\n const first = await mcpRpc(origin, \"tools/call\", {\n name: params.name,\n arguments: args,\n });\n\n if (first.error) return first;\n\n const needed = parseMcpPaymentNeeded(first.result);\n if (!needed) return first;\n\n const privateKey = params.privateKey ?? resolvePrivateKey();\n const deposit = paymentDepositArgs(needed.payment);\n const slug =\n needed.serviceSlug ||\n slugFromToolName(params.name) ||\n String(args.service ?? \"\");\n if (!slug) {\n throw new Error(\n `Cannot settle: missing service slug for tool ${params.name}`,\n );\n }\n\n const input = {\n prompt:\n typeof args.prompt === \"string\" ? args.prompt : JSON.stringify(args),\n };\n\n const gateway =\n params.gateway || deposit.gateway || (await resolveGateway(origin));\n\n const settled = await settlePayment({\n privateKey,\n gateway,\n seller: deposit.seller,\n service: slug,\n feeWei: deposit.feeWei,\n input,\n rpcUrl: params.rpcUrl,\n });\n\n const retryArgs = {\n ...args,\n payment: {\n txHash: settled.proof.txHash,\n address: settled.proof.address,\n signature: settled.proof.signature,\n issuedAt: settled.proof.issuedAt,\n expiresAt: settled.proof.expiresAt,\n },\n };\n\n return mcpRpc(origin, \"tools/call\", {\n name: params.name,\n arguments: retryArgs,\n }, 2);\n}\n","import { ARC_EXPLORER } from \"./constants.js\";\nimport { unlockWithAutoSettle } from \"./client/gateway.js\";\nimport { getNativeBalance } from \"./settle/pay.js\";\nimport { runMcpProxy } from \"./mcp/proxy.js\";\nimport {\n createWallet,\n loadWallet,\n resolvePrivateKey,\n walletAccountFromKey,\n walletPath,\n} from \"./wallet/store.js\";\n\nfunction usage() {\n console.log(`\narcdot — buyer agent client (keys stay on your machine)\n\nUsage:\n arcdot wallet create [--force]\n arcdot wallet address\n arcdot wallet balance\n arcdot unlock --origin <url> --service <slug> [--prompt <text>]\n arcdot mcp --origin <url>\n\nEnv:\n ARCDOT_ORIGIN Default origin for unlock / mcp\n ARCDOT_PRIVATE_KEY Override ~/.arcdot/wallet.json\n AGENT_PRIVATE_KEY Alias for ARCDOT_PRIVATE_KEY\n ARC_RPC_URL Arc RPC (default https://rpc.mainnet.arc.io)\n ARCDOT_GATEWAY Override gateway address\n ARCDOT_HOME Override config dir (default ~/.arcdot)\n`);\n}\n\nfunction argValue(args: string[], name: string): string | undefined {\n const i = args.indexOf(name);\n if (i === -1) return undefined;\n return args[i + 1];\n}\n\nfunction hasFlag(args: string[], name: string): boolean {\n return args.includes(name);\n}\n\nasync function main() {\n const argv = process.argv.slice(2);\n const cmd = argv[0];\n\n if (!cmd || cmd === \"-h\" || cmd === \"--help\") {\n usage();\n process.exit(cmd ? 0 : 1);\n }\n\n if (cmd === \"wallet\") {\n const sub = argv[1];\n if (sub === \"create\") {\n const wallet = createWallet({ force: hasFlag(argv, \"--force\") });\n console.log(`\nCreated agent wallet (local only)\n=================================\nAddress: ${wallet.address}\nFile: ${walletPath()}\n\nNEXT STEPS\n1. Fund ${wallet.address} with native USDC on Arc Mainnet (chain 5042).\n ${ARC_EXPLORER}/address/${wallet.address}\n2. Add MCP in Cursor with the local proxy (see Hub), or:\n arcdot unlock --origin https://YOUR_HOST --service quick-brief --prompt \"Hi\"\n\nPrivate key is stored at ${walletPath()} (mode 0600).\nIt was also printed once below — save it offline if you need a backup.\nDo NOT put this key on the arcdot. server.\n\nPrivate key: ${wallet.privateKey}\n`);\n return;\n }\n if (sub === \"address\") {\n const w = loadWallet();\n if (!w) {\n // env-only\n const key = resolvePrivateKey();\n console.log(walletAccountFromKey(key).address);\n return;\n }\n console.log(w.address);\n return;\n }\n if (sub === \"balance\") {\n const key = resolvePrivateKey();\n const address = walletAccountFromKey(key).address;\n const { formatted, wei } = await getNativeBalance(address);\n console.log(\n JSON.stringify({ address, balanceUsdc: formatted, wei: wei.toString() }, null, 2),\n );\n return;\n }\n console.error(\"Unknown wallet command. Use create | address | balance\");\n process.exit(1);\n }\n\n if (cmd === \"unlock\") {\n const origin =\n argValue(argv, \"--origin\") ||\n process.env.ARCDOT_ORIGIN ||\n \"\";\n const service = argValue(argv, \"--service\") || \"quick-brief\";\n const prompt =\n argValue(argv, \"--prompt\") || \"Say hello in one short sentence.\";\n if (!origin) {\n console.error(\"Missing --origin or ARCDOT_ORIGIN\");\n process.exit(1);\n }\n const result = await unlockWithAutoSettle({\n origin,\n service,\n input: { prompt },\n clientRequestId: `arcdot-cli-${Date.now()}`,\n });\n console.log(JSON.stringify(result, null, 2));\n if (!result.gateway.ok) process.exit(1);\n return;\n }\n\n if (cmd === \"mcp\") {\n const origin =\n argValue(argv, \"--origin\") ||\n process.env.ARCDOT_ORIGIN ||\n \"\";\n if (!origin) {\n console.error(\"Missing --origin or ARCDOT_ORIGIN\");\n process.exit(1);\n }\n await runMcpProxy(origin);\n return;\n }\n\n console.error(`Unknown command: ${cmd}`);\n usage();\n process.exit(1);\n}\n\nmain().catch((err) => {\n console.error(err instanceof Error ? err.message : err);\n process.exit(1);\n});\n"],"mappings":"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","names":["keccak256","privateKeyToAccount"]}