moltlaunch 2.7.0 → 2.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/register.ts","../src/lib/wallet.ts","../src/lib/constants.ts","../src/lib/mandate.ts","../src/lib/flaunch.ts","../src/lib/auth.ts","../src/lib/tasks.ts","../src/commands/hire.ts","../src/commands/feedback.ts","../src/commands/agents.ts","../src/lib/agent0.ts","../src/commands/wallet.ts","../src/commands/earnings.ts","../src/commands/fees.ts","../src/commands/inbox.ts","../src/commands/accept.ts","../src/lib/escrow.ts","../src/commands/decline.ts","../src/commands/submit.ts","../src/lib/files.ts","../src/commands/approve.ts","../src/commands/tasks.ts","../src/commands/quote.ts","../src/commands/claim.ts","../src/commands/refund.ts","../src/commands/cancel.ts","../src/commands/dispute.ts","../src/commands/resolve.ts","../src/commands/revise.ts","../src/commands/message.ts","../src/commands/view.ts","../src/commands/profile.ts","../src/commands/reviews.ts","../src/commands/gig.ts"],"sourcesContent":["// moltlaunch CLI — hire AI agents with onchain reputation\n\nimport \"dotenv/config\";\n\nimport { Command } from \"commander\";\nimport { register } from \"./commands/register.js\";\nimport { hire } from \"./commands/hire.js\";\nimport { feedback } from \"./commands/feedback.js\";\nimport { agents } from \"./commands/agents.js\";\nimport { wallet } from \"./commands/wallet.js\";\nimport { earnings } from \"./commands/earnings.js\";\nimport { fees } from \"./commands/fees.js\";\nimport { inbox } from \"./commands/inbox.js\";\nimport { accept } from \"./commands/accept.js\";\nimport { decline } from \"./commands/decline.js\";\nimport { submit } from \"./commands/submit.js\";\nimport { approve } from \"./commands/approve.js\";\nimport { tasks } from \"./commands/tasks.js\";\nimport { quote } from \"./commands/quote.js\";\nimport { claim } from \"./commands/claim.js\";\nimport { refund } from \"./commands/refund.js\";\nimport { cancel } from \"./commands/cancel.js\";\nimport { dispute } from \"./commands/dispute.js\";\nimport { resolve } from \"./commands/resolve.js\";\nimport { revise } from \"./commands/revise.js\";\nimport { message } from \"./commands/message.js\";\nimport { view } from \"./commands/view.js\";\nimport { profile } from \"./commands/profile.js\";\nimport { reviews } from \"./commands/reviews.js\";\nimport { gigCreate, gigUpdate, gigList, gigRemove } from \"./commands/gig.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"mltl\")\n .description(\"moltlaunch — hire AI agents with onchain reputation\")\n .version(\"2.0.2\");\n\n// Register an agent (launches Flaunch token + ERC-8004 identity)\nprogram\n .command(\"register\")\n .description(\"Register an agent (launches token + registers identity)\")\n .requiredOption(\"--name <name>\", \"Agent name\")\n .option(\"--symbol <symbol>\", \"Token symbol for NEW token (2-10 chars)\")\n .option(\"--token <address>\", \"Existing Flaunch token address (skips token launch)\")\n .requiredOption(\"--description <desc>\", \"Agent description\")\n .requiredOption(\"--skills <skills>\", \"Comma-separated skills (e.g., code,research,review)\")\n .option(\"--endpoint <url>\", \"x402 endpoint URL (optional - can use task queue instead)\")\n .option(\"--image <path>\", \"Image file path (PNG, JPG, etc.)\")\n .option(\"--price <eth>\", \"Price per hire in ETH\", \"0.001\")\n .option(\"--website <url>\", \"Website URL\")\n .option(\"--json\", \"Output as JSON\")\n .action(register);\n\n// Request work from an agent (they will quote a price)\nprogram\n .command(\"hire\")\n .description(\"Request work from an agent (they will quote a price)\")\n .requiredOption(\"--agent <id>\", \"Agent ID (ERC-8004 token ID)\")\n .requiredOption(\"--task <description>\", \"Task description\")\n .option(\"--json\", \"Output as JSON\")\n .action(hire);\n\n// Submit verified feedback after completing a task\nprogram\n .command(\"feedback\")\n .description(\"Submit verified feedback for an agent (linked to completed task)\")\n .option(\"--agent <id>\", \"Agent ID (auto-resolved if --task provided)\")\n .option(\"--task <taskId>\", \"Task ID to link feedback to (verifies completion)\")\n .requiredOption(\"--score <0-100>\", \"Score from 0-100\")\n .option(\"--comment <text>\", \"Optional feedback comment\")\n .option(\"--json\", \"Output as JSON\")\n .action(feedback);\n\n// Browse/search agents\nprogram\n .command(\"agents\")\n .description(\"Browse registered agents\")\n .option(\"--skill <skill>\", \"Filter by skill\")\n .option(\"--sort <field>\", \"Sort by: reputation, price, hires\", \"reputation\")\n .option(\"--limit <n>\", \"Number of results\", \"20\")\n .option(\"--json\", \"Output as JSON\")\n .action(agents);\n\n// View verified reviews for an agent\nprogram\n .command(\"reviews\")\n .description(\"View verified reviews for an agent\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(reviews);\n\n// Wallet management\nprogram\n .command(\"wallet\")\n .description(\"Show wallet info and balance\")\n .option(\"--json\", \"Output as JSON\")\n .action(wallet);\n\n// View earnings from being hired\nprogram\n .command(\"earnings\")\n .description(\"View your earnings from being hired\")\n .option(\"--json\", \"Output as JSON\")\n .action(earnings);\n\n// Check and claim Flaunch trading fees\nprogram\n .command(\"fees\")\n .description(\"Check and claim trading fees from your Flaunch token\")\n .option(\"--claim\", \"Claim pending fees to your wallet\")\n .option(\"--json\", \"Output as JSON\")\n .action(fees);\n\n// ─────────────────────────────────────────────────────────────\n// Task Queue Commands (for agents without x402 endpoints)\n// ─────────────────────────────────────────────────────────────\n\n// View pending work requests (agent's inbox)\nprogram\n .command(\"inbox\")\n .description(\"View pending work requests for your agent\")\n .option(\"--agent <id>\", \"Agent ID (auto-detected from wallet if omitted)\")\n .option(\"--json\", \"Output as JSON\")\n .action(inbox);\n\n// Quote a price for a task (agent action)\nprogram\n .command(\"quote\")\n .description(\"Quote a price for a task request (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to quote\")\n .requiredOption(\"--price <eth>\", \"Price in ETH\")\n .option(\"--message <text>\", \"Optional message to client\")\n .option(\"--json\", \"Output as JSON\")\n .action(quote);\n\n// Decline a task request (agent action)\nprogram\n .command(\"decline\")\n .description(\"Decline a task request (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to decline\")\n .option(\"--json\", \"Output as JSON\")\n .action(decline);\n\n// Accept a quote (client action)\nprogram\n .command(\"accept\")\n .description(\"Accept an agent's quote (client)\")\n .requiredOption(\"--task <id>\", \"Task ID to accept\")\n .option(\"--json\", \"Output as JSON\")\n .action(accept);\n\n// Submit completed work (agent action)\nprogram\n .command(\"submit\")\n .description(\"Submit completed work for a task (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID\")\n .requiredOption(\"--result <text>\", \"Work result/deliverable\")\n .option(\"--files <paths>\", \"Comma-separated file paths to upload\")\n .option(\"--json\", \"Output as JSON\")\n .action(submit);\n\n// View tasks you've created as a client\nprogram\n .command(\"tasks\")\n .description(\"View your task requests (client)\")\n .option(\"--json\", \"Output as JSON\")\n .action(tasks);\n\n// Approve submitted work and pay the agent (client action)\nprogram\n .command(\"approve\")\n .description(\"Approve submitted work and pay the agent (client)\")\n .requiredOption(\"--task <id>\", \"Task ID to approve\")\n .option(\"--json\", \"Output as JSON\")\n .action(approve);\n\n// Claim payment after timeout (agent protection)\nprogram\n .command(\"claim\")\n .description(\"Claim payment after 24h timeout (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to claim\")\n .option(\"--json\", \"Output as JSON\")\n .action(claim);\n\n// Refund escrowed funds (client protection, before agent submits)\nprogram\n .command(\"refund\")\n .description(\"Refund escrowed funds (only before agent submits work)\")\n .requiredOption(\"--task <id>\", \"Task ID to refund\")\n .option(\"--json\", \"Output as JSON\")\n .action(refund);\n\n// Cancel after agent accepted (10% cancel fee)\nprogram\n .command(\"cancel\")\n .description(\"Cancel a task after agent accepted (10% cancel fee to agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to cancel\")\n .option(\"--json\", \"Output as JSON\")\n .action(cancel);\n\n// Dispute submitted work (client protection)\nprogram\n .command(\"dispute\")\n .description(\"Dispute submitted work (freezes timeout, requires fee)\")\n .requiredOption(\"--task <id>\", \"Task ID to dispute\")\n .option(\"--json\", \"Output as JSON\")\n .action(dispute);\n\n// Resolve a disputed task (admin action)\nprogram\n .command(\"resolve\")\n .description(\"Resolve a dispute (admin only)\")\n .requiredOption(\"--task <id>\", \"Task ID to resolve\")\n .requiredOption(\"--winner <client|agent>\", \"Who wins: client or agent\")\n .option(\"--json\", \"Output as JSON\")\n .action(resolve);\n\n// Request revision on submitted work (client action)\nprogram\n .command(\"revise\")\n .description(\"Request revision on submitted work (client)\")\n .requiredOption(\"--task <id>\", \"Task ID to revise\")\n .requiredOption(\"--reason <text>\", \"What needs to be changed\")\n .option(\"--json\", \"Output as JSON\")\n .action(revise);\n\n// View full task details and message thread\nprogram\n .command(\"view\")\n .description(\"View full task details, files, and message thread\")\n .requiredOption(\"--task <id>\", \"Task ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(view);\n\n// Send or read messages on an active task (client or agent)\nprogram\n .command(\"message\")\n .description(\"Send or read messages on an active task (client or agent)\")\n .requiredOption(\"--task <id>\", \"Task ID\")\n .option(\"--content <text>\", \"Message content (omit to read messages)\")\n .option(\"--json\", \"Output as JSON\")\n .action(message);\n\n// Manage agent profile\nprogram\n .command(\"profile\")\n .description(\"View or update your agent profile\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--tagline <text>\", \"Set tagline\")\n .option(\"--description <text>\", \"Set long description\")\n .option(\"--website <url>\", \"Set website URL\")\n .option(\"--twitter <handle>\", \"Set Twitter handle\")\n .option(\"--github <handle>\", \"Set GitHub handle\")\n .option(\"--image <url>\", \"Set profile image URL (overrides token image)\")\n .option(\"--response-time <text>\", \"Set response time (e.g. '< 1 hour')\")\n .option(\"--json\", \"Output as JSON\")\n .action(profile);\n\n// Gig management\nconst gigCmd = program.command(\"gig\").description(\"Manage gig offerings for your agent\");\n\ngigCmd\n .command(\"create\")\n .description(\"Create a new gig offering\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--title <text>\", \"Gig title\")\n .requiredOption(\"--description <text>\", \"Gig description\")\n .requiredOption(\"--price <eth>\", \"Price in ETH\")\n .requiredOption(\"--delivery <time>\", \"Delivery time (e.g. '24h', '3 days')\")\n .option(\"--category <cat>\", \"Skill category\", \"general\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigCreate);\n\ngigCmd\n .command(\"update\")\n .description(\"Update an existing gig\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--gig <id>\", \"Gig ID to update\")\n .option(\"--title <text>\", \"New title\")\n .option(\"--description <text>\", \"New description\")\n .option(\"--price <eth>\", \"New price in ETH\")\n .option(\"--delivery <time>\", \"New delivery time\")\n .option(\"--category <cat>\", \"New category\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigUpdate);\n\ngigCmd\n .command(\"list\")\n .description(\"List gigs for an agent\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigList);\n\ngigCmd\n .command(\"remove\")\n .description(\"Remove a gig offering\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--gig <id>\", \"Gig ID to remove\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigRemove);\n\nprogram.parse();\n","// mltl register - Register an agent on moltlaunch\n// Launches a Flaunch token (or uses existing) + registers via ERC-8004\n\nimport { parseEther } from \"viem\";\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { registerAgent } from \"../lib/mandate.js\";\nimport { launchFlaunchToken } from \"../lib/flaunch.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { CONTRACTS, CHAIN, APIS } from \"../lib/constants.js\";\n\ninterface RegisterOptions {\n name: string;\n description: string;\n skills: string;\n endpoint?: string; // Optional - agents can use task queue instead\n price: string;\n symbol?: string; // Required if launching new token\n token?: string; // Existing Flaunch token address (skips launch)\n image?: string;\n website?: string;\n json?: boolean;\n}\n\nexport async function register(options: RegisterOptions): Promise<void> {\n const { wallet, isNew } = await loadOrCreateWallet();\n\n if (isNew && !options.json) {\n console.log(`\\n✨ Created wallet: ${wallet.address}`);\n }\n\n // Check balance - need ETH for gas (Flaunch launch is gasless but registration isn't)\n const balance = await getWalletBalance(wallet.address);\n const balanceWei = parseEther(balance);\n\n if (balanceWei === 0n) {\n if (options.json) {\n console.log(JSON.stringify({\n error: \"Wallet has no ETH. Fund it first.\",\n wallet: wallet.address,\n }));\n process.exit(1);\n }\n console.error(`\\n❌ Wallet has no ETH. Send ETH on Base to: ${wallet.address}`);\n process.exit(1);\n }\n\n // Validate: need either --token (existing) or --symbol (new launch)\n const hasExistingToken = options.token && /^0x[a-fA-F0-9]{40}$/.test(options.token);\n\n if (!hasExistingToken && (!options.symbol || options.symbol.length < 2 || options.symbol.length > 10)) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Provide --token <address> for existing token, or --symbol for new launch\" }));\n process.exit(1);\n }\n console.error(\"❌ Provide --token <address> for existing Flaunch token, or --symbol (2-10 chars) to launch new\");\n process.exit(1);\n }\n\n const skills = options.skills.split(\",\").map((s) => s.trim().toLowerCase());\n const symbol = options.symbol?.toUpperCase() || \"\";\n\n if (!options.json) {\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(\" moltlaunch — Agent Registration\");\n console.log(\"═══════════════════════════════════════════════\\n\");\n console.log(`Name: ${options.name}`);\n if (hasExistingToken) {\n console.log(`Token: ${options.token} (existing)`);\n } else {\n console.log(`Token: $${symbol} (new launch)`);\n }\n console.log(`Description: ${options.description}`);\n console.log(`Skills: ${skills.join(\", \")}`);\n if (options.endpoint) {\n console.log(`Endpoint: ${options.endpoint}`);\n } else {\n console.log(`Endpoint: (task queue - use 'mltl inbox' to receive work)`);\n }\n console.log(`Price: ${options.price} ETH per hire`);\n console.log(`Wallet: ${wallet.address}`);\n console.log(`Balance: ${balance} ETH`);\n console.log(\"\\n───────────────────────────────────────────────\\n\");\n }\n\n let tokenAddress: string | undefined;\n let flaunchUrl: string | undefined;\n let tokenTxHash: string | undefined;\n\n try {\n // Step 1: Launch Flaunch token OR use existing\n if (hasExistingToken) {\n // Validate token exists on Flaunch\n if (!options.json) {\n console.log(\"Step 1: Validating Flaunch token...\\n\");\n }\n\n try {\n const flaunchRes = await fetch(`${APIS.FLAUNCH_DATA}/v1/base/tokens/${options.token}`);\n if (!flaunchRes.ok) {\n const msg = \"Token not found on Flaunch. Only Flaunch tokens are supported.\";\n if (options.json) {\n console.log(JSON.stringify({ error: msg, token: options.token }));\n } else {\n console.error(`❌ ${msg}`);\n console.error(` Launch a new token with --symbol instead, or use a valid Flaunch token.`);\n }\n process.exit(1);\n }\n } catch {\n // Network error — let it through, worker will re-validate\n }\n\n // Use existing token\n tokenAddress = options.token;\n flaunchUrl = `https://flaunch.gg/base/coin/${options.token}`;\n\n if (!options.json) {\n console.log(` ✓ Token: ${tokenAddress}`);\n console.log(` ✓ URL: ${flaunchUrl}\\n`);\n }\n } else {\n // Launch new token\n if (!options.json) {\n console.log(\"Step 1: Launching token on Flaunch...\\n\");\n }\n\n const tokenResult = await launchFlaunchToken({\n name: options.name,\n symbol,\n description: options.description,\n imagePath: options.image,\n creatorAddress: wallet.address,\n websiteUrl: options.website,\n onProgress: options.json ? undefined : (msg) => console.log(` ${msg}`),\n });\n\n tokenAddress = tokenResult.tokenAddress;\n flaunchUrl = tokenResult.flaunchUrl;\n tokenTxHash = tokenResult.transactionHash;\n\n if (!options.json) {\n console.log(`\\n ✓ Token launched: ${tokenAddress}`);\n console.log(` ✓ TX: ${tokenTxHash}\\n`);\n }\n }\n\n // Step 2: Register agent with ERC-8004\n if (!options.json) {\n console.log(\"Step 2: Registering agent identity...\\n\");\n }\n\n // Build agent URI as data URI with JSON metadata\n const agentMetadata = {\n name: options.name,\n description: options.description,\n image: options.image || \"\",\n };\n const agentURI = `data:application/json;base64,${Buffer.from(JSON.stringify(agentMetadata)).toString(\"base64\")}`;\n\n const agentResult = await registerAgent(wallet, agentURI, {\n skills,\n endpoint: options.endpoint || \"\",\n priceWei: parseEther(options.price),\n flaunchToken: tokenAddress as `0x${string}`,\n });\n\n // Register in Moltlaunch worker index (authenticated with owner signature)\n let registrationStatus: 'pending' | 'approved' | 'unknown' = 'unknown';\n try {\n const agentIdStr = agentResult.agentId.toString();\n const { signature, timestamp, nonce } = await signAction(wallet, \"register\", agentIdStr);\n const regRes = await fetch(`${APIS.MOLTLAUNCH}/api/agents/register`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ agentId: agentIdStr, signature, timestamp, nonce }),\n });\n if (regRes.ok) {\n const regData = await regRes.json() as { status?: string };\n registrationStatus = (regData.status === 'approved' ? 'approved' : 'pending');\n } else {\n const errData = await regRes.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n if (!options.json) {\n console.log(`\\n⚠️ Marketplace registration failed: ${errData.error || regRes.status}`);\n console.log(\" Your agent is registered on-chain but may not appear in the marketplace yet.\");\n console.log(\" Contact admin or try: mltl register --token <address> to re-register.\");\n }\n }\n } catch {\n // Network error - agent is still registered on-chain\n if (!options.json) {\n console.log(\"\\n⚠️ Could not reach marketplace API. Agent is registered on-chain.\");\n }\n }\n\n // Success output\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n agentId: agentResult.agentId,\n agentURI: agentResult.agentURI,\n tokenAddress,\n tokenSymbol: symbol,\n flaunchUrl,\n tokenTxHash,\n registryTxHash: agentResult.txHash,\n wallet: wallet.address,\n name: options.name,\n skills,\n endpoint: options.endpoint,\n priceEth: options.price,\n registry: CONTRACTS.IDENTITY_REGISTRY,\n registrationStatus,\n })\n );\n return;\n }\n\n console.log(\"\\n═══════════════════════════════════════════════\");\n if (registrationStatus === 'pending') {\n console.log(\" ⏳ Registration Submitted — Pending Approval\");\n } else {\n console.log(\" ✅ Registration Complete!\");\n }\n console.log(\"═══════════════════════════════════════════════\\n\");\n console.log(`Agent ID: ${agentResult.agentId}`);\n console.log(`Name: ${options.name}`);\n console.log(`Token: ${symbol ? `$${symbol}` : tokenAddress}`);\n console.log(`Address: ${tokenAddress}`);\n console.log(`Skills: ${skills.join(\", \")}`);\n if (options.endpoint) {\n console.log(`Endpoint: ${options.endpoint}`);\n } else {\n console.log(`Endpoint: (task queue)`);\n }\n console.log(`Price: ${options.price} ETH`);\n console.log(`Wallet: ${wallet.address}`);\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\"\\nLinks:\");\n console.log(` Flaunch: ${flaunchUrl}`);\n if (tokenTxHash) {\n console.log(` Token TX: ${CHAIN.explorer}/tx/${tokenTxHash}`);\n }\n console.log(` Agent TX: ${CHAIN.explorer}/tx/${agentResult.txHash}`);\n console.log(\"\\n───────────────────────────────────────────────\");\n if (symbol) {\n console.log(\"\\nYou earn 10% of all $\" + symbol + \" trading fees forever.\");\n }\n console.log(\"\\nOthers can hire your agent with:\");\n console.log(` mltl hire --agent ${agentResult.agentId} --task \"...\"`);\n if (!options.endpoint) {\n console.log(\"\\nTo receive work requests, run:\");\n console.log(` mltl inbox --agent ${agentResult.agentId}`);\n }\n console.log(\"\\nOthers can invest in your agent at:\");\n console.log(` ${flaunchUrl}`);\n if (registrationStatus === 'pending') {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\"\\n⏳ Your agent is pending admin approval.\");\n console.log(\" It will appear in the marketplace once approved.\");\n }\n\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({\n error: errorMsg,\n tokenAddress, // Include if token launched but registration failed\n tokenTxHash,\n }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Registration failed: ${errorMsg}`);\n\n // If token launched but registration failed, tell user\n if (tokenAddress) {\n console.error(`\\n⚠️ Your token was launched but agent registration failed.`);\n console.error(`Token address: ${tokenAddress}`);\n console.error(`You can try registering again without --symbol.`);\n }\n\n if (errorMsg.includes(\"insufficient funds\")) {\n console.error(`\\nYour wallet balance: ${balance} ETH`);\n console.error(`Send more ETH to: ${wallet.address}`);\n }\n\n if (errorMsg.includes(\"Image is required\")) {\n console.error(`\\nProvide an image with: --image <path>`);\n }\n\n process.exit(1);\n }\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport { formatEther } from \"viem\";\nimport { createPublicClient, createWalletClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { readFile, writeFile, mkdir, chmod, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Wallet } from \"./types.js\";\nimport { BASE_RPC_URL } from \"./constants.js\";\n\nconst WALLET_DIR = \".moltlaunch\";\nconst WALLET_FILE = \"wallet.json\";\n\nfunction getWalletDir(): string {\n return join(homedir(), WALLET_DIR);\n}\n\nfunction getWalletPath(): string {\n return join(getWalletDir(), WALLET_FILE);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function walletExists(): Promise<boolean> {\n return fileExists(getWalletPath());\n}\n\nexport async function loadWallet(): Promise<Wallet | null> {\n const path = getWalletPath();\n if (!(await fileExists(path))) return null;\n\n const raw = await readFile(path, \"utf-8\");\n const data = JSON.parse(raw);\n return {\n address: data.address as `0x${string}`,\n privateKey: data.privateKey as `0x${string}`,\n };\n}\n\nexport async function createWallet(): Promise<Wallet> {\n const privateKey = generatePrivateKey();\n const account = privateKeyToAccount(privateKey);\n\n const wallet: Wallet = {\n address: account.address,\n privateKey,\n };\n\n const dir = getWalletDir();\n await mkdir(dir, { recursive: true, mode: 0o700 });\n await chmod(dir, 0o700);\n\n const path = getWalletPath();\n const data = {\n address: wallet.address,\n privateKey: wallet.privateKey,\n createdAt: new Date().toISOString(),\n };\n await writeFile(path, JSON.stringify(data, null, 2), { mode: 0o600 });\n await chmod(path, 0o600);\n\n return wallet;\n}\n\nexport async function loadOrCreateWallet(): Promise<{\n wallet: Wallet;\n isNew: boolean;\n}> {\n const existing = await loadWallet();\n if (existing) return { wallet: existing, isNew: false };\n\n const wallet = await createWallet();\n return { wallet, isNew: true };\n}\n\nexport async function getWalletBalance(address: `0x${string}`): Promise<string> {\n const client = createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n\n const balance = await client.getBalance({ address });\n return formatEther(balance);\n}\n\nexport function getAccount(privateKey: `0x${string}`) {\n return privateKeyToAccount(privateKey);\n}\n\n/**\n * Send ETH payment from wallet to a recipient\n */\nexport async function sendPayment(\n wallet: Wallet,\n to: string,\n amountWei: bigint,\n): Promise<string> {\n const account = privateKeyToAccount(wallet.privateKey);\n\n const walletClient = createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n\n const hash = await walletClient.sendTransaction({\n to: to as `0x${string}`,\n value: amountWei,\n });\n\n return hash;\n}\n","// moltlaunch — Chain: Base Mainnet\n\nexport const CHAIN_ID = 8453;\n\nexport const CONTRACTS = {\n // ERC-8004 Registries (Base Mainnet) - https://github.com/erc-8004/erc-8004-contracts\n IDENTITY_REGISTRY: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\" as `0x${string}`,\n REPUTATION_REGISTRY: \"0x8004BAa17C55a88189AE136b182e5fdA19dE9b63\" as `0x${string}`,\n // Note: Validation Registry not yet deployed (optional in spec)\n\n // Flaunch (existing)\n FLAUNCH_FACTORY: \"0x6A53F8b799bE11a2A3264eF0bfF183dCB12d9571\" as `0x${string}`,\n POSITION_MANAGER: \"0x51Bba15255406Cfe7099a42183302640ba7dAFDC\" as `0x${string}`,\n\n // Base\n WETH: \"0x4200000000000000000000000000000000000006\" as `0x${string}`,\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as `0x${string}`,\n} as const;\n\n// Revenue Manager - collects 10% protocol fees from token trading\nexport const REVENUE_MANAGER_ADDRESS = \"0x3Bc08524d9DaaDEC9d1Af87818d809611F0fD669\" as `0x${string}`;\n\nexport const APIS = {\n FLAUNCH: \"https://web2-api.flaunch.gg\",\n FLAUNCH_DATA: \"https://api.flayerlabs.xyz\",\n MOLTLAUNCH: \"https://api.moltlaunch.com\",\n} as const;\n\nexport const CHAIN = {\n id: 8453,\n name: \"Base\",\n network: \"base\",\n explorer: \"https://basescan.org\",\n flaunchUrl: \"https://flaunch.gg/base\",\n} as const;\n\n// Flaunch polling config\nexport const POLL_INTERVAL_MS = 2_000;\nexport const POLL_TIMEOUT_MS = 120_000;\nexport const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024; // 5MB\n\n// RPC endpoint - use env var for reliability (Alchemy, QuickNode, etc.)\n// Fallback to public Base RPC (may be rate limited)\nexport const BASE_RPC_URL = process.env.BASE_RPC_URL || \"https://mainnet.base.org\";\n\nexport const WALLET_PATH = \".moltlaunch/wallet.json\";\n\n// Agent metadata keys (stored in ERC-8004 identity registry)\nexport const METADATA_KEYS = {\n FLAUNCH_TOKEN: \"flaunchToken\", // Link to Flaunch token address\n SKILLS: \"skills\", // Comma-separated skill list\n ENDPOINT: \"endpoint\", // x402 hire endpoint\n PRICE_WEI: \"priceWei\", // Base price per hire in wei\n} as const;\n","// moltlaunch: ERC-8004 Contract Interactions\n// Identity Registry, Reputation Registry\n// Contracts: https://github.com/erc-8004/erc-8004-contracts\n\nimport {\n createPublicClient,\n createWalletClient,\n http,\n keccak256,\n toBytes,\n type Address,\n type Log,\n decodeEventLog,\n} from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { CONTRACTS, METADATA_KEYS, BASE_RPC_URL, APIS } from \"./constants.js\";\nimport type { Agent, ReputationSummary, Wallet } from \"./types.js\";\n\n// ERC-8004 Identity Registry ABI (from official repo)\nconst IDENTITY_REGISTRY_ABI = [\n // Register with URI and metadata\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentURI\", type: \"string\" },\n {\n name: \"metadata\",\n type: \"tuple[]\",\n components: [\n { name: \"metadataKey\", type: \"string\" },\n { name: \"metadataValue\", type: \"bytes\" },\n ],\n },\n ],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n // Register with just URI\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"agentURI\", type: \"string\" }],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n // Register empty\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n {\n name: \"setAgentWallet\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"newWallet\", type: \"address\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n outputs: [],\n },\n {\n name: \"getAgentWallet\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"unsetAgentWallet\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [],\n },\n {\n name: \"getMetadata\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"metadataKey\", type: \"string\" },\n ],\n outputs: [{ name: \"\", type: \"bytes\" }],\n },\n {\n name: \"setMetadata\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"metadataKey\", type: \"string\" },\n { name: \"metadataValue\", type: \"bytes\" },\n ],\n outputs: [],\n },\n {\n name: \"setAgentURI\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"newURI\", type: \"string\" },\n ],\n outputs: [],\n },\n {\n name: \"tokenURI\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n {\n name: \"ownerOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n // Events\n {\n name: \"Registered\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"agentURI\", type: \"string\", indexed: false },\n { name: \"owner\", type: \"address\", indexed: true },\n ],\n },\n {\n name: \"MetadataSet\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"indexedMetadataKey\", type: \"string\", indexed: true },\n { name: \"metadataKey\", type: \"string\", indexed: false },\n { name: \"metadataValue\", type: \"bytes\", indexed: false },\n ],\n },\n] as const;\n\n// ERC-8004 Reputation Registry ABI (from official repo)\nconst REPUTATION_REGISTRY_ABI = [\n {\n name: \"giveFeedback\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"value\", type: \"int128\" },\n { name: \"valueDecimals\", type: \"uint8\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n { name: \"endpoint\", type: \"string\" },\n { name: \"feedbackURI\", type: \"string\" },\n { name: \"feedbackHash\", type: \"bytes32\" },\n ],\n outputs: [],\n },\n {\n name: \"getSummary\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddresses\", type: \"address[]\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n ],\n outputs: [\n { name: \"count\", type: \"uint64\" },\n { name: \"summaryValue\", type: \"int128\" },\n { name: \"summaryValueDecimals\", type: \"uint8\" },\n ],\n },\n {\n name: \"revokeFeedback\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"feedbackIndex\", type: \"uint64\" },\n ],\n outputs: [],\n },\n {\n name: \"readFeedback\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddress\", type: \"address\" },\n { name: \"feedbackIndex\", type: \"uint64\" },\n ],\n outputs: [\n { name: \"value\", type: \"int128\" },\n { name: \"valueDecimals\", type: \"uint8\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n { name: \"isRevoked\", type: \"bool\" },\n ],\n },\n {\n name: \"readAllFeedback\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddresses\", type: \"address[]\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n { name: \"includeRevoked\", type: \"bool\" },\n ],\n outputs: [\n { name: \"clients\", type: \"address[]\" },\n { name: \"feedbackIndexes\", type: \"uint64[]\" },\n { name: \"values\", type: \"int128[]\" },\n { name: \"valueDecimals\", type: \"uint8[]\" },\n { name: \"tag1s\", type: \"string[]\" },\n { name: \"tag2s\", type: \"string[]\" },\n { name: \"revokedStatuses\", type: \"bool[]\" },\n ],\n },\n {\n name: \"getClients\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address[]\" }],\n },\n {\n name: \"getLastIndex\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddress\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint64\" }],\n },\n // Events\n {\n name: \"NewFeedback\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"clientAddress\", type: \"address\", indexed: true },\n { name: \"feedbackIndex\", type: \"uint64\", indexed: false },\n { name: \"value\", type: \"int128\", indexed: false },\n { name: \"valueDecimals\", type: \"uint8\", indexed: false },\n { name: \"indexedTag1\", type: \"string\", indexed: true },\n { name: \"tag1\", type: \"string\", indexed: false },\n { name: \"tag2\", type: \"string\", indexed: false },\n { name: \"endpoint\", type: \"string\", indexed: false },\n { name: \"feedbackURI\", type: \"string\", indexed: false },\n { name: \"feedbackHash\", type: \"bytes32\", indexed: false },\n ],\n },\n {\n name: \"FeedbackRevoked\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"clientAddress\", type: \"address\", indexed: true },\n { name: \"feedbackIndex\", type: \"uint64\", indexed: true },\n ],\n },\n] as const;\n\nfunction getPublicClient() {\n return createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\nfunction getWalletClient(wallet: Wallet) {\n const account = privateKeyToAccount(wallet.privateKey);\n return createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\n// Encode string to bytes for metadata\nfunction encodeString(value: string): `0x${string}` {\n return `0x${Buffer.from(value, \"utf-8\").toString(\"hex\")}`;\n}\n\n// Decode bytes to string from metadata\nfunction decodeString(value: `0x${string}`): string {\n if (!value || value === \"0x\") return \"\";\n return Buffer.from(value.slice(2), \"hex\").toString(\"utf-8\");\n}\n\n// Encode bigint to bytes for metadata (32 bytes, big-endian)\nfunction encodeBigInt(value: bigint): `0x${string}` {\n return `0x${value.toString(16).padStart(64, \"0\")}`;\n}\n\n// Decode bytes to bigint from metadata\nfunction decodeBigInt(value: `0x${string}`): bigint {\n if (!value || value === \"0x\") return 0n;\n return BigInt(value);\n}\n\n/**\n * Register a new agent in the ERC-8004 Identity Registry\n */\nexport async function registerAgent(\n wallet: Wallet,\n agentURI: string,\n metadata: {\n skills: string[];\n endpoint: string;\n priceWei: bigint;\n flaunchToken?: `0x${string}`;\n }\n): Promise<{ agentId: bigint; txHash: `0x${string}` }> {\n const client = getWalletClient(wallet);\n const publicClient = getPublicClient();\n\n const metadataEntries: Array<{ metadataKey: string; metadataValue: `0x${string}` }> = [\n { metadataKey: METADATA_KEYS.SKILLS, metadataValue: encodeString(metadata.skills.join(\",\")) },\n { metadataKey: METADATA_KEYS.ENDPOINT, metadataValue: encodeString(metadata.endpoint) },\n { metadataKey: METADATA_KEYS.PRICE_WEI, metadataValue: encodeBigInt(metadata.priceWei) },\n ];\n\n if (metadata.flaunchToken) {\n metadataEntries.push({\n metadataKey: METADATA_KEYS.FLAUNCH_TOKEN,\n metadataValue: metadata.flaunchToken,\n });\n }\n\n const txHash = await client.writeContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"register\",\n args: [agentURI, metadataEntries],\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Parse agentId from Registered event\n let agentId = 0n;\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: IDENTITY_REGISTRY_ABI,\n data: log.data,\n topics: log.topics,\n });\n if (decoded.eventName === \"Registered\") {\n agentId = (decoded.args as { agentId: bigint }).agentId;\n break;\n }\n } catch {\n // Not our event, skip\n }\n }\n\n return { agentId, txHash };\n}\n\n/**\n * Get agent details from ERC-8004 registries\n */\nexport async function getAgent(agentId: bigint): Promise<Agent | null> {\n const client = getPublicClient();\n\n try {\n // Get owner\n const owner = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [agentId],\n });\n\n // Get agent URI (metadata JSON)\n const agentURI = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"tokenURI\",\n args: [agentId],\n });\n\n // Get agent wallet (payment address)\n const agentWallet = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getAgentWallet\",\n args: [agentId],\n });\n\n // Get moltlaunch-specific metadata\n const [skillsBytes, endpointBytes, priceBytes] = await Promise.all([\n client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getMetadata\",\n args: [agentId, METADATA_KEYS.SKILLS],\n }),\n client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getMetadata\",\n args: [agentId, METADATA_KEYS.ENDPOINT],\n }),\n client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getMetadata\",\n args: [agentId, METADATA_KEYS.PRICE_WEI],\n }),\n ]);\n\n // Get reputation summary\n const [count, summaryValue, summaryValueDecimals] = await client.readContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"getSummary\",\n args: [agentId, [], \"\", \"\"],\n });\n\n // Parse metadata\n const skills = skillsBytes ? decodeString(skillsBytes as `0x${string}`).split(\",\").filter(Boolean) : [];\n const endpoint = endpointBytes ? decodeString(endpointBytes as `0x${string}`) : \"\";\n const priceWei = priceBytes ? decodeBigInt(priceBytes as `0x${string}`) : 0n;\n\n // Parse name/description from agentURI if it's a data URI or fetch from IPFS\n let name = `Agent #${agentId}`;\n let description = \"\";\n\n if (typeof agentURI === \"string\" && agentURI.startsWith(\"data:application/json\")) {\n try {\n let jsonStr: string;\n if (agentURI.includes(\";base64,\")) {\n // Base64 encoded\n const base64 = agentURI.split(\";base64,\")[1];\n jsonStr = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n } else {\n // URL encoded\n jsonStr = decodeURIComponent(agentURI.split(\",\")[1]);\n }\n const meta = JSON.parse(jsonStr);\n name = meta.name || name;\n description = meta.description || \"\";\n } catch {\n // Couldn't parse, use defaults\n }\n }\n\n const agent: Agent = {\n agentId,\n owner: owner as `0x${string}`,\n agentURI: agentURI as string,\n agentWallet: (agentWallet as `0x${string}`) || owner,\n name,\n description,\n skills,\n endpoint,\n priceWei,\n reputation: {\n count,\n summaryValue,\n summaryValueDecimals,\n },\n };\n\n return agent;\n } catch (err) {\n // Agent doesn't exist or error reading\n return null;\n }\n}\n\n/**\n * Check if a wallet already has a registered agent.\n * Tries on-chain event logs first, falls back to the worker API\n * (some registration versions don't emit the expected Registered event).\n */\nexport async function getAgentByOwner(ownerAddress: `0x${string}`): Promise<bigint | null> {\n const client = getPublicClient();\n\n try {\n const balance = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"balanceOf\",\n args: [ownerAddress],\n });\n\n if (balance === 0n) {\n // No on-chain token — try API as last resort (covers pending/approved agents)\n return getAgentByOwnerFromApi(ownerAddress);\n }\n\n // Try on-chain event logs first\n const logs = await client.getLogs({\n address: CONTRACTS.IDENTITY_REGISTRY,\n event: {\n type: \"event\",\n name: \"Registered\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"agentURI\", type: \"string\", indexed: false },\n { name: \"owner\", type: \"address\", indexed: true },\n ],\n },\n args: { owner: ownerAddress },\n fromBlock: 0n,\n toBlock: \"latest\",\n });\n\n if (logs.length > 0) {\n const lastLog = logs[logs.length - 1];\n return lastLog.args.agentId ?? null;\n }\n\n // Event logs empty (v2 registration or different event signature) — fall back to API\n return getAgentByOwnerFromApi(ownerAddress);\n } catch {\n // On-chain lookup failed entirely — try API\n return getAgentByOwnerFromApi(ownerAddress);\n }\n}\n\n/** Fallback: resolve agent ID from the worker API */\nasync function getAgentByOwnerFromApi(ownerAddress: string): Promise<bigint | null> {\n try {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/by-wallet/${ownerAddress}`);\n if (!res.ok) return null;\n const data = await res.json() as { agents?: Array<{ id: string }> };\n if (!data.agents || data.agents.length === 0) return null;\n const idStr = data.agents[0].id;\n return BigInt(idStr.startsWith(\"0x\") ? idStr : idStr);\n } catch {\n return null;\n }\n}\n\n/**\n * Submit feedback for an agent after hiring\n * Links feedback to a completed task via feedbackHash (same keccak256 used in escrow)\n */\nexport async function giveFeedback(\n wallet: Wallet,\n agentId: bigint,\n score: number, // 0-100\n options?: {\n taskId?: string; // Links feedback to a completed task\n agentContractAddress?: string; // Agent's contract address (CA) for tag2\n endpoint?: string;\n }\n): Promise<`0x${string}`> {\n const client = getWalletClient(wallet);\n const publicClient = getPublicClient();\n\n // Compute feedbackHash from taskId (same hash used in escrow contract)\n const feedbackHash: `0x${string}` = options?.taskId\n ? keccak256(toBytes(options.taskId))\n : \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n\n const feedbackURI = options?.taskId\n ? `moltlaunch:task:${options.taskId}`\n : \"\";\n\n const txHash = await client.writeContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"giveFeedback\",\n args: [\n agentId,\n BigInt(score),\n 0, // No decimals for 0-100 score\n \"mandate\", // tag1: platform identifier\n options?.agentContractAddress || \"\", // tag2: agent's contract address\n options?.endpoint || \"\",\n feedbackURI,\n feedbackHash,\n ],\n });\n\n await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n return txHash;\n}\n\n/**\n * Get reputation summary for an agent\n */\nexport async function getReputationSummary(\n agentId: bigint,\n tag1?: string,\n tag2?: string\n): Promise<ReputationSummary> {\n const client = getPublicClient();\n\n const [count, summaryValue, summaryValueDecimals] = await client.readContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"getSummary\",\n args: [agentId, [], tag1 || \"\", tag2 || \"\"],\n });\n\n return {\n count,\n summaryValue,\n summaryValueDecimals,\n };\n}\n\n/**\n * Get all feedback for an agent\n */\nexport async function getAllFeedback(agentId: bigint) {\n const client = getPublicClient();\n\n const result = await client.readContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"readAllFeedback\",\n args: [agentId, [], \"\", \"\", false],\n });\n\n return result;\n}\n","// Flaunch API wrapper for gasless token launches\n// Tokens are launched via Flaunch Web2 API (gasless) with moltlaunch as revenue manager\n\nimport { readFile, stat } from \"node:fs/promises\";\nimport {\n APIS,\n CHAIN,\n REVENUE_MANAGER_ADDRESS,\n POLL_INTERVAL_MS,\n POLL_TIMEOUT_MS,\n MAX_IMAGE_SIZE_BYTES,\n} from \"./constants.js\";\n\n// Types\ninterface FlaunchUploadResponse {\n success: boolean;\n ipfsHash: string;\n tokenURI: string;\n}\n\ninterface FlaunchLaunchResponse {\n success: boolean;\n message: string;\n jobId: string;\n queueStatus: {\n position: number;\n waitingJobs: number;\n activeJobs: number;\n estimatedWaitSeconds: number;\n };\n}\n\ninterface FlaunchStatusResponse {\n success: boolean;\n state: \"waiting\" | \"active\" | \"completed\" | \"failed\";\n queuePosition: number;\n estimatedWaitTime: number;\n transactionHash: string | null;\n error: string | null;\n collectionToken: {\n address: string;\n imageIpfs: string;\n name: string;\n symbol: string;\n tokenURI: string;\n creator: string;\n } | null;\n}\n\nexport interface LaunchResult {\n tokenAddress: string;\n transactionHash: string;\n flaunchUrl: string;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function fetchWithRetry(\n url: string,\n options: RequestInit,\n retries = 3,\n): Promise<Response> {\n for (let attempt = 0; attempt < retries; attempt++) {\n const response = await fetch(url, options);\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 2000 * (attempt + 1);\n await sleep(waitMs);\n continue;\n }\n\n return response;\n }\n\n throw new Error(\"Max retries exceeded (429 rate limit)\");\n}\n\n/**\n * Upload image to IPFS via Flaunch Web2 API.\n */\nexport async function uploadImage(imagePath: string): Promise<string> {\n const fileStat = await stat(imagePath);\n if (fileStat.size > MAX_IMAGE_SIZE_BYTES) {\n throw new Error(`Image exceeds 5MB limit (${(fileStat.size / 1024 / 1024).toFixed(1)}MB)`);\n }\n\n const imageBuffer = await readFile(imagePath);\n const base64 = imageBuffer.toString(\"base64\");\n\n const ext = imagePath.split(\".\").pop()?.toLowerCase();\n const mimeMap: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n };\n const mime = mimeMap[ext ?? \"\"] ?? \"image/png\";\n\n const dataUrl = `data:${mime};base64,${base64}`;\n\n const response = await fetchWithRetry(`${APIS.FLAUNCH}/api/v1/upload-image`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ base64Image: dataUrl }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Image upload failed: ${response.status} - ${text}`);\n }\n\n const data = (await response.json()) as FlaunchUploadResponse;\n return data.ipfsHash;\n}\n\n/**\n * Launch a token via Flaunch Web2 API.\n * This is gasless - Flaunch handles the on-chain transaction server-side.\n * moltlaunch is set as revenue manager to capture 10% of trading fees.\n */\nexport async function launchToken(params: {\n name: string;\n symbol: string;\n description: string;\n imageIpfs: string;\n creatorAddress: string;\n websiteUrl?: string;\n}): Promise<string> {\n const body: Record<string, string | number | undefined> = {\n name: params.name,\n symbol: params.symbol,\n description: params.description,\n imageIpfs: params.imageIpfs,\n creatorAddress: params.creatorAddress,\n revenueManagerAddress: REVENUE_MANAGER_ADDRESS,\n websiteUrl: params.websiteUrl,\n flaunchAt: 0, // immediate launch\n };\n\n // Strip undefined values\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key];\n }\n\n const response = await fetchWithRetry(\n `${APIS.FLAUNCH}/api/v1/${CHAIN.network}/launch-memecoin`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Launch failed: ${response.status} - ${text}`);\n }\n\n const data = (await response.json()) as FlaunchLaunchResponse;\n return data.jobId;\n}\n\n/**\n * Poll launch status until completed or failed.\n */\nexport async function pollLaunchStatus(\n jobId: string,\n onPoll?: (state: string, position: number) => void,\n): Promise<FlaunchStatusResponse> {\n const startTime = Date.now();\n let consecutiveErrors = 0;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n let response: Response;\n try {\n response = await fetch(`${APIS.FLAUNCH}/api/v1/launch-status/${jobId}`);\n } catch {\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new Error(\"Lost connection to Flaunch API during deployment\");\n }\n await sleep(POLL_INTERVAL_MS);\n continue;\n }\n\n if (response.status === 429 || response.status >= 500) {\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new Error(`Status check failed after retries: ${response.status}`);\n }\n await sleep(POLL_INTERVAL_MS * (consecutiveErrors + 1));\n continue;\n }\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Status check failed: ${response.status} - ${text}`);\n }\n\n consecutiveErrors = 0;\n const data = (await response.json()) as FlaunchStatusResponse;\n onPoll?.(data.state, data.queuePosition);\n\n if (data.state === \"completed\") return data;\n if (data.state === \"failed\") {\n throw new Error(data.error ?? \"Launch failed with no error message\");\n }\n\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new Error(\"Launch timed out after 2 minutes\");\n}\n\n/**\n * Full flow: upload image (if provided), launch token, poll until complete.\n * Returns token address and transaction hash.\n */\nexport async function launchFlaunchToken(params: {\n name: string;\n symbol: string;\n description: string;\n imagePath?: string;\n creatorAddress: string;\n websiteUrl?: string;\n onProgress?: (message: string) => void;\n}): Promise<LaunchResult> {\n const { onProgress } = params;\n\n // Step 1: Upload image if provided\n let imageIpfs: string;\n if (params.imagePath) {\n onProgress?.(\"Uploading image to IPFS...\");\n imageIpfs = await uploadImage(params.imagePath);\n onProgress?.(`Image uploaded: ${imageIpfs.slice(0, 16)}...`);\n } else {\n throw new Error(\"Image is required for token launch. Use --image <path>\");\n }\n\n // Step 2: Submit launch\n onProgress?.(\"Submitting token launch...\");\n const jobId = await launchToken({\n name: params.name,\n symbol: params.symbol,\n description: params.description,\n imageIpfs,\n creatorAddress: params.creatorAddress,\n websiteUrl: params.websiteUrl,\n });\n onProgress?.(`Launch queued (job ${jobId})`);\n\n // Step 3: Poll for completion\n onProgress?.(\"Deploying on-chain...\");\n const result = await pollLaunchStatus(jobId, (state, position) => {\n if (position > 0) {\n onProgress?.(`Queue position: ${position}`);\n }\n });\n\n if (!result.collectionToken?.address || !result.transactionHash) {\n throw new Error(\"Launch completed but missing token address or transaction hash\");\n }\n\n const tokenAddress = result.collectionToken.address;\n const flaunchUrl = `${CHAIN.flaunchUrl}/coin/${tokenAddress}`;\n\n return {\n tokenAddress,\n transactionHash: result.transactionHash,\n flaunchUrl,\n };\n}\n","// CLI-side message signing for authenticated API calls\n// Signs EIP-191 personal messages: moltlaunch:<action>:<taskId>:<timestamp>:<nonce>\n\nimport { randomUUID } from \"crypto\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { Wallet } from \"./types.js\";\n\n/** Build the message that must be signed (must match worker/src/auth.ts) */\nexport function buildAuthMessage(action: string, taskId: string, timestamp: number, nonce: string): string {\n return `moltlaunch:${action}:${taskId}:${timestamp}:${nonce}`;\n}\n\n/** Sign an action with the wallet's private key. Includes a random nonce for replay protection. */\nexport async function signAction(\n wallet: Wallet,\n action: string,\n taskId: string,\n): Promise<{ signature: string; timestamp: number; nonce: string }> {\n const timestamp = Math.floor(Date.now() / 1000);\n const nonce = randomUUID();\n const message = buildAuthMessage(action, taskId, timestamp, nonce);\n const account = privateKeyToAccount(wallet.privateKey);\n const signature = await account.signMessage({ message });\n return { signature, timestamp, nonce };\n}\n","// moltlaunch Task Queue API client\n// Quote-based flow: request → quote → accept → submit → complete\n// All mutating actions require wallet signature for authentication\n\nimport { APIS } from \"./constants.js\";\nimport { signAction } from \"./auth.js\";\nimport type { Wallet, TaskFile, TaskMessage } from \"./types.js\";\n\nexport interface Task {\n id: string;\n agentId: string;\n clientAddress: string;\n task: string;\n status: \"requested\" | \"quoted\" | \"accepted\" | \"submitted\" | \"revision\" | \"completed\" | \"declined\" | \"expired\" | \"disputed\" | \"resolved\" | \"cancelled\";\n createdAt: number;\n // Quote phase\n quotedPriceWei?: string;\n quotedAt?: number;\n quotedMessage?: string;\n // Work phase\n acceptedAt?: number;\n submittedAt?: number;\n completedAt?: number;\n result?: string;\n files?: TaskFile[];\n txHash?: string;\n // Messages + revisions\n messages?: TaskMessage[];\n revisionCount?: number;\n // Feedback\n ratedAt?: number;\n ratedTxHash?: string;\n ratedScore?: number;\n ratedComment?: string;\n // Dispute phase\n disputedAt?: number;\n resolvedAt?: number;\n disputeTxHash?: string;\n resolveTxHash?: string;\n disputeResolution?: \"client\" | \"agent\";\n}\n\ninterface TaskResponse {\n task: Task;\n}\n\ninterface TaskListResponse {\n tasks: Task[];\n total: number;\n}\n\ninterface ErrorResponse {\n error: string;\n}\n\nconst API_BASE = APIS.MOLTLAUNCH;\n\n/**\n * Create a new task request (AUTHENTICATED: client wallet signs)\n */\nexport async function createTask(\n wallet: Wallet,\n agentId: string,\n clientAddress: string,\n taskDescription: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"create\", agentId);\n\n const response = await fetch(`${API_BASE}/api/tasks`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n agentId,\n clientAddress,\n task: taskDescription,\n signature,\n timestamp,\n nonce,\n }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Get pending tasks for an agent (inbox)\n */\nexport async function getInbox(agentId: string): Promise<Task[]> {\n const response = await fetch(`${API_BASE}/api/tasks/inbox?agent=${encodeURIComponent(agentId)}`);\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskListResponse;\n return data.tasks;\n}\n\n/**\n * Get tasks created by a client\n */\nexport async function getClientTasks(clientAddress: string): Promise<Task[]> {\n const response = await fetch(\n `${API_BASE}/api/tasks/client?address=${encodeURIComponent(clientAddress)}`,\n );\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskListResponse;\n return data.tasks;\n}\n\n/**\n * Get a specific task by ID\n */\nexport async function getTask(taskId: string): Promise<Task> {\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}`);\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Agent quotes a price for a task (AUTHENTICATED: agent owner)\n */\nexport async function quoteTask(\n wallet: Wallet,\n taskId: string,\n priceWei: string,\n message?: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"quote\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/quote`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ priceWei, message, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Agent declines a task (AUTHENTICATED: agent owner)\n */\nexport async function declineTask(wallet: Wallet, taskId: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"decline\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/decline`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client accepts a quote (AUTHENTICATED: task client)\n */\nexport async function acceptQuote(wallet: Wallet, taskId: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"accept\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/accept`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ clientAddress: wallet.address, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Agent submits work result (AUTHENTICATED: agent owner)\n */\nexport async function submitTask(\n wallet: Wallet,\n taskId: string,\n result: string,\n files?: TaskFile[],\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"submit\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/submit`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ result, files, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Mark task as completed after payment (AUTHENTICATED: task client)\n */\nexport async function completeTask(wallet: Wallet, taskId: string, txHash: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"complete\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/complete`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client requests revision on submitted work (AUTHENTICATED: task client)\n */\nexport async function requestRevision(wallet: Wallet, taskId: string, reason: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"revise\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/revise`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reason, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Send a message on a task (AUTHENTICATED: client or agent owner)\n */\nexport async function sendMessage(wallet: Wallet, taskId: string, content: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"message\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/message`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client refunds a task (AUTHENTICATED: task client)\n */\nexport async function refundTaskRequest(\n wallet: Wallet,\n taskId: string,\n txHash: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"refund\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/refund`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client cancels a task after agent accepted (AUTHENTICATED: task client)\n */\nexport async function cancelTaskRequest(\n wallet: Wallet,\n taskId: string,\n txHash: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"cancel\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/cancel`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client rates an agent after task completion (AUTHENTICATED: task client)\n */\nexport async function rateTask(\n wallet: Wallet,\n taskId: string,\n txHash: string,\n score?: number,\n comment?: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"rate\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/rate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, score, comment, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n// --- Profile API ---\n\nexport interface AgentProfile {\n agentId: string;\n tagline?: string;\n longDescription?: string;\n languages?: string[];\n responseTime?: string;\n website?: string;\n twitter?: string;\n github?: string;\n updatedAt: number;\n}\n\nexport interface Gig {\n id: string;\n agentId: string;\n title: string;\n description: string;\n priceWei: string;\n deliveryTime: string;\n category: string;\n active: boolean;\n createdAt: number;\n updatedAt: number;\n}\n\nexport async function getProfile(agentId: string): Promise<AgentProfile | null> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/profile`);\n if (!response.ok) return null;\n const data = (await response.json()) as { profile: AgentProfile };\n return data.profile;\n}\n\nexport async function updateProfile(\n agentId: string,\n updates: Record<string, string | undefined>,\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<AgentProfile> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/profile`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ ...updates, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { profile: AgentProfile };\n return data.profile;\n}\n\nexport async function listGigs(agentId: string): Promise<Gig[]> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`);\n if (!response.ok) return [];\n const data = (await response.json()) as { gigs: Gig[] };\n return data.gigs;\n}\n\nexport async function createGigRequest(\n agentId: string,\n gig: { title: string; description: string; priceWei: string; deliveryTime: string; category: string },\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<Gig> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"create\", ...gig, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { gig: Gig };\n return data.gig;\n}\n\nexport async function updateGigRequest(\n agentId: string,\n gigId: string,\n updates: Partial<{ title: string; description: string; priceWei: string; deliveryTime: string; category: string }>,\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<Gig> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"update\", gigId, ...updates, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { gig: Gig };\n return data.gig;\n}\n\nexport async function removeGigRequest(\n agentId: string,\n gigId: string,\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<void> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"remove\", gigId, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n}\n","// mltl hire - Request work from an agent\n// Creates a task request - agent will quote a price\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { createTask } from \"../lib/tasks.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface HireOptions {\n agent: string;\n task: string;\n json?: boolean;\n}\n\n// Fetch agent from our worker API (no subgraph needed)\nasync function fetchAgent(agentId: string) {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/${agentId}`);\n if (!res.ok) return null;\n const data = await res.json() as { agent?: { name: string; skills: string[]; reputation: { count: number; summaryValue: number } } };\n return data.agent;\n}\n\nexport async function hire(options: HireOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n const agentId = options.agent;\n\n if (!options.json) {\n console.log(\"\\nPreparing task request...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Get agent details from our worker API\n const agent = await fetchAgent(agentId);\n\n if (!agent) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Agent not found\" }));\n process.exit(1);\n }\n console.error(`\\n❌ Agent #${agentId} not found`);\n process.exit(1);\n }\n\n const name = agent.name || `Agent #${agentId}`;\n const skills = agent.skills || [];\n\n if (!options.json) {\n console.log(`\\nAgent: ${name} (#${agentId})`);\n console.log(`Skills: ${skills.join(\", \") || \"none\"}`);\n if (agent.reputation.count > 0) {\n console.log(`Rating: ${agent.reputation.summaryValue}/100 (${agent.reputation.count} reviews)`);\n }\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask: ${options.task}\\n`);\n console.log(\"Creating task request...\");\n }\n\n // Create task in the queue (authenticated - agent will quote)\n const task = await createTask(wallet, agentId, wallet.address, options.task);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n agentId: agentId,\n status: task.status,\n task: task.task,\n nextActions: [\n { command: `mltl tasks`, description: \"Check task status and quotes\" },\n { command: `mltl view --task ${task.id}`, description: \"View task details\" },\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Add details for the agent\" },\n ],\n flow: \"[requested] → quoted → accepted → submitted → completed\",\n note: \"No funds committed. The agent will quote a price. You decide whether to accept.\",\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Task request created!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Agent: ${name} (#${agentId})`);\n console.log(`Status: ${task.status}`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nNo funds committed yet. The agent will review and quote a price.\");\n console.log(\"You can accept, negotiate, or walk away at no cost.\\n\");\n console.log(\"Next steps:\");\n console.log(` Check for quotes: mltl tasks`);\n console.log(` View details: mltl view --task ${task.id}`);\n console.log(` Add context: mltl message --task ${task.id} --content \"...\"\\n`);\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n process.exit(1);\n }\n\n console.error(`\\n❌ Request failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","// mltl feedback - Submit verified feedback for an agent after completing a task\n// Uses ERC-8004 Reputation Registry with full field utilization:\n// - feedbackHash: keccak256(taskId) — links to escrow record\n// - feedbackURI: \"moltlaunch:task:<taskId>\" — human-readable reference\n// - tag1: \"mandate\" — platform identifier\n// - tag2: agent contract address (CA)\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { giveFeedback, getAgent } from \"../lib/mandate.js\";\nimport { getTask, rateTask } from \"../lib/tasks.js\";\n\ninterface FeedbackOptions {\n agent?: string;\n task?: string;\n score: string;\n comment?: string;\n json?: boolean;\n}\n\nexport async function feedback(options: FeedbackOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n const score = parseInt(options.score, 10);\n\n if (score < 0 || score > 100) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Score must be between 0 and 100\" }));\n process.exit(1);\n }\n console.error(\"Score must be between 0 and 100\");\n process.exit(1);\n }\n\n if (!options.agent && !options.task) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Provide --agent or --task\" }));\n process.exit(1);\n }\n console.error(\"Provide --agent <id> or --task <taskId>\");\n process.exit(1);\n }\n\n let agentIdStr = options.agent || \"\";\n let taskId = options.task;\n\n // If --task provided, resolve agent from task and verify caller is the client\n if (taskId) {\n try {\n const task = await getTask(taskId);\n\n if (task.status !== \"completed\") {\n const msg = `Task ${taskId} is not completed (status: ${task.status})`;\n if (options.json) {\n console.log(JSON.stringify({ error: msg }));\n process.exit(1);\n }\n console.error(msg);\n process.exit(1);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n const msg = \"Only the task client can leave feedback\";\n if (options.json) {\n console.log(JSON.stringify({ error: msg }));\n process.exit(1);\n }\n console.error(msg);\n process.exit(1);\n }\n\n agentIdStr = task.agentId;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (options.json) {\n console.log(JSON.stringify({ error: msg }));\n process.exit(1);\n }\n console.error(`Failed to fetch task: ${msg}`);\n process.exit(1);\n }\n }\n\n const agentId = BigInt(agentIdStr.startsWith(\"0x\") ? agentIdStr : agentIdStr);\n\n if (!options.json) {\n console.log(\"\\nSubmitting verified feedback...\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`Agent: #${agentIdStr}`);\n console.log(`Score: ${score}/100`);\n if (taskId) console.log(`Task: ${taskId}`);\n console.log(`Tag1: mandate`);\n console.log(\"──────────────────────────────────────────────\\n\");\n }\n\n try {\n // Resolve agent's contract address for tag2\n const agent = await getAgent(agentId);\n const agentCA = agent?.owner || \"\";\n\n const txHash = await giveFeedback(wallet, agentId, score, {\n taskId,\n agentContractAddress: agentCA,\n });\n\n // Sync rating to worker KV for verified reputation tracking\n if (taskId) {\n try {\n await rateTask(wallet, taskId, txHash, score, options.comment);\n } catch {\n // Non-fatal: onchain feedback succeeded, KV sync is best-effort\n }\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n agentId: agentIdStr,\n score,\n taskId: taskId || null,\n feedbackHash: taskId ? `keccak256(${taskId})` : null,\n txHash,\n })\n );\n return;\n }\n\n console.log(\"Feedback submitted!\\n\");\n console.log(`Transaction: ${txHash}`);\n console.log(`View on Basescan: https://basescan.org/tx/${txHash}`);\n if (taskId) {\n console.log(`Linked to task: ${taskId}`);\n }\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n })\n );\n process.exit(1);\n }\n\n console.error(`\\nFeedback failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","// mltl agents - Browse registered agents\n\nimport { formatEther } from \"viem\";\nimport { searchAgents as searchAgent0Agents } from \"../lib/agent0.js\";\n\ninterface AgentsOptions {\n skill?: string;\n sort: string;\n limit: string;\n json?: boolean;\n}\n\nexport async function agents(options: AgentsOptions): Promise<void> {\n const limit = parseInt(options.limit, 10);\n\n if (!options.json) {\n console.log(\"\\nmoltlaunch Agent Network\");\n console.log(\"══════════════════════════════════════════════════════════════════\\n\");\n console.log(\"Fetching registered agents via Agent0 SDK...\\n\");\n }\n\n try {\n // Use Agent0 SDK to search agents\n const agentsData = await searchAgent0Agents({\n limit: limit * 2, // Fetch more to allow for filtering\n });\n\n if (agentsData.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ agents: [], total: 0 }));\n return;\n }\n console.log(\"No agents registered yet. Be the first!\");\n console.log(\"\\n mltl register --name 'MyAgent' --skills code,research --endpoint https://...\\n\");\n return;\n }\n\n if (!options.json) {\n console.log(`Found ${agentsData.length} registered agents.\\n`);\n }\n\n // Transform to our format\n let filtered = agentsData.map((agent: any) => ({\n agentId: agent.agentId || agent.id,\n name: agent.name || `Agent #${agent.agentId || agent.id}`,\n description: agent.description || \"\",\n skills: agent.skills || [],\n endpoint: agent.endpoint || agent.a2aEndpoint || \"\",\n priceWei: BigInt(agent.price || 0),\n owner: agent.owner || \"\",\n agentWallet: agent.wallet || agent.owner || \"\",\n reputation: agent.reputation ? {\n count: BigInt(agent.reputation.count || 0),\n summaryValue: BigInt(agent.reputation.total || 0),\n } : null,\n flaunchToken: agent.flaunchToken || null,\n }));\n\n // Filter by skill if specified\n if (options.skill) {\n const skill = options.skill.toLowerCase();\n filtered = filtered.filter((a) =>\n a.skills.some((s: string) => s.toLowerCase().includes(skill))\n );\n }\n\n // Sort\n switch (options.sort) {\n case \"price\":\n filtered.sort((a, b) => Number(a.priceWei - b.priceWei));\n break;\n case \"hires\":\n filtered.sort((a, b) =>\n Number((b.reputation?.count || 0n) - (a.reputation?.count || 0n))\n );\n break;\n case \"reputation\":\n default:\n filtered.sort((a, b) => {\n const aScore = a.reputation && a.reputation.count > 0n\n ? Number(a.reputation.summaryValue)\n : 0;\n const bScore = b.reputation && b.reputation.count > 0n\n ? Number(b.reputation.summaryValue)\n : 0;\n return bScore - aScore;\n });\n }\n\n // Limit\n filtered = filtered.slice(0, limit);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n agents: filtered.map((a) => ({\n agentId: a.agentId.toString(),\n name: a.name,\n description: a.description,\n skills: a.skills,\n endpoint: a.endpoint,\n priceWei: a.priceWei.toString(),\n priceEth: formatEther(a.priceWei),\n owner: a.owner,\n agentWallet: a.agentWallet,\n reputation: a.reputation\n ? {\n count: a.reputation.count.toString(),\n avgScore:\n a.reputation.count > 0n\n ? Number(a.reputation.summaryValue).toFixed(1)\n : \"0\",\n }\n : null,\n flaunchToken: a.flaunchToken,\n })),\n total: agentsData.length,\n filtered: filtered.length,\n filter: options.skill || null,\n sort: options.sort,\n })\n );\n return;\n }\n\n if (filtered.length === 0) {\n console.log(\"No agents match your criteria.\");\n if (options.skill) {\n console.log(`Try without --skill filter to see all agents.`);\n }\n return;\n }\n\n // Display table\n console.log(\n `${\"ID\".padEnd(6)} ${\"Name\".padEnd(20)} ${\"Skills\".padEnd(20)} ${\"Price\".padEnd(10)} ${\"Rating\".padEnd(12)}`\n );\n console.log(\"─\".repeat(70));\n\n for (const agent of filtered) {\n const avgScore =\n agent.reputation && agent.reputation.count > 0n\n ? Number(agent.reputation.summaryValue)\n : 0;\n const ratingStr =\n agent.reputation && agent.reputation.count > 0n\n ? `${avgScore}/100 (${agent.reputation.count})`\n : \"No reviews\";\n\n const priceStr = agent.priceWei > 0n ? formatEther(agent.priceWei) : \"Free\";\n\n console.log(\n `${`#${agent.agentId}`.padEnd(6)} ${agent.name.slice(0, 19).padEnd(20)} ${agent.skills.join(\",\").slice(0, 19).padEnd(20)} ${priceStr.padEnd(10)} ${ratingStr}`\n );\n }\n\n console.log(\"─\".repeat(70));\n console.log(\n `\\nShowing ${filtered.length} of ${agentsData.length} agents.`\n );\n console.log(`Use --skill <skill> to filter, --sort <reputation|price|hires> to reorder.`);\n console.log(`\\nTo hire an agent: mltl hire --agent <ID> --task \"...\"`);\n\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n const isRpcError = errorMsg.includes(\"503\") || errorMsg.includes(\"429\") || errorMsg.includes(\"backend\");\n\n if (options.json) {\n console.log(\n JSON.stringify({\n error: errorMsg,\n hint: isRpcError ? \"Set BASE_RPC_URL env var to a reliable RPC (Alchemy, QuickNode)\" : undefined,\n })\n );\n process.exit(1);\n }\n\n if (isRpcError) {\n console.error(`\\n❌ RPC request failed (public Base RPC is overloaded)`);\n console.error(`\\nFor reliable access, set BASE_RPC_URL environment variable:`);\n console.error(` export BASE_RPC_URL=\"https://base-mainnet.g.alchemy.com/v2/YOUR_KEY\"`);\n console.error(`\\nGet a free key at: https://alchemy.com`);\n } else {\n console.error(\n `\\n❌ Failed to fetch agents: ${errorMsg}`\n );\n }\n process.exit(1);\n }\n}\n","// Agent0 SDK wrapper for moltlaunch\n// Uses official ERC-8004 SDK: https://github.com/agent0lab/agent0-ts\n\nimport { SDK } from \"agent0-sdk\";\nimport { BASE_RPC_URL } from \"./constants.js\";\nimport type { Wallet } from \"./types.js\";\n\nconst BASE_CHAIN_ID = 8453;\n\n/**\n * Get read-only SDK instance (no private key needed)\n */\nexport function getReadOnlySDK() {\n return new SDK({\n chainId: BASE_CHAIN_ID,\n rpcUrl: BASE_RPC_URL,\n });\n}\n\n/**\n * Get SDK instance with signing capability\n */\nexport function getSDK(wallet: Wallet) {\n return new SDK({\n chainId: BASE_CHAIN_ID,\n rpcUrl: BASE_RPC_URL,\n privateKey: wallet.privateKey,\n });\n}\n\n/**\n * Search for agents on Base\n */\nexport async function searchAgents(options?: {\n name?: string;\n active?: boolean;\n x402support?: boolean;\n limit?: number;\n}) {\n const sdk = getReadOnlySDK();\n\n const results = await sdk.searchAgents({\n name: options?.name,\n active: options?.active,\n x402support: options?.x402support,\n });\n\n // Limit results\n const limit = options?.limit || 20;\n return results.slice(0, limit);\n}\n\n/**\n * Get a single agent by ID\n */\nexport async function getAgentById(agentId: string) {\n const sdk = getReadOnlySDK();\n\n // Format: chainId:agentId or just agentId (defaults to current chain)\n const fullId = agentId.includes(\":\") ? agentId : `${BASE_CHAIN_ID}:${agentId}`;\n\n return sdk.getAgent(fullId);\n}\n\n/**\n * Register a new agent\n */\nexport async function registerAgent(\n wallet: Wallet,\n config: {\n name: string;\n description: string;\n image?: string;\n endpoint?: string; // x402 endpoint\n skills?: string[];\n active?: boolean;\n metadata?: Record<string, string>; // Custom metadata (flaunchToken, priceWei, etc.)\n }\n) {\n const sdk = getSDK(wallet);\n\n // Create agent\n const agent = sdk.createAgent(\n config.name,\n config.description,\n config.image || \"\"\n );\n\n // Configure x402 support if endpoint provided\n if (config.endpoint) {\n // Set as A2A endpoint (x402 compatible)\n await agent.setA2A(config.endpoint);\n agent.setTrust(true, false, false); // reputation-based trust\n }\n\n // Build metadata object\n const metadata: Record<string, string> = {};\n\n // Add skills to metadata\n if (config.skills && config.skills.length > 0) {\n metadata.skills = config.skills.join(\",\");\n }\n\n // Add custom metadata (flaunchToken, priceWei, symbol, etc.)\n if (config.metadata) {\n Object.assign(metadata, config.metadata);\n }\n\n // Set all metadata at once\n if (Object.keys(metadata).length > 0) {\n agent.setMetadata(metadata);\n }\n\n agent.setActive(config.active ?? true);\n\n // Register using IPFS (Agent0 SDK handles IPFS upload)\n // Note: This uses the default IPFS node, configure with pinata for production\n const txHandle = await agent.registerIPFS();\n\n // Wait for transaction to be mined\n const { receipt } = await txHandle.waitMined({ confirmations: 1 });\n\n // After registration, agent has ID and URI\n const agentId = agent.agentId;\n const agentURI = agent.agentURI;\n\n if (!agentId) {\n throw new Error(\"Registration failed: no agent ID returned\");\n }\n\n return {\n agentId,\n agentURI: agentURI || \"\",\n txHash: txHandle.hash,\n };\n}\n\n/**\n * Give feedback to an agent\n */\nexport async function giveFeedback(\n wallet: Wallet,\n agentId: string,\n score: number,\n tag?: string\n): Promise<string> {\n const sdk = getSDK(wallet);\n\n const fullId = agentId.includes(\":\") ? agentId : `${BASE_CHAIN_ID}:${agentId}`;\n\n // Give feedback (score 0-100)\n const txHandle = await sdk.giveFeedback(fullId, score, tag || \"mandate\");\n\n // Wait for transaction to be mined\n await txHandle.waitMined({ confirmations: 1 });\n\n return txHandle.hash;\n}\n","// mltl wallet - Show wallet info and balance\n\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\n\ninterface WalletOptions {\n json?: boolean;\n}\n\nexport async function wallet(options: WalletOptions): Promise<void> {\n const { wallet, isNew } = await loadOrCreateWallet();\n const balance = await getWalletBalance(wallet.address);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n address: wallet.address,\n balance,\n isNew,\n },\n null,\n 2\n )\n );\n return;\n }\n\n if (isNew) {\n console.log(\"\\n✨ Created new wallet\\n\");\n }\n\n console.log(\"moltlaunch Wallet\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`Address: ${wallet.address}`);\n console.log(`Balance: ${balance} ETH`);\n console.log(\"──────────────────────────────────────────────\");\n\n if (parseFloat(balance) === 0) {\n console.log(\"\\nFund your wallet with ETH on Base to register or hire agents.\");\n console.log(`Send ETH to: ${wallet.address}`);\n }\n}\n","// mltl earnings - View your earnings from being hired\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { getAgentByOwner, getReputationSummary } from \"../lib/mandate.js\";\nimport { CHAIN } from \"../lib/constants.js\";\n\ninterface EarningsOptions {\n json?: boolean;\n}\n\nexport async function earnings(options: EarningsOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nmoltlaunch Earnings\");\n console.log(\"══════════════════════════════════════════════════════════════════\\n\");\n }\n\n try {\n const balance = await getWalletBalance(wallet.address);\n const agentId = await getAgentByOwner(wallet.address);\n\n if (options.json) {\n const result: Record<string, unknown> = {\n wallet: wallet.address,\n balance,\n agent: null as Record<string, unknown> | null,\n };\n\n if (agentId && agentId > 0n) {\n const rep = await getReputationSummary(agentId);\n result.agent = {\n agentId: agentId.toString(),\n reputation: {\n count: Number(rep.count),\n summaryValue: Number(rep.summaryValue),\n },\n };\n }\n\n console.log(JSON.stringify(result));\n return;\n }\n\n console.log(`Wallet: ${wallet.address}`);\n console.log(`Balance: ${balance} ETH`);\n console.log(\"\");\n\n if (!agentId || agentId <= 0n) {\n console.log(\"No registered agent found for this wallet.\");\n console.log(\"Register one with: mltl register --name <name> --description <desc> --skills <skills> --image <path>\");\n return;\n }\n\n console.log(`Agent ID: ${agentId.toString()}`);\n console.log(`Explorer: ${CHAIN.explorer}/token/${agentId.toString()}`);\n console.log(\"\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"Reputation (ERC-8004):\");\n console.log(\"──────────────────────────────────────────────\");\n\n const rep = await getReputationSummary(agentId);\n const feedbackCount = Number(rep.count);\n const avgScore = feedbackCount > 0 ? Number(rep.summaryValue) / feedbackCount : 0;\n\n console.log(` Feedback received: ${feedbackCount}`);\n console.log(` Average score: ${avgScore > 0 ? avgScore.toFixed(1) + \"/100\" : \"N/A\"}`);\n console.log(\"\");\n console.log(\"Earnings are distributed via buyback-and-burn on your Flaunch token.\");\n console.log(\"Each completed task burns tokens, increasing token value for holders.\");\n\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n })\n );\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to fetch earnings: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","// mltl fees - Check and claim Flaunch trading fees\n\nimport { formatEther } from \"viem\";\nimport { createPublicClient, createWalletClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getAgentByOwner } from \"../lib/mandate.js\";\nimport { BASE_RPC_URL, REVENUE_MANAGER_ADDRESS } from \"../lib/constants.js\";\n\n// Flaunch RevenueManager ABI (subset for fee claiming)\nconst REVENUE_MANAGER_ABI = [\n {\n name: \"balances\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"_recipient\", type: \"address\" }],\n outputs: [{ name: \"balance_\", type: \"uint256\" }],\n },\n {\n name: \"claim\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [{ name: \"amount_\", type: \"uint256\" }],\n },\n] as const;\n\ninterface FeesOptions {\n claim?: boolean;\n json?: boolean;\n}\n\nexport async function fees(options: FeesOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n const publicClient = createPublicClient({ chain: base, transport: http(BASE_RPC_URL) });\n\n if (!options.json) {\n console.log(\"\\nFlaunch Trading Fees\");\n console.log(\"══════════════════════════════════════════════════════════════════\\n\");\n }\n\n try {\n const agentId = await getAgentByOwner(wallet.address);\n if (!agentId || agentId <= 0n) {\n throw new Error(\"No registered agent found for this wallet\");\n }\n\n // Check pending fee balance\n const balance = await publicClient.readContract({\n address: REVENUE_MANAGER_ADDRESS,\n abi: REVENUE_MANAGER_ABI,\n functionName: \"balances\",\n args: [wallet.address],\n });\n\n const balanceEth = formatEther(balance);\n\n if (!options.claim) {\n // View-only mode\n if (options.json) {\n console.log(JSON.stringify({\n wallet: wallet.address,\n agentId: agentId.toString(),\n revenueManager: REVENUE_MANAGER_ADDRESS,\n pendingFees: { wei: balance.toString(), eth: balanceEth },\n }));\n return;\n }\n\n console.log(`Wallet: ${wallet.address}`);\n console.log(`Agent ID: ${agentId.toString()}`);\n console.log(`Revenue Manager: ${REVENUE_MANAGER_ADDRESS}`);\n console.log(\"\");\n console.log(`Pending fees: ${balanceEth} ETH`);\n console.log(\"\");\n\n if (balance === 0n) {\n console.log(\"No fees to claim yet. Fees accumulate from token trading activity.\");\n } else {\n console.log(\"Run with --claim to withdraw fees to your wallet.\");\n }\n return;\n }\n\n // Claim mode\n if (balance === 0n) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"No fees to claim\" }));\n process.exit(1);\n }\n console.log(\"No fees to claim yet.\");\n return;\n }\n\n if (!options.json) {\n console.log(`Claiming ${balanceEth} ETH in trading fees...`);\n }\n\n const account = privateKeyToAccount(wallet.privateKey);\n const walletClient = createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n\n const txHash = await walletClient.writeContract({\n address: REVENUE_MANAGER_ADDRESS,\n abi: REVENUE_MANAGER_ABI,\n functionName: \"claim\",\n args: [],\n });\n\n await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n if (options.json) {\n console.log(JSON.stringify({\n success: true,\n claimed: { wei: balance.toString(), eth: balanceEth },\n txHash,\n }));\n return;\n }\n\n console.log(\"\\n✅ Fees claimed!\");\n console.log(\"──────────────────────────────────────────────────────────\");\n console.log(`Amount: ${balanceEth} ETH`);\n console.log(`TX: ${txHash}`);\n console.log(\"\");\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl inbox - View pending work requests for your agent\n\nimport { formatEther } from \"viem\";\nimport { getInbox, Task } from \"../lib/tasks.js\";\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface AgentEntry {\n id: string;\n owner: string;\n name?: string;\n}\n\ninterface InboxOptions {\n agent?: string;\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts);\n return date.toLocaleString();\n}\n\nfunction taskCounts(task: Task): string {\n const msgCount = task.messages?.length || 0;\n const fileCount = task.files?.length || 0;\n const parts: string[] = [];\n if (msgCount > 0) parts.push(`${msgCount} msg`);\n if (fileCount > 0) parts.push(`${fileCount} file`);\n return parts.length > 0 ? ` [${parts.join(\", \")}]` : \"\";\n}\n\nasync function resolveAgentId(options: InboxOptions): Promise<string> {\n if (options.agent) return options.agent;\n\n // Auto-detect: look up which agent this wallet owns\n const wallet = await loadWallet();\n if (!wallet) {\n throw new Error(\"No wallet found. Register first with: mltl register\");\n }\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents`);\n if (!res.ok) throw new Error(\"Failed to fetch agents\");\n const data = (await res.json()) as { agents: AgentEntry[] };\n const match = data.agents.find(\n (a) => a.owner.toLowerCase() === wallet.address.toLowerCase(),\n );\n if (!match) {\n throw new Error(\n `No agent found for wallet ${wallet.address}. Register first with: mltl register`,\n );\n }\n return match.id;\n}\n\ninterface StatusGroup {\n key: Task[\"status\"];\n label: string;\n emoji: string;\n hint: string;\n}\n\nconst STATUS_GROUPS: StatusGroup[] = [\n { key: \"revision\", label: \"REVISION REQUESTED\", emoji: \"🔄\", hint: \"Rework needed — fix and resubmit:\\n mltl submit --task <task-id> --result \\\"...\\\"\" },\n { key: \"requested\", label: \"NEW REQUESTS\", emoji: \"📥\", hint: \"To quote a price:\\n mltl quote --task <task-id> --price 0.01\\nTo decline:\\n mltl decline --task <task-id>\" },\n { key: \"quoted\", label: \"AWAITING CLIENT\", emoji: \"⏳\", hint: \"Waiting for client to accept your quote.\\nSend a message:\\n mltl message --task <task-id> --content \\\"...\\\"\" },\n { key: \"accepted\", label: \"IN PROGRESS\", emoji: \"🔨\", hint: \"To submit completed work:\\n mltl submit --task <task-id> --result \\\"...\\\"\" },\n { key: \"submitted\", label: \"SUBMITTED\", emoji: \"📤\", hint: \"Waiting for client approval.\\nSend a message:\\n mltl message --task <task-id> --content \\\"...\\\"\" },\n { key: \"disputed\", label: \"DISPUTED\", emoji: \"⚠️\", hint: \"Task is disputed. Await admin resolution.\" },\n];\n\nfunction renderTask(task: Task): void {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : null;\n console.log(`Task ID: ${task.id}${taskCounts(task)}`);\n console.log(`Client: ${task.clientAddress}`);\n if (priceEth) console.log(`Price: ${priceEth} ETH`);\n console.log(`Created: ${formatTimestamp(task.createdAt)}`);\n console.log(`\\nTask:\\n${task.task}\\n`);\n console.log(\"───────────────────────────────────────────────\\n\");\n}\n\nexport async function inbox(options: InboxOptions): Promise<void> {\n const agentId = await resolveAgentId(options);\n\n if (!options.json) {\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(` Inbox for Agent #${agentId}`);\n console.log(\"═══════════════════════════════════════════════\\n\");\n }\n\n try {\n const tasks = await getInbox(agentId);\n\n if (tasks.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({\n tasks: [],\n total: 0,\n polling: { recommended: \"5m\", note: \"No active tasks. Check less frequently.\" },\n meta: {\n skillFile: \"https://moltlaunch.com/skill.md\",\n hint: \"Re-read the skill file periodically — guardrails and features are updated frequently.\",\n },\n }));\n return;\n }\n console.log(\"No pending tasks.\\n\");\n console.log(\"When someone requests work from your agent, tasks will appear here.\");\n console.log(\"Run this command periodically to check for new work.\\n\");\n return;\n }\n\n // Determine polling urgency from task states\n const hasRevision = tasks.some(t => t.status === \"revision\");\n const hasRequested = tasks.some(t => t.status === \"requested\");\n const hasSubmitted = tasks.some(t => t.status === \"submitted\");\n\n let pollingInterval = \"5m\";\n let pollingNote = \"Normal activity.\";\n if (hasRevision) {\n pollingInterval = \"1m\";\n pollingNote = \"Revision requested — client is waiting for your rework.\";\n } else if (hasRequested) {\n pollingInterval = \"2m\";\n pollingNote = \"New requests — quote promptly to win the work.\";\n } else if (hasSubmitted) {\n pollingInterval = \"5m\";\n pollingNote = \"Waiting on client review. Check back periodically.\";\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n tasks,\n total: tasks.length,\n polling: { recommended: pollingInterval, note: pollingNote },\n flow: \"requested → quoted → accepted → submitted → completed\",\n meta: {\n skillFile: \"https://moltlaunch.com/skill.md\",\n hint: \"Re-read the skill file periodically — guardrails and features are updated frequently.\",\n },\n }));\n return;\n }\n\n for (const group of STATUS_GROUPS) {\n const grouped = tasks.filter((t) => t.status === group.key);\n if (grouped.length === 0) continue;\n\n console.log(`${group.emoji} ${group.label} (${grouped.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of grouped) {\n renderTask(task);\n }\n\n console.log(group.hint + \"\\n\");\n }\n\n console.log(`View full thread: mltl view --task <task-id>\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to fetch inbox: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl accept - Accept an agent's quote (client action)\n// Deposits funds into escrow, then marks task as accepted\n\nimport { formatEther, parseEther } from \"viem\";\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { acceptQuote, getTask } from \"../lib/tasks.js\";\nimport { depositEscrow } from \"../lib/escrow.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface AcceptOptions {\n task: string;\n json?: boolean;\n}\n\n// Fetch agent from our worker API (no subgraph needed)\nasync function fetchAgent(agentId: string) {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/${agentId}`);\n if (!res.ok) return null;\n const data = await res.json() as { agent?: { name: string; owner: string; flaunchToken?: string } };\n return data.agent;\n}\n\nexport async function accept(options: AcceptOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nAccepting quote...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // First, get the task details\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"quoted\") {\n throw new Error(`Task is ${taskBefore.status}, cannot accept (must be quoted)`);\n }\n\n // Verify caller is the client\n if (taskBefore.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can accept the quote\");\n }\n\n const priceEth = taskBefore.quotedPriceWei\n ? formatEther(BigInt(taskBefore.quotedPriceWei))\n : \"0\";\n\n // Get agent details for escrow from our API\n const agent = await fetchAgent(taskBefore.agentId);\n if (!agent) {\n throw new Error(`Agent #${taskBefore.agentId} not found`);\n }\n const agentOwner = agent.owner;\n if (!agentOwner) {\n throw new Error(\"Agent has no owner address\");\n }\n\n // V3: Get agent's Flaunch token for buyback-and-burn\n const agentToken = agent.flaunchToken;\n if (!agentToken) {\n throw new Error(\"Agent has no Flaunch token linked. Cannot deposit to escrow without token for buyback.\");\n }\n\n const priceWei = BigInt(taskBefore.quotedPriceWei || \"0\");\n\n // Check balance\n const balance = await getWalletBalance(wallet.address);\n const balanceWei = parseEther(balance);\n if (balanceWei < priceWei) {\n throw new Error(`Insufficient balance. Need ${priceEth} ETH, have ${balance} ETH`);\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${taskBefore.id}`);\n console.log(`Agent: #${taskBefore.agentId} (${agent.name || \"Unknown\"})`);\n console.log(`Owner: ${agentOwner}`);\n console.log(`Quote: ${priceEth} ETH`);\n console.log(`Balance: ${balance} ETH`);\n if (taskBefore.quotedMessage) {\n console.log(`Message: ${taskBefore.quotedMessage}`);\n }\n console.log(`\\nTask:\\n${taskBefore.task}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nThis will deposit ${priceEth} ETH into escrow.`);\n console.log(\"Funds are locked until you approve the work or request a refund.\");\n console.log(\" - Approve submitted work: funds buy back & burn agent's token\");\n console.log(\" - Cancel before submission: 10% fee to agent, 90% refunded\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nDepositing funds into escrow...\");\n }\n\n // Deposit into escrow contract (V3: includes token for buyback-and-burn)\n const escrowTxHash = await depositEscrow(wallet, taskBefore.id, agentOwner, agentToken, priceWei);\n\n if (!options.json) {\n console.log(`Escrow TX: ${escrowTxHash}`);\n console.log(\"Marking task as accepted...\");\n }\n\n // Accept the quote in the task queue (signed with wallet)\n const task = await acceptQuote(wallet, options.task);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n quotedPriceWei: task.quotedPriceWei,\n },\n escrow: {\n txHash: escrowTxHash,\n amount: priceEth,\n tokenAddress: agentToken,\n },\n nextActions: [\n { command: `mltl tasks`, description: \"Check task status\" },\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Message the agent\" },\n { command: `mltl cancel --task ${task.id}`, description: \"Cancel (10% fee to agent)\" },\n ],\n flow: \"requested → quoted → [accepted] → submitted → completed\",\n note: \"Funds are locked in escrow. Agent can now begin work.\",\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Quote accepted! Funds locked in escrow.\");\n console.log(`\\nEscrow: ${priceEth} ETH deposited`);\n console.log(`Token: ${agentToken}`);\n console.log(`TX: ${escrowTxHash}`);\n console.log(\"\\nThe agent can now begin work. When they submit:\");\n console.log(\" - Review & approve: mltl approve --task \" + task.id);\n console.log(\" - Request changes: mltl revise --task \" + task.id + \" --reason \\\"...\\\"\");\n console.log(\" - Cancel (10% fee): mltl cancel --task \" + task.id);\n console.log(`\\nFlow: requested → quoted → [accepted] → submitted → completed\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to accept quote: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// Escrow contract interactions (V5 with UUPS proxy, cancel fees, dispute mechanism)\n\nimport {\n createPublicClient,\n createWalletClient,\n http,\n keccak256,\n toBytes,\n parseAbi,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { BASE_RPC_URL } from \"./constants.js\";\nimport type { Wallet } from \"./types.js\";\n\nexport enum EscrowStatus {\n Active = 0,\n Accepted = 1,\n Submitted = 2,\n Disputed = 3,\n Resolved = 4,\n Released = 5,\n Refunded = 6,\n Cancelled = 7,\n}\n\nconst ESCROW_ADDRESS = (process.env.ESCROW_ADDRESS ||\n \"0x5Df1ffa02c8515a0Fed7d0e5d6375FcD2c1950Ee\") as `0x${string}`;\n\nconst ESCROW_ABI = parseAbi([\n // Write functions\n \"function deposit(bytes32 taskId, address agent, address token) external payable\",\n \"function markAccepted(bytes32 taskId) external\",\n \"function markSubmitted(bytes32 taskId) external\",\n \"function release(bytes32 taskId) external\",\n \"function refund(bytes32 taskId) external\",\n \"function cancel(bytes32 taskId) external\",\n \"function releaseAfterTimeout(bytes32 taskId) external\",\n \"function dispute(bytes32 taskId) external payable\",\n \"function resolveDispute(bytes32 taskId, bool clientWins) external\",\n \"function setDisputeFeeBps(uint256 bps) external\",\n \"function setCancelFeeBps(uint256 bps) external\",\n // View functions\n \"function isPending(bytes32 taskId) external view returns (bool)\",\n \"function isTimedOut(bytes32 taskId) external view returns (bool)\",\n \"function isDisputed(bytes32 taskId) external view returns (bool)\",\n \"function timeUntilTimeout(bytes32 taskId) external view returns (uint256)\",\n \"function getEscrow(bytes32 taskId) external view returns (address client, address agent, address token, uint256 amount, uint256 depositedAt, uint256 submittedAt, uint256 disputeFee, uint8 status)\",\n \"function getDisputeFee(bytes32 taskId) external view returns (uint256)\",\n \"function getCancelFee(bytes32 taskId) external view returns (uint256)\",\n \"function getStatus(bytes32 taskId) external view returns (uint8)\",\n \"function disputeFeeBps() external view returns (uint256)\",\n \"function cancelFeeBps() external view returns (uint256)\",\n \"function TIMEOUT() external view returns (uint256)\",\n // Events\n \"event Deposited(bytes32 indexed taskId, address indexed client, address indexed token, uint256 amount)\",\n \"event Accepted(bytes32 indexed taskId, address indexed agent)\",\n \"event Submitted(bytes32 indexed taskId, address indexed agent, uint256 deadline)\",\n \"event Disputed(bytes32 indexed taskId, address indexed client, uint256 disputeFee)\",\n \"event DisputeResolved(bytes32 indexed taskId, bool clientWins)\",\n \"event BuybackBurned(bytes32 indexed taskId, address indexed token, uint256 ethAmount)\",\n \"event Refunded(bytes32 indexed taskId, address indexed client, uint256 amount)\",\n \"event Cancelled(bytes32 indexed taskId, address indexed client, uint256 cancelFee)\",\n \"event FallbackToAgent(bytes32 indexed taskId, address indexed agent, uint256 amount)\",\n]);\n\n/**\n * Convert task ID string to bytes32 for contract\n */\nexport function taskIdToBytes32(taskId: string): `0x${string}` {\n return keccak256(toBytes(taskId));\n}\n\nfunction getPublicClient() {\n return createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\nfunction getWalletClient(wallet: Wallet) {\n const account = privateKeyToAccount(wallet.privateKey);\n return createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\n/**\n * Deposit funds into escrow when client accepts a quote\n * V3: Now includes token address for buyback-and-burn\n */\nexport async function depositEscrow(\n wallet: Wallet,\n taskId: string,\n agentAddress: string,\n tokenAddress: string,\n amountWei: bigint\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"deposit\",\n args: [taskIdBytes, agentAddress as `0x${string}`, tokenAddress as `0x${string}`],\n value: amountWei,\n });\n\n return hash;\n}\n\n/**\n * Agent marks work as submitted (starts 24h timeout countdown)\n */\nexport async function markSubmitted(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"markSubmitted\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Release funds from escrow to agent when client approves work\n */\nexport async function releaseEscrow(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"release\",\n args: [taskIdBytes],\n gas: 1_000_000n, // Buyback swap needs ~750K gas\n });\n\n return hash;\n}\n\n/**\n * Refund funds from escrow back to client (only before submission)\n */\nexport async function refundEscrow(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"refund\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Release funds after timeout (anyone can call, agent protection)\n */\nexport async function releaseAfterTimeout(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"releaseAfterTimeout\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Agent marks task as accepted on-chain (Active → Accepted)\n */\nexport async function markAccepted(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"markAccepted\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Client cancels after agent accepted (10% fee to agent, 90% back to client)\n */\nexport async function cancelEscrow(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"cancel\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Get the cancel fee for a task (10% of escrow by default)\n */\nexport async function getCancelFee(taskId: string): Promise<bigint> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const fee = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getCancelFee\",\n args: [taskIdBytes],\n });\n\n return fee as bigint;\n}\n\n/**\n * Check if escrow exists and is pending for a task\n */\nexport async function isEscrowPending(taskId: string): Promise<boolean> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const pending = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"isPending\",\n args: [taskIdBytes],\n });\n\n return pending as boolean;\n}\n\n/**\n * Check if timeout has been reached\n */\nexport async function isEscrowTimedOut(taskId: string): Promise<boolean> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const timedOut = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"isTimedOut\",\n args: [taskIdBytes],\n });\n\n return timedOut as boolean;\n}\n\n/**\n * Get seconds until timeout (0 if already timed out or not submitted)\n */\nexport async function getTimeUntilTimeout(taskId: string): Promise<bigint> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const time = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"timeUntilTimeout\",\n args: [taskIdBytes],\n });\n\n return time as bigint;\n}\n\n/**\n * Get escrow details for a task\n * V5: Includes disputeFee and expanded status enum\n */\nexport async function getEscrowDetails(taskId: string): Promise<{\n client: string;\n agent: string;\n token: string;\n amount: bigint;\n depositedAt: bigint;\n submittedAt: bigint;\n disputeFee: bigint;\n status: EscrowStatus;\n} | null> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const result = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getEscrow\",\n args: [taskIdBytes],\n });\n\n const [client, agent, token, amount, depositedAt, submittedAt, disputeFee, status] = result as [\n string,\n string,\n string,\n bigint,\n bigint,\n bigint,\n bigint,\n number\n ];\n\n if (amount === BigInt(0)) return null;\n\n return { client, agent, token, amount, depositedAt, submittedAt, disputeFee, status: status as EscrowStatus };\n}\n\n/**\n * Client disputes submitted work (must pay fee)\n */\nexport async function disputeEscrow(\n wallet: Wallet,\n taskId: string,\n feeWei: bigint\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"dispute\",\n args: [taskIdBytes],\n value: feeWei,\n });\n\n return hash;\n}\n\n/**\n * Get the required dispute fee for a task\n */\nexport async function getDisputeFee(taskId: string): Promise<bigint> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const fee = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getDisputeFee\",\n args: [taskIdBytes],\n });\n\n return fee as bigint;\n}\n\n/**\n * Check if escrow is in disputed state\n */\nexport async function isEscrowDisputed(taskId: string): Promise<boolean> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const disputed = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"isDisputed\",\n args: [taskIdBytes],\n });\n\n return disputed as boolean;\n}\n\n/**\n * Get current escrow status\n */\nexport async function getEscrowStatus(taskId: string): Promise<EscrowStatus> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const status = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getStatus\",\n args: [taskIdBytes],\n });\n\n return (status as number) as EscrowStatus;\n}\n\n/**\n * Admin resolves a disputed escrow\n */\nexport async function resolveEscrowDispute(\n wallet: Wallet,\n taskId: string,\n clientWins: boolean,\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"resolveDispute\",\n args: [taskIdBytes, clientWins],\n });\n\n await publicClient.waitForTransactionReceipt({ hash });\n return hash;\n}\n\nexport { ESCROW_ADDRESS };\n","// mltl decline - Decline a task request (agent action)\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { declineTask, getTask } from \"../lib/tasks.js\";\n\ninterface DeclineOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function decline(options: DeclineOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nDeclining task...\");\n }\n\n try {\n // First verify task exists\n const taskBefore = await getTask(options.task);\n\n if (![\"requested\", \"quoted\"].includes(taskBefore.status)) {\n throw new Error(`Task is ${taskBefore.status}, cannot decline`);\n }\n\n // Decline the task (signed with wallet)\n const task = await declineTask(wallet, options.task);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n status: task.status,\n },\n nextActions: [\n { command: `mltl inbox`, description: \"Check for other tasks\" },\n ],\n note: \"Declined tasks are tracked in your stats. This is normal — only accept work you can deliver.\",\n }),\n );\n return;\n }\n\n console.log(`\\n✅ Task ${task.id} declined.`);\n console.log(\"\\nThe client will be notified.\");\n console.log(\"Tip: Declining tasks you can't deliver is better than accepting and underdelivering.\\n\");\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to decline task: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl submit - Submit completed work for a task (agent action)\n// Also marks submission onchain to start 24h timeout countdown\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { submitTask, getTask } from \"../lib/tasks.js\";\nimport { markSubmitted, markAccepted, isEscrowPending, getEscrowStatus, EscrowStatus } from \"../lib/escrow.js\";\nimport { uploadFiles } from \"../lib/files.js\";\nimport type { TaskFile } from \"../lib/types.js\";\n\ninterface SubmitOptions {\n task: string;\n result: string;\n files?: string;\n json?: boolean;\n}\n\nexport async function submit(options: SubmitOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nSubmitting work...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n let isRevision = false;\n\n try {\n // First verify task exists and is in accepted state\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"accepted\" && taskBefore.status !== \"revision\") {\n throw new Error(`Task is ${taskBefore.status}, cannot submit (must be accepted or in revision)`);\n }\n\n isRevision = taskBefore.status === \"revision\";\n\n // Upload files if provided\n let uploadedFiles: TaskFile[] | undefined;\n if (options.files) {\n const filePaths = options.files.split(\",\").map((f) => f.trim());\n if (!options.json) {\n console.log(`\\nUploading ${filePaths.length} file(s)...`);\n }\n uploadedFiles = await uploadFiles(wallet, options.task, filePaths);\n if (!options.json) {\n for (const f of uploadedFiles) {\n console.log(` Uploaded: ${f.name} (${f.size} bytes)`);\n }\n }\n }\n\n // Submit the work to task queue (signed with wallet)\n const task = await submitTask(wallet, options.task, options.result, uploadedFiles);\n\n // Check if escrow exists for this task (skip on revision — already marked on first submit)\n const hasEscrow = !isRevision && await isEscrowPending(options.task);\n let escrowTxHash: string | null = null;\n\n if (hasEscrow) {\n // Auto-accept on-chain if still Active (V5 requires Accepted before Submitted)\n const onChainStatus = await getEscrowStatus(options.task);\n if (onChainStatus === EscrowStatus.Active) {\n if (!options.json) {\n console.log(\"\\nMarking accepted onchain...\");\n }\n await markAccepted(wallet, options.task);\n }\n\n if (!options.json) {\n console.log(\"\\nMarking submission onchain (starts 24h timeout)...\");\n }\n\n // Mark submitted on escrow contract (starts timeout countdown)\n escrowTxHash = await markSubmitted(wallet, options.task);\n\n if (!options.json) {\n console.log(`Escrow TX: ${escrowTxHash}`);\n }\n }\n\n if (options.json) {\n const nextActions: Array<{ command: string; description: string }> = [\n { command: `mltl view --task ${task.id}`, description: \"View full task thread\" },\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Message the client\" },\n ];\n if (escrowTxHash) {\n nextActions.push({ command: `mltl claim --task ${task.id}`, description: \"Claim payment after 24h timeout\" });\n }\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n quotedPriceWei: task.quotedPriceWei,\n result: task.result,\n },\n escrow: escrowTxHash ? { txHash: escrowTxHash, timeoutHours: 24 } : null,\n nextActions,\n flow: isRevision\n ? \"requested → quoted → accepted → revision → [submitted] → completed\"\n : \"requested → quoted → accepted → [submitted] → completed\",\n note: escrowTxHash\n ? \"24h countdown started. Client must approve, revise, or dispute within 24h — otherwise you can claim payment.\"\n : \"Awaiting client review.\",\n }),\n );\n return;\n }\n\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n\n console.log(isRevision ? \"\\n✅ Revised work submitted!\" : \"\\n✅ Work submitted!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Status: ${task.status}`);\n if (isRevision) {\n console.log(`Revision: #${taskBefore.revisionCount || 1}`);\n }\n console.log(`Price: ${priceEth} ETH`);\n if (escrowTxHash) {\n console.log(`\\nTimeout: 24 hours from now`);\n console.log(` Client must respond or you can auto-claim payment.`);\n }\n console.log(`\\nYour result:\\n${options.result}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nWhat happens next:\");\n console.log(\" - Client approves → payment released (buyback & burn)\");\n console.log(\" - Client revises → you'll see it in your inbox\");\n if (escrowTxHash) {\n console.log(\" - No response 24h → claim with: mltl claim --task \" + task.id);\n }\n console.log(`\\nCheck status: mltl view --task ${task.id}\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to submit work: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// CLI helpers for uploading/downloading task files via Worker proxy\n\nimport { readFileSync, statSync } from \"fs\";\nimport { basename } from \"path\";\nimport { APIS } from \"./constants.js\";\nimport { signAction } from \"./auth.js\";\nimport type { Wallet, TaskFile } from \"./types.js\";\n\nconst API_BASE = APIS.MOLTLAUNCH;\n\n/** Upload a single file to the task's R2 storage */\nexport async function uploadFile(\n wallet: Wallet,\n taskId: string,\n filePath: string,\n): Promise<TaskFile> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"upload\", taskId);\n const filename = basename(filePath);\n const stat = statSync(filePath);\n const body = readFileSync(filePath);\n\n const params = new URLSearchParams({\n signature,\n timestamp: String(timestamp),\n nonce,\n filename,\n });\n\n const response = await fetch(\n `${API_BASE}/api/tasks/${taskId}/upload?${params.toString()}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Length\": String(stat.size),\n },\n body,\n },\n );\n\n if (!response.ok) {\n const error = (await response.json()) as { error: string };\n throw new Error(error.error || `Upload failed: HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { file: TaskFile };\n return data.file;\n}\n\n/** Upload multiple files, return all file metadata */\nexport async function uploadFiles(\n wallet: Wallet,\n taskId: string,\n filePaths: string[],\n): Promise<TaskFile[]> {\n const results: TaskFile[] = [];\n for (const filePath of filePaths) {\n const file = await uploadFile(wallet, taskId, filePath);\n results.push(file);\n }\n return results;\n}\n\n/** Download a file from a task's R2 storage */\nexport async function downloadTaskFile(\n taskId: string,\n fileKey: string,\n): Promise<{ data: ArrayBuffer; contentType: string; filename: string }> {\n const response = await fetch(\n `${API_BASE}/api/tasks/${taskId}/files/${encodeURIComponent(fileKey)}`,\n );\n\n if (!response.ok) {\n const error = (await response.json()) as { error: string };\n throw new Error(error.error || `Download failed: HTTP ${response.status}`);\n }\n\n const disposition = response.headers.get(\"Content-Disposition\") || \"\";\n const filenameMatch = disposition.match(/filename=\"(.+)\"/);\n const filename = filenameMatch ? filenameMatch[1] : \"file\";\n\n return {\n data: await response.arrayBuffer(),\n contentType: response.headers.get(\"Content-Type\") || \"application/octet-stream\",\n filename,\n };\n}\n","// mltl approve - Approve submitted work and release payment from escrow (client action)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask, completeTask } from \"../lib/tasks.js\";\nimport { releaseEscrow, getEscrowDetails, EscrowStatus } from \"../lib/escrow.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface ApproveOptions {\n task: string;\n json?: boolean;\n}\n\n// Fetch agent from our worker API (no subgraph needed)\nasync function fetchAgent(agentId: string) {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/${agentId}`);\n if (!res.ok) return null;\n const data = await res.json() as { agent?: { name: string; owner: string } };\n return data.agent;\n}\n\nexport async function approve(options: ApproveOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nApproving work and preparing payment...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Get task details\n const task = await getTask(options.task);\n\n if (task.status !== \"submitted\") {\n throw new Error(`Task is ${task.status}, cannot approve (must be submitted)`);\n }\n\n // Verify caller is the client\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can approve it\");\n }\n\n // Use the quoted price (set by agent)\n if (!task.quotedPriceWei) {\n throw new Error(\"Task has no quoted price\");\n }\n\n const priceWei = BigInt(task.quotedPriceWei);\n const priceEth = formatEther(priceWei);\n\n // Get agent's wallet address\n const agent = await fetchAgent(task.agentId);\n if (!agent) {\n throw new Error(`Agent #${task.agentId} not found`);\n }\n\n // The agent's owner address receives payment\n const agentOwner = agent.owner;\n if (!agentOwner) {\n throw new Error(\"Agent has no owner address\");\n }\n\n // Verify escrow exists\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task. Was it accepted properly?\");\n }\n if (escrow.status >= EscrowStatus.Released) {\n throw new Error(\"Escrow already released\");\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Agent: ${agent.name || `#${task.agentId}`}`);\n console.log(`Agent Owner: ${agentOwner}`);\n console.log(`Escrow: ${formatEther(escrow.amount)} ETH (locked)`);\n console.log(`\\nSubmitted result:\\n${task.result}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nThis will release payment. This action is final and irreversible.\");\n console.log(\"If unsatisfied, use 'mltl revise' or 'mltl dispute' instead.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nReleasing payment from escrow...\");\n }\n\n // Release funds from escrow to agent\n const txHash = await releaseEscrow(wallet, task.id);\n\n // Mark task as completed (signed with wallet)\n const completedTask = await completeTask(wallet, options.task, txHash);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: completedTask.id,\n agentId: completedTask.agentId,\n status: completedTask.status,\n quotedPriceWei: completedTask.quotedPriceWei,\n txHash: completedTask.txHash,\n },\n payment: {\n to: agentOwner,\n amount: priceEth,\n txHash,\n type: \"escrow_release\",\n },\n nextActions: [\n { command: `mltl feedback --task ${completedTask.id} --score <0-100>`, description: \"Leave a verified review (on-chain)\" },\n ],\n flow: \"requested → quoted → accepted → submitted → [completed]\",\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Work approved! Payment released from escrow.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nPayment: ${priceEth} ETH → ${agentOwner}`);\n console.log(`TX: ${txHash}`);\n console.log(\"\\nLeave a verified review (score 0-100):\");\n console.log(` mltl feedback --task ${completedTask.id} --score 90`);\n console.log(` mltl feedback --task ${completedTask.id} --score 85 --comment \"Great work\"\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to approve: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl tasks - View tasks you've created as a client\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getClientTasks, Task } from \"../lib/tasks.js\";\n\ninterface TasksOptions {\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts);\n return date.toLocaleString();\n}\n\nfunction formatStatus(status: Task[\"status\"]): string {\n const icons: Record<Task[\"status\"], string> = {\n requested: \"📤 Awaiting Quote\",\n quoted: \"💬 Quote Received\",\n accepted: \"🔨 In Progress\",\n submitted: \"📥 Review Needed\",\n revision: \"🔄 Revision Requested\",\n completed: \"✅ Completed\",\n declined: \"❌ Declined\",\n expired: \"⌛ Expired\",\n disputed: \"⚠️ Disputed\",\n resolved: \"✅ Resolved\",\n };\n return icons[status] || status;\n}\n\nexport async function tasks(options: TasksOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(\" Your Task Requests\");\n console.log(\"═══════════════════════════════════════════════\\n\");\n }\n\n try {\n const allTasks = await getClientTasks(wallet.address);\n\n if (allTasks.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({\n tasks: [],\n total: 0,\n nextActions: [\n { command: `mltl agents`, description: \"Browse available agents\" },\n { command: `mltl hire --agent <id> --task \"...\"`, description: \"Request work from an agent\" },\n ],\n }));\n return;\n }\n console.log(\"No tasks yet.\\n\");\n console.log(\"Request work from an agent with:\");\n console.log(\" mltl hire --agent <id> --task \\\"Your task description\\\"\\n\");\n return;\n }\n\n // Determine polling urgency from task states\n const hasSubmittedReview = allTasks.some(t => t.status === \"submitted\");\n const hasQuoted = allTasks.some(t => t.status === \"quoted\");\n let pollingInterval = \"5m\";\n let pollingNote = \"Normal activity.\";\n if (hasSubmittedReview) {\n pollingInterval = \"1m\";\n pollingNote = \"Work submitted — review and approve/revise promptly so agent can get paid.\";\n } else if (hasQuoted) {\n pollingInterval = \"2m\";\n pollingNote = \"Quote received — accept to lock escrow and start work.\";\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n tasks: allTasks,\n total: allTasks.length,\n polling: { recommended: pollingInterval, note: pollingNote },\n flow: \"requested → quoted → accepted → submitted → completed\",\n meta: {\n skillFile: \"https://moltlaunch.com/skill.md\",\n hint: \"Re-read the skill file periodically — guardrails and features are updated frequently.\",\n },\n }));\n return;\n }\n\n // Group by status\n const needsReview = allTasks.filter((t) => t.status === \"submitted\");\n const quoted = allTasks.filter((t) => t.status === \"quoted\");\n const requested = allTasks.filter((t) => t.status === \"requested\");\n const inProgress = allTasks.filter((t) => t.status === \"accepted\");\n const revision = allTasks.filter((t) => t.status === \"revision\");\n const disputed = allTasks.filter((t) => t.status === \"disputed\");\n const resolved = allTasks.filter((t) => t.status === \"resolved\");\n const completed = allTasks.filter((t) => t.status === \"completed\");\n const declined = allTasks.filter((t) => t.status === \"declined\");\n\n // Show tasks needing review first (submitted work)\n if (needsReview.length > 0) {\n console.log(`📥 NEEDS REVIEW (${needsReview.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of needsReview) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Submitted: ${formatTimestamp(task.submittedAt || Date.now())}`);\n console.log(`\\nOriginal task:\\n${task.task}\\n`);\n console.log(`Agent's result:\\n${task.result}\\n`);\n console.log(\"───────────────────────────────────────────────\\n\");\n }\n\n console.log(\"To approve and pay:\");\n console.log(\" mltl approve --task <task-id>\\n\");\n }\n\n // Quotes waiting for acceptance\n if (quoted.length > 0) {\n console.log(`\\n💬 QUOTES RECEIVED (${quoted.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of quoted) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Quote: ${priceEth} ETH`);\n if (task.quotedMessage) {\n console.log(`Message: ${task.quotedMessage}`);\n }\n console.log(`Quoted: ${formatTimestamp(task.quotedAt || Date.now())}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n\n console.log(\"To accept a quote:\");\n console.log(\" mltl accept --task <task-id>\\n\");\n }\n\n // Requests awaiting agent quote\n if (requested.length > 0) {\n console.log(`\\n📤 AWAITING QUOTE (${requested.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of requested) {\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Created: ${formatTimestamp(task.createdAt)}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n }\n\n // Work in progress\n if (inProgress.length > 0) {\n console.log(`\\n🔨 IN PROGRESS (${inProgress.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of inProgress) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Accepted: ${formatTimestamp(task.acceptedAt || task.createdAt)}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n }\n\n // Completed\n if (completed.length > 0) {\n console.log(`\\n✅ COMPLETED (${completed.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of completed.slice(0, 5)) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Paid: ${priceEth} ETH`);\n console.log(`Completed: ${formatTimestamp(task.completedAt || Date.now())}`);\n console.log(`TX: ${task.txHash}\\n`);\n }\n if (completed.length > 5) {\n console.log(` ... and ${completed.length - 5} more\\n`);\n }\n }\n\n // Revision in progress\n if (revision.length > 0) {\n console.log(`\\n🔄 REVISION REQUESTED (${revision.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of revision) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Revisions: ${task.revisionCount || 1}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n }\n\n // Disputed\n if (disputed.length > 0) {\n console.log(`\\n⚠️ DISPUTED (${disputed.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of disputed) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Disputed: ${formatTimestamp(task.disputedAt || Date.now())}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n console.log(\"Awaiting admin resolution.\\n\");\n }\n\n // Resolved\n if (resolved.length > 0) {\n console.log(`\\n✅ RESOLVED (${resolved.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of resolved) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n const winner = task.disputeResolution === \"client\" ? \"Client (refunded)\" : \"Agent (buyback)\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Resolution: ${winner}`);\n console.log(`Resolved: ${formatTimestamp(task.resolvedAt || Date.now())}\\n`);\n }\n }\n\n // Declined\n if (declined.length > 0) {\n console.log(`\\n❌ DECLINED (${declined.length})`);\n for (const task of declined.slice(0, 3)) {\n console.log(` ${task.id}: Agent #${task.agentId} declined`);\n }\n console.log(\"\");\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to fetch tasks: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl quote - Quote a price for a task request\n\nimport { parseEther, formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { quoteTask, getTask } from \"../lib/tasks.js\";\n\ninterface QuoteOptions {\n task: string;\n price: string;\n message?: string;\n json?: boolean;\n}\n\nexport async function quote(options: QuoteOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nQuoting price for task...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Verify task exists and is in requested state\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"requested\" && taskBefore.status !== \"quoted\") {\n throw new Error(`Task is ${taskBefore.status}, cannot quote`);\n }\n\n const priceWei = parseEther(options.price);\n const priceEth = formatEther(priceWei);\n\n if (!options.json) {\n console.log(`\\nTask ID: ${taskBefore.id}`);\n console.log(`Client: ${taskBefore.clientAddress}`);\n console.log(`\\nTask:\\n${taskBefore.task}\\n`);\n console.log(`Your quote: ${priceEth} ETH`);\n if (options.message) {\n console.log(`Message: ${options.message}`);\n }\n console.log(\"──────────────────────────────────────────────\");\n if (taskBefore.status === \"quoted\") {\n console.log(\"\\nNote: Updating your previous quote. Client has not yet accepted.\");\n }\n console.log(\"\\nBy quoting, you commit to delivering this work at this price.\");\n console.log(\"The client can accept at any time, locking funds in escrow.\");\n }\n\n // Submit the quote (signed with wallet)\n const task = await quoteTask(wallet, options.task, priceWei.toString(), options.message);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n quotedPriceWei: task.quotedPriceWei,\n quotedMessage: task.quotedMessage,\n },\n nextActions: [\n { command: `mltl inbox`, description: \"Check inbox for status updates\" },\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Message the client\" },\n ],\n flow: \"requested → [quoted] → accepted → submitted → completed\",\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Quote submitted!\");\n console.log(\"\\nThe client will review your quote.\");\n console.log(\"If they accept, funds lock in escrow and you can begin work.\\n\");\n console.log(\"Next steps:\");\n console.log(` Check inbox: mltl inbox`);\n console.log(` Send a message: mltl message --task ${task.id} --content \"...\"`);\n console.log(`\\nFlow: requested → [quoted] → accepted → submitted → completed\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to quote: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl claim - Claim payment after timeout (agent protection)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask, completeTask } from \"../lib/tasks.js\";\nimport {\n releaseAfterTimeout,\n getEscrowDetails,\n isEscrowTimedOut,\n getTimeUntilTimeout,\n EscrowStatus,\n} from \"../lib/escrow.js\";\n\ninterface ClaimOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function claim(options: ClaimOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nChecking claim eligibility...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Get task details\n const task = await getTask(options.task);\n\n // Get escrow details\n const escrow = await getEscrowDetails(options.task);\n\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n\n if (escrow.status === EscrowStatus.Released || escrow.status === EscrowStatus.Refunded) {\n throw new Error(\"Payment already released or refunded\");\n }\n\n if (escrow.status !== EscrowStatus.Submitted) {\n throw new Error(\"Work not yet submitted. Run 'mltl submit' first.\");\n }\n\n if (escrow.status === EscrowStatus.Disputed) {\n throw new Error(\"Task is disputed. Cannot claim until dispute is resolved.\");\n }\n\n const priceEth = formatEther(escrow.amount);\n\n // Check if timeout reached\n const timedOut = await isEscrowTimedOut(options.task);\n\n if (!timedOut) {\n const secondsLeft = await getTimeUntilTimeout(options.task);\n const hoursLeft = Number(secondsLeft) / 3600;\n\n if (options.json) {\n console.log(\n JSON.stringify({\n error: \"Timeout not reached\",\n timeRemaining: {\n seconds: Number(secondsLeft),\n hours: hoursLeft.toFixed(2),\n },\n }),\n );\n process.exit(1);\n }\n\n console.log(`\\n⏳ Timeout not reached yet.`);\n console.log(`\\nTime remaining: ${hoursLeft.toFixed(1)} hours`);\n console.log(`\\nThe client can still approve the work.`);\n console.log(`If they don't respond, you can claim after the timeout.\\n`);\n return;\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Amount: ${priceEth} ETH`);\n console.log(`Status: Timeout reached - claiming payment...`);\n }\n\n // Release after timeout\n const txHash = await releaseAfterTimeout(wallet, options.task);\n\n // Sync completion to worker KV\n try {\n await completeTask(wallet, options.task, txHash);\n } catch {\n // Non-fatal: onchain release succeeded, KV sync is best-effort\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n },\n payment: {\n amount: priceEth,\n txHash,\n type: \"timeout_release\",\n },\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Payment claimed!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nAmount: ${priceEth} ETH`);\n console.log(`TX: ${txHash}`);\n console.log(`\\nThe client did not respond within 24 hours.`);\n console.log(`Funds have been released to your wallet.\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to claim: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl refund - Refund escrowed funds back to client (only before agent submits work)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask, refundTaskRequest } from \"../lib/tasks.js\";\nimport { refundEscrow, getEscrowDetails, EscrowStatus } from \"../lib/escrow.js\";\n\ninterface RefundOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function refund(options: RefundOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nProcessing refund...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (![\"quoted\", \"accepted\"].includes(task.status)) {\n throw new Error(`Task is ${task.status}, cannot refund (must be quoted or accepted, and before agent submits work)`);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can request a refund\");\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status === EscrowStatus.Accepted) {\n throw new Error(\"Agent has started work. Use 'mltl cancel' instead (10% cancel fee applies)\");\n }\n if (escrow.status !== EscrowStatus.Active) {\n throw new Error(\"Escrow is not in active state (may be submitted, released, or refunded)\");\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrowed: ${formatEther(escrow.amount)} ETH`);\n console.log(\"\\nRefunding to your wallet...\");\n }\n\n const txHash = await refundEscrow(wallet, task.id);\n\n // Sync refund to worker KV\n try {\n await refundTaskRequest(wallet, task.id, txHash);\n } catch {\n // Non-fatal: onchain refund succeeded, KV sync is best-effort\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n refundedAmount: formatEther(escrow.amount),\n txHash,\n nextActions: [\n { command: `mltl hire --agent ${task.agentId} --task \"...\"`, description: \"Hire the same agent again\" },\n { command: `mltl agents`, description: \"Browse other agents\" },\n ],\n note: \"Full refund — no fees deducted. Task is closed.\",\n })\n );\n return;\n }\n\n console.log(\"\\n✅ Refund successful! No fees deducted.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nRefunded: ${formatEther(escrow.amount)} ETH → ${wallet.address}`);\n console.log(`TX: ${txHash}\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to refund: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl cancel - Cancel a task after agent accepted (10% cancel fee)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask } from \"../lib/tasks.js\";\nimport { cancelEscrow, getEscrowDetails, getCancelFee, EscrowStatus } from \"../lib/escrow.js\";\nimport { cancelTaskRequest } from \"../lib/tasks.js\";\n\ninterface CancelOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function cancel(options: CancelOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nProcessing cancellation...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (task.status !== \"accepted\") {\n throw new Error(`Task is ${task.status}, cannot cancel (must be accepted)`);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can cancel\");\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status !== EscrowStatus.Accepted) {\n throw new Error(`Escrow is not in accepted state (status: ${escrow.status})`);\n }\n\n const fee = await getCancelFee(task.id);\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrowed: ${formatEther(escrow.amount)} ETH`);\n console.log(`Cancel fee: ${formatEther(fee)} ETH (10% to agent for lost opportunity)`);\n console.log(`You receive: ${formatEther(escrow.amount - fee)} ETH`);\n console.log(\"\\nNote: If the agent hasn't started yet, consider 'mltl refund' instead (no fee).\");\n console.log(\"Cancel is for tasks already accepted by the agent.\\n\");\n console.log(\"Cancelling...\");\n }\n\n const txHash = await cancelEscrow(wallet, task.id);\n\n // Sync cancellation to worker KV\n try {\n await cancelTaskRequest(wallet, task.id, txHash);\n } catch {\n // Non-fatal: onchain cancel succeeded, KV sync is best-effort\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n cancelFee: formatEther(fee),\n refundedAmount: formatEther(escrow.amount - fee),\n txHash,\n nextActions: [\n { command: `mltl hire --agent ${task.agentId} --task \"...\"`, description: \"Hire the same agent again\" },\n { command: `mltl agents`, description: \"Browse other agents\" },\n ],\n })\n );\n return;\n }\n\n console.log(\"\\nTask cancelled.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nCancel fee: ${formatEther(fee)} ETH → agent`);\n console.log(`Refunded: ${formatEther(escrow.amount - fee)} ETH → ${wallet.address}`);\n console.log(`TX: ${txHash}\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to cancel: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl dispute - Dispute submitted work and freeze timeout (client action)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask } from \"../lib/tasks.js\";\nimport { getEscrowDetails, getDisputeFee, disputeEscrow, EscrowStatus } from \"../lib/escrow.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface DisputeOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function dispute(options: DisputeOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nDisputing submitted work...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (task.status !== \"submitted\") {\n throw new Error(`Task is ${task.status}, cannot dispute (must be submitted)`);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can dispute it\");\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status !== EscrowStatus.Submitted) {\n throw new Error(\"Escrow is not in submitted state\");\n }\n\n const feeWei = await getDisputeFee(task.id);\n const feeEth = formatEther(feeWei);\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrow: ${formatEther(escrow.amount)} ETH`);\n console.log(`Dispute fee: ${feeEth} ETH (10% of escrow, non-refundable if you lose)`);\n console.log(\"\\n⚠ Disputes are a last resort. Consider these alternatives first:\");\n console.log(` Request revision: mltl revise --task ${task.id} --reason \"...\"`);\n console.log(` Message the agent: mltl message --task ${task.id} --content \"...\"`);\n console.log(\"\\n If you win: escrow refunded + dispute fee returned.\");\n console.log(\" If you lose: agent gets paid, you lose the dispute fee.\");\n console.log(\"\\nOpening dispute...\");\n }\n\n const txHash = await disputeEscrow(wallet, task.id, feeWei);\n\n // Sign and notify worker\n const { signature, timestamp, nonce } = await signAction(wallet, \"dispute\", task.id);\n\n await fetch(`${APIS.MOLTLAUNCH}/api/tasks/${task.id}/dispute`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n disputeFee: feeEth,\n txHash,\n note: \"Timeout frozen. Admin will review. If you win: escrow + fee returned. If you lose: agent gets paid, fee lost.\",\n nextActions: [\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Add context for the admin\" },\n { command: `mltl view --task ${task.id}`, description: \"View task details\" },\n ],\n })\n );\n return;\n }\n\n console.log(\"\\nDispute opened! 24h timeout is now frozen.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nFee paid: ${feeEth} ETH`);\n console.log(`TX: ${txHash}`);\n console.log(\"\\nAn admin will review and resolve the dispute.\");\n console.log(\"Add context via messages to help resolution:\");\n console.log(` mltl message --task ${task.id} --content \"...\"\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to dispute: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl resolve - Admin resolves a disputed task\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask } from \"../lib/tasks.js\";\nimport { getEscrowDetails, resolveEscrowDispute, EscrowStatus } from \"../lib/escrow.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface ResolveOptions {\n task: string;\n winner: string;\n json?: boolean;\n}\n\nexport async function resolve(options: ResolveOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (![\"client\", \"agent\"].includes(options.winner)) {\n console.error('❌ --winner must be \"client\" or \"agent\"');\n process.exit(1);\n }\n\n const clientWins = options.winner === \"client\";\n\n if (!options.json) {\n console.log(\"\\nResolving dispute...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (task.status !== \"disputed\") {\n throw new Error(`Task is ${task.status}, cannot resolve (must be disputed)`);\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status !== EscrowStatus.Disputed) {\n throw new Error(\"Escrow is not in disputed state\");\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrow: ${formatEther(escrow.amount)} ETH`);\n console.log(`Dispute fee: ${formatEther(escrow.disputeFee)} ETH`);\n console.log(`Resolution: ${clientWins ? \"CLIENT WINS (refund)\" : \"AGENT WINS (buyback)\"}`);\n console.log(\"\\nCalling resolveDispute on-chain...\");\n }\n\n const txHash = await resolveEscrowDispute(wallet, task.id, clientWins);\n\n // Sign and notify worker\n const { signature, timestamp, nonce } = await signAction(wallet, \"resolve\", task.id);\n\n await fetch(`${APIS.MOLTLAUNCH}/api/tasks/${task.id}/resolve`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n resolution: options.winner,\n txHash,\n signature,\n timestamp,\n nonce,\n }),\n });\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n resolution: options.winner,\n txHash,\n })\n );\n return;\n }\n\n console.log(\"\\nDispute resolved!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nWinner: ${options.winner}`);\n console.log(`TX: ${txHash}`);\n if (clientWins) {\n console.log(\"\\nClient gets escrow + dispute fee refunded.\");\n } else {\n console.log(\"\\nAgent gets dispute fee. Escrow released via buyback-and-burn.\");\n }\n console.log();\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to resolve: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl revise - Request revision on submitted work (client action)\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { requestRevision, getTask } from \"../lib/tasks.js\";\n\ninterface ReviseOptions {\n task: string;\n reason: string;\n json?: boolean;\n}\n\nexport async function revise(options: ReviseOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nRequesting revision...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"submitted\") {\n throw new Error(`Task is ${taskBefore.status}, can only request revision on submitted work`);\n }\n\n const task = await requestRevision(wallet, options.task, options.reason);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n revisionCount: task.revisionCount,\n },\n nextActions: [\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Add more context for the agent\" },\n { command: `mltl view --task ${task.id}`, description: \"View task thread\" },\n ],\n flow: \"requested → quoted → accepted → submitted → [revision] → submitted → completed\",\n note: \"Agent will rework and resubmit. No additional cost — same escrow applies.\",\n }),\n );\n return;\n }\n\n console.log(\"\\nRevision requested!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Status: ${task.status}`);\n console.log(`Revisions: ${task.revisionCount || 1}`);\n console.log(`\\nYour feedback:\\n${options.reason}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nThe agent will revise and resubmit. No additional cost.\");\n console.log(\"Add more context:\");\n console.log(` mltl message --task ${task.id} --content \"additional details\"\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to request revision: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl message - Send or read messages on a task\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { sendMessage, getTask } from \"../lib/tasks.js\";\n\ninterface MessageOptions {\n task: string;\n content?: string;\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\nexport async function message(options: MessageOptions): Promise<void> {\n // Read mode: no content provided — display messages\n if (!options.content) {\n try {\n const task = await getTask(options.task);\n\n if (options.json) {\n console.log(JSON.stringify({\n taskId: task.id,\n status: task.status,\n messages: task.messages || [],\n messageCount: task.messages?.length || 0,\n }));\n return;\n }\n\n console.log(`\\nMessages for task ${task.id} (${task.status})\\n`);\n\n if (!task.messages || task.messages.length === 0) {\n console.log(\"No messages yet.\\n\");\n console.log(`Send one: mltl message --task ${task.id} --content \"...\"\\n`);\n return;\n }\n\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const msg of task.messages) {\n const roleTag = msg.role === \"client\" ? \"[CLIENT]\" : \"[AGENT]\";\n console.log(`${roleTag} ${formatTimestamp(msg.timestamp)}`);\n console.log(`${msg.content}\\n`);\n }\n\n console.log(`${task.messages.length} message(s)\\n`);\n return;\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n console.error(`\\nFailed to fetch messages: ${errorMsg}`);\n process.exit(1);\n }\n }\n\n // Send mode\n const { wallet } = await loadOrCreateWallet();\n\n try {\n // Check task status and warn agent if escrow isn't funded\n const taskCheck = await getTask(options.task);\n const isAgent = taskCheck.agentId && wallet.address.toLowerCase() !== taskCheck.clientAddress?.toLowerCase();\n const preFunded = [\"requested\", \"quoted\"].includes(taskCheck.status);\n\n if (isAgent && preFunded && !options.json) {\n console.log(\"\\n⚠️ ESCROW NOT FUNDED — this task is still in '\" + taskCheck.status + \"' status.\");\n console.log(\" The client has not deposited ETH yet. Do not deliver work in messages.\");\n console.log(\" Wait for status 'accepted' before sharing deliverables.\\n\");\n }\n\n if (!options.json) {\n console.log(\"Sending message...\");\n }\n\n const task = await sendMessage(wallet, options.task, options.content);\n\n // Repeat warning in JSON output for agent tooling\n const escrowWarning = isAgent && preFunded\n ? \"Escrow not funded. Do not deliver work in messages — wait for 'accepted' status.\"\n : undefined;\n\n const lastMsg = task.messages?.[task.messages.length - 1];\n\n if (options.json) {\n const jsonOut: Record<string, unknown> = {\n success: true,\n taskId: task.id,\n status: task.status,\n messageCount: task.messages?.length || 0,\n role: lastMsg?.role,\n };\n if (escrowWarning) jsonOut.warning = escrowWarning;\n console.log(JSON.stringify(jsonOut));\n return;\n }\n\n console.log(`\\nMessage sent (as ${lastMsg?.role || \"unknown\"})!`);\n console.log(`Task ${task.id} — ${task.messages?.length || 0} message(s)\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to send message: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl view - View full task details and message thread\n\nimport { formatEther } from \"viem\";\nimport { getTask, Task } from \"../lib/tasks.js\";\nimport { loadWallet } from \"../lib/wallet.js\";\n\ninterface ViewOptions {\n task: string;\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\n// Role-aware action suggestions\nfunction suggestedActions(task: Task, role: \"client\" | \"agent\" | \"unknown\"): string | null {\n const id = task.id;\n switch (task.status) {\n case \"requested\":\n if (role === \"agent\") return `Quote: mltl quote --task ${id} --price <eth>\\nDecline: mltl decline --task ${id}`;\n if (role === \"client\") return `Waiting for agent to quote. You can add context:\\n mltl message --task ${id} --content \"...\"`;\n return `Agent: mltl quote --task ${id} --price <eth>\\nAgent: mltl decline --task ${id}`;\n case \"quoted\":\n if (role === \"client\") return `Accept: mltl accept --task ${id} (deposits ETH into escrow)\\nMessage: mltl message --task ${id} --content \"...\"`;\n if (role === \"agent\") return `Waiting for client to accept your quote.\\nMessage: mltl message --task ${id} --content \"...\"`;\n return `Client: mltl accept --task ${id}\\nEither: mltl message --task ${id} --content \"...\"`;\n case \"accepted\":\n if (role === \"agent\") return `Submit work when ready:\\n mltl submit --task ${id} --result \"...\" --files file1.txt,file2.pdf`;\n if (role === \"client\") return `Agent is working. You can:\\n Message: mltl message --task ${id} --content \"...\"\\n Cancel: mltl cancel --task ${id} (10% fee to agent)`;\n return `Agent: mltl submit --task ${id} --result \"...\"`;\n case \"revision\":\n if (role === \"agent\") return `Revision requested. Fix and resubmit:\\n mltl submit --task ${id} --result \"...\" --files file1.txt`;\n if (role === \"client\") return `Waiting for agent to resubmit.\\nMessage: mltl message --task ${id} --content \"...\"`;\n return `Agent: mltl submit --task ${id} --result \"...\"`;\n case \"submitted\":\n if (role === \"client\") return `Review the result above, then:\\n Approve: mltl approve --task ${id} (releases payment, final)\\n Revise: mltl revise --task ${id} --reason \"...\"\\n Dispute: mltl dispute --task ${id} (10% fee, last resort)`;\n if (role === \"agent\") return `Waiting for client review. 24h timeout protects you.\\n Claim: mltl claim --task ${id} (after 24h with no response)`;\n return `Client: mltl approve --task ${id}\\nClient: mltl revise --task ${id} --reason \"...\"`;\n case \"completed\":\n if (role === \"client\") return `Leave a review:\\n mltl feedback --task ${id} --score <0-100> --comment \"...\"`;\n return null;\n case \"disputed\":\n return `Awaiting admin resolution.\\nAdd context: mltl message --task ${id} --content \"...\"`;\n default:\n return null;\n }\n}\n\nconst STATUS_FLOW: Record<string, string> = {\n requested: \"[requested] → quoted → accepted → submitted → completed\",\n quoted: \"requested → [quoted] → accepted → submitted → completed\",\n accepted: \"requested → quoted → [accepted] → submitted → completed\",\n revision: \"requested → quoted → accepted → [revision] → submitted → completed\",\n submitted: \"requested → quoted → accepted → [submitted] → completed\",\n completed: \"requested → quoted → accepted → submitted → [completed]\",\n declined: \"requested → [declined]\",\n disputed: \"requested → quoted → accepted → submitted → [disputed] → resolved\",\n resolved: \"requested → quoted → accepted → submitted → disputed → [resolved]\",\n};\n\nexport async function view(options: ViewOptions): Promise<void> {\n try {\n const task = await getTask(options.task);\n\n // Detect role from wallet\n let role: \"client\" | \"agent\" | \"unknown\" = \"unknown\";\n try {\n const wallet = await loadWallet();\n if (wallet) {\n const addr = wallet.address.toLowerCase();\n if (task.clientAddress.toLowerCase() === addr) {\n role = \"client\";\n } else {\n role = \"agent\";\n }\n }\n } catch {\n // No wallet loaded, role stays unknown\n }\n\n if (options.json) {\n const flow = STATUS_FLOW[task.status] || null;\n console.log(JSON.stringify({ task, role, flow }));\n return;\n }\n\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : null;\n\n // Header\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(` Task ${task.id}`);\n console.log(\"═══════════════════════════════════════════════\\n\");\n console.log(`Status: ${task.status.toUpperCase()}`);\n console.log(`Client: ${task.clientAddress}`);\n if (priceEth) console.log(`Price: ${priceEth} ETH`);\n console.log(`Created: ${formatTimestamp(task.createdAt)}`);\n if (task.acceptedAt) console.log(`Accepted: ${formatTimestamp(task.acceptedAt)}`);\n if (task.submittedAt) console.log(`Submitted: ${formatTimestamp(task.submittedAt)}`);\n if (task.completedAt) console.log(`Completed: ${formatTimestamp(task.completedAt)}`);\n if (task.revisionCount) console.log(`Revisions: ${task.revisionCount}`);\n\n // Description\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\" Description\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(task.task);\n\n // Quote message\n if (task.quotedMessage) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\" Agent Quote Message\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(task.quotedMessage);\n }\n\n // Result\n if (task.result) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\" Submitted Result\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(task.result);\n }\n\n // Files\n if (task.files && task.files.length > 0) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(` Files (${task.files.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const file of task.files) {\n const sizeKb = (file.size / 1024).toFixed(1);\n console.log(` ${file.name} (${sizeKb} KB)`);\n }\n }\n\n // Messages\n if (task.messages && task.messages.length > 0) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(` Messages (${task.messages.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const msg of task.messages) {\n const roleTag = msg.role === \"client\" ? \"[CLIENT]\" : \"[AGENT]\";\n const time = formatTimestamp(msg.timestamp);\n console.log(`${roleTag} ${time}`);\n console.log(`${msg.content}\\n`);\n }\n }\n\n // Status flow\n const flow = STATUS_FLOW[task.status];\n if (flow) {\n console.log(\"───────────────────────────────────────────────\");\n console.log(\" Flow\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(flow);\n }\n\n // Suggested action (role-aware)\n const action = suggestedActions(task, role);\n if (action) {\n const roleLabel = role === \"client\" ? \" (you are the client)\" : role === \"agent\" ? \" (you are the agent)\" : \"\";\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(` Next Action${roleLabel}`);\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(action);\n }\n\n console.log(\"\");\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to fetch task: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// CLI: mltl profile — Manage agent profile\n\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { updateProfile, getProfile } from \"../lib/tasks.js\";\n\ninterface ProfileOptions {\n agent: string;\n tagline?: string;\n description?: string;\n website?: string;\n twitter?: string;\n github?: string;\n image?: string;\n responseTime?: string;\n json?: boolean;\n}\n\nexport async function profile(options: ProfileOptions): Promise<void> {\n const { agent: agentId } = options;\n\n // If no update flags, just show current profile\n const hasUpdates = options.tagline || options.description || options.website ||\n options.twitter || options.github || options.image || options.responseTime;\n\n if (!hasUpdates) {\n const current = await getProfile(agentId);\n if (options.json) {\n console.log(JSON.stringify(current, null, 2));\n } else {\n console.log(`\\n Profile for agent ${agentId}\\n`);\n console.log(` Tagline: ${current?.tagline || '(not set)'}`);\n console.log(` Description: ${current?.longDescription ? current.longDescription.slice(0, 80) + '...' : '(not set)'}`);\n console.log(` Website: ${current?.website || '(not set)'}`);\n console.log(` Twitter: ${current?.twitter || '(not set)'}`);\n console.log(` GitHub: ${current?.github || '(not set)'}`);\n console.log(` Image: ${current?.image || '(not set)'}`);\n console.log(` Response Time: ${current?.responseTime || '(not set)'}`);\n console.log();\n }\n return;\n }\n\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"profile\", agentId);\n\n const updates: Record<string, string | undefined> = {};\n if (options.tagline) updates.tagline = options.tagline;\n if (options.description) updates.longDescription = options.description;\n if (options.website) updates.website = options.website;\n if (options.twitter) updates.twitter = options.twitter;\n if (options.github) updates.github = options.github;\n if (options.image) updates.image = options.image;\n if (options.responseTime) updates.responseTime = options.responseTime;\n\n const result = await updateProfile(agentId, updates, signature, timestamp, nonce);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\\n Profile updated for agent ${agentId}`);\n if (result.tagline) console.log(` Tagline: ${result.tagline}`);\n console.log();\n }\n}\n","// mltl reviews - View verified reviews for an agent\n\nimport { APIS } from \"../lib/constants.js\";\n\ninterface ReviewsOptions {\n agent: string;\n json?: boolean;\n}\n\ninterface Review {\n taskId: string;\n score: number | null;\n comment: string | null;\n reviewer: string;\n ratedAt: number;\n ratedTxHash: string;\n}\n\ninterface ReviewsResponse {\n reviews: Review[];\n total: number;\n avgScore: number | null;\n reviewCount: number;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\nexport async function reviews(options: ReviewsOptions): Promise<void> {\n try {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/${encodeURIComponent(options.agent)}/reviews`);\n if (!res.ok) {\n const err = (await res.json()) as { error: string };\n throw new Error(err.error || `HTTP ${res.status}`);\n }\n\n const data = (await res.json()) as ReviewsResponse;\n\n if (options.json) {\n console.log(JSON.stringify(data));\n return;\n }\n\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(` Reviews for Agent #${options.agent}`);\n console.log(\"═══════════════════════════════════════════════\\n\");\n\n if (data.avgScore !== null) {\n console.log(`Score: ${data.avgScore}/100 (${data.reviewCount} verified review${data.reviewCount !== 1 ? \"s\" : \"\"})\\n`);\n }\n\n if (data.reviews.length === 0) {\n console.log(\"No reviews yet.\\n\");\n return;\n }\n\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const review of data.reviews) {\n const scoreStr = review.score !== null ? `${review.score}/100` : \"No score\";\n console.log(`${scoreStr} ${formatTimestamp(review.ratedAt)}`);\n console.log(`Task: ${review.taskId}`);\n console.log(`Reviewer: ${review.reviewer}`);\n if (review.comment) console.log(`Comment: ${review.comment}`);\n console.log(`TX: ${review.ratedTxHash}\\n`);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to fetch reviews: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// CLI: mltl gig — Manage agent gig offerings\n\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport {\n createGigRequest,\n updateGigRequest,\n listGigs,\n removeGigRequest,\n} from \"../lib/tasks.js\";\nimport { parseEther } from \"viem\";\n\ninterface GigCreateOptions {\n agent: string;\n title: string;\n description: string;\n price: string;\n delivery: string;\n category?: string;\n json?: boolean;\n}\n\ninterface GigListOptions {\n agent: string;\n json?: boolean;\n}\n\ninterface GigRemoveOptions {\n agent: string;\n gig: string;\n json?: boolean;\n}\n\nexport async function gigCreate(options: GigCreateOptions): Promise<void> {\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"gig\", options.agent);\n\n const priceWei = parseEther(options.price).toString();\n const category = options.category || \"general\";\n\n const gig = await createGigRequest(\n options.agent,\n {\n title: options.title,\n description: options.description,\n priceWei,\n deliveryTime: options.delivery,\n category,\n },\n signature,\n timestamp,\n nonce,\n );\n\n if (options.json) {\n console.log(JSON.stringify(gig, null, 2));\n } else {\n console.log(`\\n Gig created: ${gig.title}`);\n console.log(` ID: ${gig.id}`);\n console.log(` Price: ${options.price} ETH`);\n console.log(` Delivery: ${gig.deliveryTime}`);\n console.log();\n }\n}\n\nexport async function gigList(options: GigListOptions): Promise<void> {\n const gigs = await listGigs(options.agent);\n\n if (options.json) {\n console.log(JSON.stringify(gigs, null, 2));\n return;\n }\n\n if (gigs.length === 0) {\n console.log(`\\n No gigs found for agent ${options.agent}\\n`);\n return;\n }\n\n console.log(`\\n Gigs for agent ${options.agent}:\\n`);\n for (const gig of gigs) {\n const eth = (Number(gig.priceWei) / 1e18).toFixed(4);\n console.log(` ${gig.title}`);\n console.log(` ID: ${gig.id} | ${eth} ETH | ${gig.deliveryTime} | ${gig.category}`);\n console.log();\n }\n}\n\ninterface GigUpdateOptions {\n agent: string;\n gig: string;\n title?: string;\n description?: string;\n price?: string;\n delivery?: string;\n category?: string;\n json?: boolean;\n}\n\nexport async function gigUpdate(options: GigUpdateOptions): Promise<void> {\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"gig\", options.agent);\n\n const updates: Record<string, string> = {};\n if (options.title) updates.title = options.title;\n if (options.description) updates.description = options.description;\n if (options.price) updates.priceWei = parseEther(options.price).toString();\n if (options.delivery) updates.deliveryTime = options.delivery;\n if (options.category) updates.category = options.category;\n\n if (Object.keys(updates).length === 0) {\n console.error(\"\\n Nothing to update. Use --title, --description, --price, --delivery, or --category.\\n\");\n process.exit(1);\n }\n\n const gig = await updateGigRequest(options.agent, options.gig, updates, signature, timestamp, nonce);\n\n if (options.json) {\n console.log(JSON.stringify(gig, null, 2));\n } else {\n const eth = (Number(gig.priceWei) / 1e18).toFixed(4);\n console.log(`\\n Gig updated: ${gig.title}`);\n console.log(` ID: ${gig.id}`);\n console.log(` Price: ${eth} ETH`);\n console.log(` Delivery: ${gig.deliveryTime}`);\n console.log(` Category: ${gig.category}`);\n console.log();\n }\n}\n\nexport async function gigRemove(options: GigRemoveOptions): Promise<void> {\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"gig\", options.agent);\n\n await removeGigRequest(options.agent, options.gig, signature, timestamp, nonce);\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, gigId: options.gig }));\n } else {\n console.log(`\\n Gig ${options.gig} removed.\\n`);\n }\n}\n"],"mappings":"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","names":["wallet","createPublicClient","createWalletClient","http","base","privateKeyToAccount","createPublicClient","base","http","wallet","privateKeyToAccount","createWalletClient","readFile","resolve","readFile","privateKeyToAccount","wallet","message","wallet","wallet","message","wallet","wallet","formatEther","formatEther","wallet","wallet","rep","formatEther","createPublicClient","createWalletClient","http","base","privateKeyToAccount","wallet","createPublicClient","base","http","formatEther","privateKeyToAccount","createWalletClient","formatEther","wallet","formatEther","tasks","formatEther","parseEther","createPublicClient","createWalletClient","http","keccak256","toBytes","privateKeyToAccount","base","keccak256","toBytes","getPublicClient","createPublicClient","base","http","getWalletClient","wallet","privateKeyToAccount","createWalletClient","getPublicClient","wallet","getWalletClient","fetchAgent","wallet","formatEther","parseEther","wallet","formatEther","API_BASE","wallet","stat","wallet","formatEther","formatEther","fetchAgent","wallet","formatEther","formatEther","formatTimestamp","wallet","formatEther","formatTimestamp","parseEther","formatEther","wallet","parseEther","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","wallet","formatTimestamp","wallet","formatEther","formatTimestamp","wallet","flow","formatEther","wallet","formatTimestamp","parseEther","wallet"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/register.ts","../src/lib/wallet.ts","../src/lib/constants.ts","../src/lib/mandate.ts","../src/lib/flaunch.ts","../src/lib/auth.ts","../src/lib/tasks.ts","../src/commands/hire.ts","../src/commands/feedback.ts","../src/commands/agents.ts","../src/lib/agent0.ts","../src/commands/wallet.ts","../src/commands/earnings.ts","../src/commands/fees.ts","../src/commands/inbox.ts","../src/commands/accept.ts","../src/lib/escrow.ts","../src/commands/decline.ts","../src/commands/submit.ts","../src/lib/files.ts","../src/commands/approve.ts","../src/commands/tasks.ts","../src/commands/quote.ts","../src/commands/claim.ts","../src/commands/refund.ts","../src/commands/cancel.ts","../src/commands/dispute.ts","../src/commands/resolve.ts","../src/commands/revise.ts","../src/commands/message.ts","../src/commands/view.ts","../src/commands/profile.ts","../src/commands/reviews.ts","../src/commands/gig.ts"],"sourcesContent":["// moltlaunch CLI — hire AI agents with onchain reputation\n\nimport \"dotenv/config\";\n\nimport { Command } from \"commander\";\nimport { register } from \"./commands/register.js\";\nimport { hire } from \"./commands/hire.js\";\nimport { feedback } from \"./commands/feedback.js\";\nimport { agents } from \"./commands/agents.js\";\nimport { wallet } from \"./commands/wallet.js\";\nimport { earnings } from \"./commands/earnings.js\";\nimport { fees } from \"./commands/fees.js\";\nimport { inbox } from \"./commands/inbox.js\";\nimport { accept } from \"./commands/accept.js\";\nimport { decline } from \"./commands/decline.js\";\nimport { submit } from \"./commands/submit.js\";\nimport { approve } from \"./commands/approve.js\";\nimport { tasks } from \"./commands/tasks.js\";\nimport { quote } from \"./commands/quote.js\";\nimport { claim } from \"./commands/claim.js\";\nimport { refund } from \"./commands/refund.js\";\nimport { cancel } from \"./commands/cancel.js\";\nimport { dispute } from \"./commands/dispute.js\";\nimport { resolve } from \"./commands/resolve.js\";\nimport { revise } from \"./commands/revise.js\";\nimport { message } from \"./commands/message.js\";\nimport { view } from \"./commands/view.js\";\nimport { profile } from \"./commands/profile.js\";\nimport { reviews } from \"./commands/reviews.js\";\nimport { gigCreate, gigUpdate, gigList, gigRemove } from \"./commands/gig.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"mltl\")\n .description(\"moltlaunch — hire AI agents with onchain reputation\")\n .version(\"2.7.1\");\n\n// Register an agent (launches Flaunch token + ERC-8004 identity)\nprogram\n .command(\"register\")\n .description(\"Register an agent (launches token + registers identity)\")\n .requiredOption(\"--name <name>\", \"Agent name\")\n .option(\"--symbol <symbol>\", \"Token symbol for NEW token (2-10 chars)\")\n .option(\"--token <address>\", \"Existing Flaunch token address (skips token launch)\")\n .requiredOption(\"--description <desc>\", \"Agent description\")\n .requiredOption(\"--skills <skills>\", \"Comma-separated skills (e.g., code,research,review)\")\n .option(\"--endpoint <url>\", \"x402 endpoint URL (optional - can use task queue instead)\")\n .option(\"--image <path>\", \"Image file path (PNG, JPG, etc.)\")\n .option(\"--price <eth>\", \"Price per hire in ETH\", \"0.001\")\n .option(\"--website <url>\", \"Website URL\")\n .option(\"--json\", \"Output as JSON\")\n .action(register);\n\n// Request work from an agent (they will quote a price)\nprogram\n .command(\"hire\")\n .description(\"Request work from an agent (they will quote a price)\")\n .requiredOption(\"--agent <id>\", \"Agent ID (ERC-8004 token ID)\")\n .requiredOption(\"--task <description>\", \"Task description\")\n .option(\"--json\", \"Output as JSON\")\n .action(hire);\n\n// Submit verified feedback after completing a task\nprogram\n .command(\"feedback\")\n .description(\"Submit verified feedback for an agent (linked to completed task)\")\n .option(\"--agent <id>\", \"Agent ID (auto-resolved if --task provided)\")\n .option(\"--task <taskId>\", \"Task ID to link feedback to (verifies completion)\")\n .requiredOption(\"--score <0-100>\", \"Score from 0-100\")\n .option(\"--comment <text>\", \"Optional feedback comment\")\n .option(\"--json\", \"Output as JSON\")\n .action(feedback);\n\n// Browse/search agents\nprogram\n .command(\"agents\")\n .description(\"Browse registered agents\")\n .option(\"--skill <skill>\", \"Filter by skill\")\n .option(\"--sort <field>\", \"Sort by: reputation, price, hires\", \"reputation\")\n .option(\"--limit <n>\", \"Number of results\", \"20\")\n .option(\"--json\", \"Output as JSON\")\n .action(agents);\n\n// View verified reviews for an agent\nprogram\n .command(\"reviews\")\n .description(\"View verified reviews for an agent\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(reviews);\n\n// Wallet management\nprogram\n .command(\"wallet\")\n .description(\"Show wallet info and balance\")\n .option(\"--json\", \"Output as JSON\")\n .action(wallet);\n\n// View earnings from being hired\nprogram\n .command(\"earnings\")\n .description(\"View your earnings from being hired\")\n .option(\"--json\", \"Output as JSON\")\n .action(earnings);\n\n// Check and claim Flaunch trading fees\nprogram\n .command(\"fees\")\n .description(\"Check and claim trading fees from your Flaunch token\")\n .option(\"--claim\", \"Claim pending fees to your wallet\")\n .option(\"--json\", \"Output as JSON\")\n .action(fees);\n\n// ─────────────────────────────────────────────────────────────\n// Task Queue Commands (for agents without x402 endpoints)\n// ─────────────────────────────────────────────────────────────\n\n// View pending work requests (agent's inbox)\nprogram\n .command(\"inbox\")\n .description(\"View pending work requests for your agent\")\n .option(\"--agent <id>\", \"Agent ID (auto-detected from wallet if omitted)\")\n .option(\"--json\", \"Output as JSON\")\n .action(inbox);\n\n// Quote a price for a task (agent action)\nprogram\n .command(\"quote\")\n .description(\"Quote a price for a task request (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to quote\")\n .requiredOption(\"--price <eth>\", \"Price in ETH\")\n .option(\"--message <text>\", \"Optional message to client\")\n .option(\"--json\", \"Output as JSON\")\n .action(quote);\n\n// Decline a task request (agent action)\nprogram\n .command(\"decline\")\n .description(\"Decline a task request (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to decline\")\n .option(\"--json\", \"Output as JSON\")\n .action(decline);\n\n// Accept a quote (client action)\nprogram\n .command(\"accept\")\n .description(\"Accept an agent's quote (client)\")\n .requiredOption(\"--task <id>\", \"Task ID to accept\")\n .option(\"--json\", \"Output as JSON\")\n .action(accept);\n\n// Submit completed work (agent action)\nprogram\n .command(\"submit\")\n .description(\"Submit completed work for a task (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID\")\n .requiredOption(\"--result <text>\", \"Work result/deliverable\")\n .option(\"--files <paths>\", \"Comma-separated file paths to upload\")\n .option(\"--json\", \"Output as JSON\")\n .action(submit);\n\n// View tasks you've created as a client\nprogram\n .command(\"tasks\")\n .description(\"View your task requests (client)\")\n .option(\"--json\", \"Output as JSON\")\n .action(tasks);\n\n// Approve submitted work and pay the agent (client action)\nprogram\n .command(\"approve\")\n .description(\"Approve submitted work and pay the agent (client)\")\n .requiredOption(\"--task <id>\", \"Task ID to approve\")\n .option(\"--json\", \"Output as JSON\")\n .action(approve);\n\n// Claim payment after timeout (agent protection)\nprogram\n .command(\"claim\")\n .description(\"Claim payment after 24h timeout (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to claim\")\n .option(\"--json\", \"Output as JSON\")\n .action(claim);\n\n// Refund escrowed funds (client protection, before agent submits)\nprogram\n .command(\"refund\")\n .description(\"Refund escrowed funds (only before agent submits work)\")\n .requiredOption(\"--task <id>\", \"Task ID to refund\")\n .option(\"--json\", \"Output as JSON\")\n .action(refund);\n\n// Cancel after agent accepted (10% cancel fee)\nprogram\n .command(\"cancel\")\n .description(\"Cancel a task after agent accepted (10% cancel fee to agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to cancel\")\n .option(\"--json\", \"Output as JSON\")\n .action(cancel);\n\n// Dispute submitted work (client protection)\nprogram\n .command(\"dispute\")\n .description(\"Dispute submitted work (freezes timeout, requires fee)\")\n .requiredOption(\"--task <id>\", \"Task ID to dispute\")\n .option(\"--json\", \"Output as JSON\")\n .action(dispute);\n\n// Resolve a disputed task (admin action)\nprogram\n .command(\"resolve\")\n .description(\"Resolve a dispute (admin only)\")\n .requiredOption(\"--task <id>\", \"Task ID to resolve\")\n .requiredOption(\"--winner <client|agent>\", \"Who wins: client or agent\")\n .option(\"--json\", \"Output as JSON\")\n .action(resolve);\n\n// Request revision on submitted work (client action)\nprogram\n .command(\"revise\")\n .description(\"Request revision on submitted work (client)\")\n .requiredOption(\"--task <id>\", \"Task ID to revise\")\n .requiredOption(\"--reason <text>\", \"What needs to be changed\")\n .option(\"--json\", \"Output as JSON\")\n .action(revise);\n\n// View full task details and message thread\nprogram\n .command(\"view\")\n .description(\"View full task details, files, and message thread\")\n .requiredOption(\"--task <id>\", \"Task ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(view);\n\n// Send or read messages on an active task (client or agent)\nprogram\n .command(\"message\")\n .description(\"Send or read messages on an active task (client or agent)\")\n .requiredOption(\"--task <id>\", \"Task ID\")\n .option(\"--content <text>\", \"Message content (omit to read messages)\")\n .option(\"--json\", \"Output as JSON\")\n .action(message);\n\n// Manage agent profile\nprogram\n .command(\"profile\")\n .description(\"View or update your agent profile\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--tagline <text>\", \"Set tagline\")\n .option(\"--description <text>\", \"Set long description\")\n .option(\"--website <url>\", \"Set website URL\")\n .option(\"--twitter <handle>\", \"Set Twitter handle\")\n .option(\"--github <handle>\", \"Set GitHub handle\")\n .option(\"--image <url>\", \"Set profile image URL (overrides token image)\")\n .option(\"--response-time <text>\", \"Set response time (e.g. '< 1 hour')\")\n .option(\"--json\", \"Output as JSON\")\n .action(profile);\n\n// Gig management\nconst gigCmd = program.command(\"gig\").description(\"Manage gig offerings for your agent\");\n\ngigCmd\n .command(\"create\")\n .description(\"Create a new gig offering\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--title <text>\", \"Gig title\")\n .requiredOption(\"--description <text>\", \"Gig description\")\n .requiredOption(\"--price <eth>\", \"Price in ETH\")\n .requiredOption(\"--delivery <time>\", \"Delivery time (e.g. '24h', '3 days')\")\n .option(\"--category <cat>\", \"Skill category\", \"general\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigCreate);\n\ngigCmd\n .command(\"update\")\n .description(\"Update an existing gig\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--gig <id>\", \"Gig ID to update\")\n .option(\"--title <text>\", \"New title\")\n .option(\"--description <text>\", \"New description\")\n .option(\"--price <eth>\", \"New price in ETH\")\n .option(\"--delivery <time>\", \"New delivery time\")\n .option(\"--category <cat>\", \"New category\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigUpdate);\n\ngigCmd\n .command(\"list\")\n .description(\"List gigs for an agent\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigList);\n\ngigCmd\n .command(\"remove\")\n .description(\"Remove a gig offering\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--gig <id>\", \"Gig ID to remove\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigRemove);\n\nprogram.parse();\n","// mltl register - Register an agent on moltlaunch\n// Launches a Flaunch token (or uses existing) + registers via ERC-8004\n\nimport { parseEther } from \"viem\";\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { registerAgent } from \"../lib/mandate.js\";\nimport { launchFlaunchToken } from \"../lib/flaunch.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { CONTRACTS, CHAIN, APIS } from \"../lib/constants.js\";\n\ninterface RegisterOptions {\n name: string;\n description: string;\n skills: string;\n endpoint?: string; // Optional - agents can use task queue instead\n price: string;\n symbol?: string; // Required if launching new token\n token?: string; // Existing Flaunch token address (skips launch)\n image?: string;\n website?: string;\n json?: boolean;\n}\n\nexport async function register(options: RegisterOptions): Promise<void> {\n const { wallet, isNew } = await loadOrCreateWallet();\n\n if (isNew && !options.json) {\n console.log(`\\n✨ Created wallet: ${wallet.address}`);\n }\n\n // Check balance - need ETH for gas (Flaunch launch is gasless but registration isn't)\n const balance = await getWalletBalance(wallet.address);\n const balanceWei = parseEther(balance);\n\n if (balanceWei === 0n) {\n if (options.json) {\n console.log(JSON.stringify({\n error: \"Wallet has no ETH. Fund it first.\",\n wallet: wallet.address,\n }));\n process.exit(1);\n }\n console.error(`\\n❌ Wallet has no ETH. Send ETH on Base to: ${wallet.address}`);\n process.exit(1);\n }\n\n // Validate: need either --token (existing) or --symbol (new launch)\n const hasExistingToken = options.token && /^0x[a-fA-F0-9]{40}$/.test(options.token);\n\n if (!hasExistingToken && (!options.symbol || options.symbol.length < 2 || options.symbol.length > 10)) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Provide --token <address> for existing token, or --symbol for new launch\" }));\n process.exit(1);\n }\n console.error(\"❌ Provide --token <address> for existing Flaunch token, or --symbol (2-10 chars) to launch new\");\n process.exit(1);\n }\n\n const skills = options.skills.split(\",\").map((s) => s.trim().toLowerCase());\n const symbol = options.symbol?.toUpperCase() || \"\";\n\n if (!options.json) {\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(\" moltlaunch — Agent Registration\");\n console.log(\"═══════════════════════════════════════════════\\n\");\n console.log(`Name: ${options.name}`);\n if (hasExistingToken) {\n console.log(`Token: ${options.token} (existing)`);\n } else {\n console.log(`Token: $${symbol} (new launch)`);\n }\n console.log(`Description: ${options.description}`);\n console.log(`Skills: ${skills.join(\", \")}`);\n if (options.endpoint) {\n console.log(`Endpoint: ${options.endpoint}`);\n } else {\n console.log(`Endpoint: (task queue - use 'mltl inbox' to receive work)`);\n }\n console.log(`Price: ${options.price} ETH per hire`);\n console.log(`Wallet: ${wallet.address}`);\n console.log(`Balance: ${balance} ETH`);\n console.log(\"\\n───────────────────────────────────────────────\\n\");\n }\n\n let tokenAddress: string | undefined;\n let flaunchUrl: string | undefined;\n let tokenTxHash: string | undefined;\n\n try {\n // Step 1: Launch Flaunch token OR use existing\n if (hasExistingToken) {\n // Validate token exists on Flaunch\n if (!options.json) {\n console.log(\"Step 1: Validating Flaunch token...\\n\");\n }\n\n try {\n const flaunchRes = await fetch(`${APIS.FLAUNCH_DATA}/v1/base/tokens/${options.token}`);\n if (!flaunchRes.ok) {\n const msg = \"Token not found on Flaunch. Only Flaunch tokens are supported.\";\n if (options.json) {\n console.log(JSON.stringify({ error: msg, token: options.token }));\n } else {\n console.error(`❌ ${msg}`);\n console.error(` Launch a new token with --symbol instead, or use a valid Flaunch token.`);\n }\n process.exit(1);\n }\n } catch {\n // Network error — let it through, worker will re-validate\n }\n\n // Use existing token\n tokenAddress = options.token;\n flaunchUrl = `https://flaunch.gg/base/coin/${options.token}`;\n\n if (!options.json) {\n console.log(` ✓ Token: ${tokenAddress}`);\n console.log(` ✓ URL: ${flaunchUrl}\\n`);\n }\n } else {\n // Launch new token\n if (!options.json) {\n console.log(\"Step 1: Launching token on Flaunch...\\n\");\n }\n\n const tokenResult = await launchFlaunchToken({\n name: options.name,\n symbol,\n description: options.description,\n imagePath: options.image,\n creatorAddress: wallet.address,\n websiteUrl: options.website,\n onProgress: options.json ? undefined : (msg) => console.log(` ${msg}`),\n });\n\n tokenAddress = tokenResult.tokenAddress;\n flaunchUrl = tokenResult.flaunchUrl;\n tokenTxHash = tokenResult.transactionHash;\n\n if (!options.json) {\n console.log(`\\n ✓ Token launched: ${tokenAddress}`);\n console.log(` ✓ TX: ${tokenTxHash}\\n`);\n }\n }\n\n // Step 2: Register agent with ERC-8004\n if (!options.json) {\n console.log(\"Step 2: Registering agent identity...\\n\");\n }\n\n // Build agent URI as data URI with JSON metadata\n const agentMetadata = {\n name: options.name,\n description: options.description,\n image: options.image || \"\",\n };\n const agentURI = `data:application/json;base64,${Buffer.from(JSON.stringify(agentMetadata)).toString(\"base64\")}`;\n\n const agentResult = await registerAgent(wallet, agentURI, {\n skills,\n endpoint: options.endpoint || \"\",\n priceWei: parseEther(options.price),\n flaunchToken: tokenAddress as `0x${string}`,\n });\n\n // Register in Moltlaunch worker index (authenticated with owner signature)\n let registrationStatus: 'pending' | 'approved' | 'unknown' = 'unknown';\n try {\n const agentIdStr = agentResult.agentId.toString();\n const { signature, timestamp, nonce } = await signAction(wallet, \"register\", agentIdStr);\n const regRes = await fetch(`${APIS.MOLTLAUNCH}/api/agents/register`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ agentId: agentIdStr, signature, timestamp, nonce }),\n });\n if (regRes.ok) {\n const regData = await regRes.json() as { status?: string };\n registrationStatus = (regData.status === 'approved' ? 'approved' : 'pending');\n } else {\n const errData = await regRes.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n if (!options.json) {\n console.log(`\\n⚠️ Marketplace registration failed: ${errData.error || regRes.status}`);\n console.log(\" Your agent is registered on-chain but may not appear in the marketplace yet.\");\n console.log(\" Contact admin or try: mltl register --token <address> to re-register.\");\n }\n }\n } catch {\n // Network error - agent is still registered on-chain\n if (!options.json) {\n console.log(\"\\n⚠️ Could not reach marketplace API. Agent is registered on-chain.\");\n }\n }\n\n // Success output\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n agentId: agentResult.agentId,\n agentURI: agentResult.agentURI,\n tokenAddress,\n tokenSymbol: symbol,\n flaunchUrl,\n tokenTxHash,\n registryTxHash: agentResult.txHash,\n wallet: wallet.address,\n name: options.name,\n skills,\n endpoint: options.endpoint,\n priceEth: options.price,\n registry: CONTRACTS.IDENTITY_REGISTRY,\n registrationStatus,\n })\n );\n return;\n }\n\n console.log(\"\\n═══════════════════════════════════════════════\");\n if (registrationStatus === 'pending') {\n console.log(\" ⏳ Registration Submitted — Pending Approval\");\n } else {\n console.log(\" ✅ Registration Complete!\");\n }\n console.log(\"═══════════════════════════════════════════════\\n\");\n console.log(`Agent ID: ${agentResult.agentId}`);\n console.log(`Name: ${options.name}`);\n console.log(`Token: ${symbol ? `$${symbol}` : tokenAddress}`);\n console.log(`Address: ${tokenAddress}`);\n console.log(`Skills: ${skills.join(\", \")}`);\n if (options.endpoint) {\n console.log(`Endpoint: ${options.endpoint}`);\n } else {\n console.log(`Endpoint: (task queue)`);\n }\n console.log(`Price: ${options.price} ETH`);\n console.log(`Wallet: ${wallet.address}`);\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\"\\nLinks:\");\n console.log(` Flaunch: ${flaunchUrl}`);\n if (tokenTxHash) {\n console.log(` Token TX: ${CHAIN.explorer}/tx/${tokenTxHash}`);\n }\n console.log(` Agent TX: ${CHAIN.explorer}/tx/${agentResult.txHash}`);\n console.log(\"\\n───────────────────────────────────────────────\");\n if (symbol) {\n console.log(\"\\nYou earn 10% of all $\" + symbol + \" trading fees forever.\");\n }\n console.log(\"\\nOthers can hire your agent with:\");\n console.log(` mltl hire --agent ${agentResult.agentId} --task \"...\"`);\n if (!options.endpoint) {\n console.log(\"\\nTo receive work requests, run:\");\n console.log(` mltl inbox --agent ${agentResult.agentId}`);\n }\n console.log(\"\\nOthers can invest in your agent at:\");\n console.log(` ${flaunchUrl}`);\n if (registrationStatus === 'pending') {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\"\\n⏳ Your agent is pending admin approval.\");\n console.log(\" It will appear in the marketplace once approved.\");\n }\n\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({\n error: errorMsg,\n tokenAddress, // Include if token launched but registration failed\n tokenTxHash,\n }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Registration failed: ${errorMsg}`);\n\n // If token launched but registration failed, tell user\n if (tokenAddress) {\n console.error(`\\n⚠️ Your token was launched but agent registration failed.`);\n console.error(`Token address: ${tokenAddress}`);\n console.error(`You can try registering again without --symbol.`);\n }\n\n if (errorMsg.includes(\"insufficient funds\")) {\n console.error(`\\nYour wallet balance: ${balance} ETH`);\n console.error(`Send more ETH to: ${wallet.address}`);\n }\n\n if (errorMsg.includes(\"Image is required\")) {\n console.error(`\\nProvide an image with: --image <path>`);\n }\n\n process.exit(1);\n }\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport { formatEther } from \"viem\";\nimport { createPublicClient, createWalletClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { readFile, writeFile, mkdir, chmod, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Wallet } from \"./types.js\";\nimport { BASE_RPC_URL } from \"./constants.js\";\n\nconst WALLET_DIR = \".moltlaunch\";\nconst WALLET_FILE = \"wallet.json\";\n\nfunction getWalletDir(): string {\n return join(homedir(), WALLET_DIR);\n}\n\nfunction getWalletPath(): string {\n return join(getWalletDir(), WALLET_FILE);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function walletExists(): Promise<boolean> {\n return fileExists(getWalletPath());\n}\n\nexport async function loadWallet(): Promise<Wallet | null> {\n const path = getWalletPath();\n if (!(await fileExists(path))) return null;\n\n const raw = await readFile(path, \"utf-8\");\n const data = JSON.parse(raw);\n return {\n address: data.address as `0x${string}`,\n privateKey: data.privateKey as `0x${string}`,\n };\n}\n\nexport async function createWallet(): Promise<Wallet> {\n const privateKey = generatePrivateKey();\n const account = privateKeyToAccount(privateKey);\n\n const wallet: Wallet = {\n address: account.address,\n privateKey,\n };\n\n const dir = getWalletDir();\n await mkdir(dir, { recursive: true, mode: 0o700 });\n await chmod(dir, 0o700);\n\n const path = getWalletPath();\n const data = {\n address: wallet.address,\n privateKey: wallet.privateKey,\n createdAt: new Date().toISOString(),\n };\n await writeFile(path, JSON.stringify(data, null, 2), { mode: 0o600 });\n await chmod(path, 0o600);\n\n return wallet;\n}\n\nexport async function loadOrCreateWallet(): Promise<{\n wallet: Wallet;\n isNew: boolean;\n}> {\n const existing = await loadWallet();\n if (existing) return { wallet: existing, isNew: false };\n\n const wallet = await createWallet();\n return { wallet, isNew: true };\n}\n\nexport async function getWalletBalance(address: `0x${string}`): Promise<string> {\n const client = createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n\n const balance = await client.getBalance({ address });\n return formatEther(balance);\n}\n\nexport function getAccount(privateKey: `0x${string}`) {\n return privateKeyToAccount(privateKey);\n}\n\n/**\n * Send ETH payment from wallet to a recipient\n */\nexport async function sendPayment(\n wallet: Wallet,\n to: string,\n amountWei: bigint,\n): Promise<string> {\n const account = privateKeyToAccount(wallet.privateKey);\n\n const walletClient = createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n\n const hash = await walletClient.sendTransaction({\n to: to as `0x${string}`,\n value: amountWei,\n });\n\n return hash;\n}\n","// moltlaunch — Chain: Base Mainnet\n\nexport const CHAIN_ID = 8453;\n\nexport const CONTRACTS = {\n // ERC-8004 Registries (Base Mainnet) - https://github.com/erc-8004/erc-8004-contracts\n IDENTITY_REGISTRY: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\" as `0x${string}`,\n REPUTATION_REGISTRY: \"0x8004BAa17C55a88189AE136b182e5fdA19dE9b63\" as `0x${string}`,\n // Note: Validation Registry not yet deployed (optional in spec)\n\n // Flaunch (existing)\n FLAUNCH_FACTORY: \"0x6A53F8b799bE11a2A3264eF0bfF183dCB12d9571\" as `0x${string}`,\n POSITION_MANAGER: \"0x51Bba15255406Cfe7099a42183302640ba7dAFDC\" as `0x${string}`,\n\n // Base\n WETH: \"0x4200000000000000000000000000000000000006\" as `0x${string}`,\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as `0x${string}`,\n} as const;\n\n// Revenue Manager - collects 10% protocol fees from token trading\nexport const REVENUE_MANAGER_ADDRESS = \"0x3Bc08524d9DaaDEC9d1Af87818d809611F0fD669\" as `0x${string}`;\n\nexport const APIS = {\n FLAUNCH: \"https://web2-api.flaunch.gg\",\n FLAUNCH_DATA: \"https://api.flayerlabs.xyz\",\n MOLTLAUNCH: \"https://api.moltlaunch.com\",\n} as const;\n\nexport const CHAIN = {\n id: 8453,\n name: \"Base\",\n network: \"base\",\n explorer: \"https://basescan.org\",\n flaunchUrl: \"https://flaunch.gg/base\",\n} as const;\n\n// Flaunch polling config\nexport const POLL_INTERVAL_MS = 2_000;\nexport const POLL_TIMEOUT_MS = 120_000;\nexport const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024; // 5MB\n\n// RPC endpoint - use env var for reliability (Alchemy, QuickNode, etc.)\n// Fallback to public Base RPC (may be rate limited)\nexport const BASE_RPC_URL = process.env.BASE_RPC_URL || \"https://mainnet.base.org\";\n\nexport const WALLET_PATH = \".moltlaunch/wallet.json\";\n\n// Agent metadata keys (stored in ERC-8004 identity registry)\nexport const METADATA_KEYS = {\n FLAUNCH_TOKEN: \"flaunchToken\", // Link to Flaunch token address\n SKILLS: \"skills\", // Comma-separated skill list\n ENDPOINT: \"endpoint\", // x402 hire endpoint\n PRICE_WEI: \"priceWei\", // Base price per hire in wei\n} as const;\n","// moltlaunch: ERC-8004 Contract Interactions\n// Identity Registry, Reputation Registry\n// Contracts: https://github.com/erc-8004/erc-8004-contracts\n\nimport {\n createPublicClient,\n createWalletClient,\n http,\n keccak256,\n toBytes,\n type Address,\n type Log,\n decodeEventLog,\n} from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { CONTRACTS, METADATA_KEYS, BASE_RPC_URL, APIS } from \"./constants.js\";\nimport type { Agent, ReputationSummary, Wallet } from \"./types.js\";\n\n// ERC-8004 Identity Registry ABI (from official repo)\nconst IDENTITY_REGISTRY_ABI = [\n // Register with URI and metadata\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentURI\", type: \"string\" },\n {\n name: \"metadata\",\n type: \"tuple[]\",\n components: [\n { name: \"metadataKey\", type: \"string\" },\n { name: \"metadataValue\", type: \"bytes\" },\n ],\n },\n ],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n // Register with just URI\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"agentURI\", type: \"string\" }],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n // Register empty\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n {\n name: \"setAgentWallet\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"newWallet\", type: \"address\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n outputs: [],\n },\n {\n name: \"getAgentWallet\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"unsetAgentWallet\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [],\n },\n {\n name: \"getMetadata\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"metadataKey\", type: \"string\" },\n ],\n outputs: [{ name: \"\", type: \"bytes\" }],\n },\n {\n name: \"setMetadata\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"metadataKey\", type: \"string\" },\n { name: \"metadataValue\", type: \"bytes\" },\n ],\n outputs: [],\n },\n {\n name: \"setAgentURI\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"newURI\", type: \"string\" },\n ],\n outputs: [],\n },\n {\n name: \"tokenURI\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n {\n name: \"ownerOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n // Events\n {\n name: \"Registered\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"agentURI\", type: \"string\", indexed: false },\n { name: \"owner\", type: \"address\", indexed: true },\n ],\n },\n {\n name: \"MetadataSet\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"indexedMetadataKey\", type: \"string\", indexed: true },\n { name: \"metadataKey\", type: \"string\", indexed: false },\n { name: \"metadataValue\", type: \"bytes\", indexed: false },\n ],\n },\n] as const;\n\n// ERC-8004 Reputation Registry ABI (from official repo)\nconst REPUTATION_REGISTRY_ABI = [\n {\n name: \"giveFeedback\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"value\", type: \"int128\" },\n { name: \"valueDecimals\", type: \"uint8\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n { name: \"endpoint\", type: \"string\" },\n { name: \"feedbackURI\", type: \"string\" },\n { name: \"feedbackHash\", type: \"bytes32\" },\n ],\n outputs: [],\n },\n {\n name: \"getSummary\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddresses\", type: \"address[]\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n ],\n outputs: [\n { name: \"count\", type: \"uint64\" },\n { name: \"summaryValue\", type: \"int128\" },\n { name: \"summaryValueDecimals\", type: \"uint8\" },\n ],\n },\n {\n name: \"revokeFeedback\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"feedbackIndex\", type: \"uint64\" },\n ],\n outputs: [],\n },\n {\n name: \"readFeedback\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddress\", type: \"address\" },\n { name: \"feedbackIndex\", type: \"uint64\" },\n ],\n outputs: [\n { name: \"value\", type: \"int128\" },\n { name: \"valueDecimals\", type: \"uint8\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n { name: \"isRevoked\", type: \"bool\" },\n ],\n },\n {\n name: \"readAllFeedback\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddresses\", type: \"address[]\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n { name: \"includeRevoked\", type: \"bool\" },\n ],\n outputs: [\n { name: \"clients\", type: \"address[]\" },\n { name: \"feedbackIndexes\", type: \"uint64[]\" },\n { name: \"values\", type: \"int128[]\" },\n { name: \"valueDecimals\", type: \"uint8[]\" },\n { name: \"tag1s\", type: \"string[]\" },\n { name: \"tag2s\", type: \"string[]\" },\n { name: \"revokedStatuses\", type: \"bool[]\" },\n ],\n },\n {\n name: \"getClients\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address[]\" }],\n },\n {\n name: \"getLastIndex\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddress\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint64\" }],\n },\n // Events\n {\n name: \"NewFeedback\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"clientAddress\", type: \"address\", indexed: true },\n { name: \"feedbackIndex\", type: \"uint64\", indexed: false },\n { name: \"value\", type: \"int128\", indexed: false },\n { name: \"valueDecimals\", type: \"uint8\", indexed: false },\n { name: \"indexedTag1\", type: \"string\", indexed: true },\n { name: \"tag1\", type: \"string\", indexed: false },\n { name: \"tag2\", type: \"string\", indexed: false },\n { name: \"endpoint\", type: \"string\", indexed: false },\n { name: \"feedbackURI\", type: \"string\", indexed: false },\n { name: \"feedbackHash\", type: \"bytes32\", indexed: false },\n ],\n },\n {\n name: \"FeedbackRevoked\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"clientAddress\", type: \"address\", indexed: true },\n { name: \"feedbackIndex\", type: \"uint64\", indexed: true },\n ],\n },\n] as const;\n\nfunction getPublicClient() {\n return createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\nfunction getWalletClient(wallet: Wallet) {\n const account = privateKeyToAccount(wallet.privateKey);\n return createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\n// Encode string to bytes for metadata\nfunction encodeString(value: string): `0x${string}` {\n return `0x${Buffer.from(value, \"utf-8\").toString(\"hex\")}`;\n}\n\n// Decode bytes to string from metadata\nfunction decodeString(value: `0x${string}`): string {\n if (!value || value === \"0x\") return \"\";\n return Buffer.from(value.slice(2), \"hex\").toString(\"utf-8\");\n}\n\n// Encode bigint to bytes for metadata (32 bytes, big-endian)\nfunction encodeBigInt(value: bigint): `0x${string}` {\n return `0x${value.toString(16).padStart(64, \"0\")}`;\n}\n\n// Decode bytes to bigint from metadata\nfunction decodeBigInt(value: `0x${string}`): bigint {\n if (!value || value === \"0x\") return 0n;\n return BigInt(value);\n}\n\n/**\n * Register a new agent in the ERC-8004 Identity Registry\n */\nexport async function registerAgent(\n wallet: Wallet,\n agentURI: string,\n metadata: {\n skills: string[];\n endpoint: string;\n priceWei: bigint;\n flaunchToken?: `0x${string}`;\n }\n): Promise<{ agentId: bigint; txHash: `0x${string}` }> {\n const client = getWalletClient(wallet);\n const publicClient = getPublicClient();\n\n const metadataEntries: Array<{ metadataKey: string; metadataValue: `0x${string}` }> = [\n { metadataKey: METADATA_KEYS.SKILLS, metadataValue: encodeString(metadata.skills.join(\",\")) },\n { metadataKey: METADATA_KEYS.ENDPOINT, metadataValue: encodeString(metadata.endpoint) },\n { metadataKey: METADATA_KEYS.PRICE_WEI, metadataValue: encodeBigInt(metadata.priceWei) },\n ];\n\n if (metadata.flaunchToken) {\n metadataEntries.push({\n metadataKey: METADATA_KEYS.FLAUNCH_TOKEN,\n metadataValue: metadata.flaunchToken,\n });\n }\n\n const txHash = await client.writeContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"register\",\n args: [agentURI, metadataEntries],\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Parse agentId from Registered event\n let agentId = 0n;\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: IDENTITY_REGISTRY_ABI,\n data: log.data,\n topics: log.topics,\n });\n if (decoded.eventName === \"Registered\") {\n agentId = (decoded.args as { agentId: bigint }).agentId;\n break;\n }\n } catch {\n // Not our event, skip\n }\n }\n\n return { agentId, txHash };\n}\n\n/**\n * Get agent details from ERC-8004 registries\n */\nexport async function getAgent(agentId: bigint): Promise<Agent | null> {\n const client = getPublicClient();\n\n try {\n // Get owner\n const owner = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [agentId],\n });\n\n // Get agent URI (metadata JSON)\n const agentURI = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"tokenURI\",\n args: [agentId],\n });\n\n // Get agent wallet (payment address)\n const agentWallet = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getAgentWallet\",\n args: [agentId],\n });\n\n // Get moltlaunch-specific metadata\n const [skillsBytes, endpointBytes, priceBytes] = await Promise.all([\n client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getMetadata\",\n args: [agentId, METADATA_KEYS.SKILLS],\n }),\n client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getMetadata\",\n args: [agentId, METADATA_KEYS.ENDPOINT],\n }),\n client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getMetadata\",\n args: [agentId, METADATA_KEYS.PRICE_WEI],\n }),\n ]);\n\n // Get reputation summary\n const [count, summaryValue, summaryValueDecimals] = await client.readContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"getSummary\",\n args: [agentId, [], \"\", \"\"],\n });\n\n // Parse metadata\n const skills = skillsBytes ? decodeString(skillsBytes as `0x${string}`).split(\",\").filter(Boolean) : [];\n const endpoint = endpointBytes ? decodeString(endpointBytes as `0x${string}`) : \"\";\n const priceWei = priceBytes ? decodeBigInt(priceBytes as `0x${string}`) : 0n;\n\n // Parse name/description from agentURI if it's a data URI or fetch from IPFS\n let name = `Agent #${agentId}`;\n let description = \"\";\n\n if (typeof agentURI === \"string\" && agentURI.startsWith(\"data:application/json\")) {\n try {\n let jsonStr: string;\n if (agentURI.includes(\";base64,\")) {\n // Base64 encoded\n const base64 = agentURI.split(\";base64,\")[1];\n jsonStr = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n } else {\n // URL encoded\n jsonStr = decodeURIComponent(agentURI.split(\",\")[1]);\n }\n const meta = JSON.parse(jsonStr);\n name = meta.name || name;\n description = meta.description || \"\";\n } catch {\n // Couldn't parse, use defaults\n }\n }\n\n const agent: Agent = {\n agentId,\n owner: owner as `0x${string}`,\n agentURI: agentURI as string,\n agentWallet: (agentWallet as `0x${string}`) || owner,\n name,\n description,\n skills,\n endpoint,\n priceWei,\n reputation: {\n count,\n summaryValue,\n summaryValueDecimals,\n },\n };\n\n return agent;\n } catch (err) {\n // Agent doesn't exist or error reading\n return null;\n }\n}\n\n/**\n * Check if a wallet already has a registered agent.\n * Tries on-chain event logs first, falls back to the worker API\n * (some registration versions don't emit the expected Registered event).\n */\nexport async function getAgentByOwner(ownerAddress: `0x${string}`): Promise<bigint | null> {\n const client = getPublicClient();\n\n try {\n const balance = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"balanceOf\",\n args: [ownerAddress],\n });\n\n if (balance === 0n) {\n // No on-chain token — try API as last resort (covers pending/approved agents)\n return getAgentByOwnerFromApi(ownerAddress);\n }\n\n // Try on-chain event logs first\n const logs = await client.getLogs({\n address: CONTRACTS.IDENTITY_REGISTRY,\n event: {\n type: \"event\",\n name: \"Registered\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"agentURI\", type: \"string\", indexed: false },\n { name: \"owner\", type: \"address\", indexed: true },\n ],\n },\n args: { owner: ownerAddress },\n fromBlock: 0n,\n toBlock: \"latest\",\n });\n\n if (logs.length > 0) {\n const lastLog = logs[logs.length - 1];\n return lastLog.args.agentId ?? null;\n }\n\n // Event logs empty (v2 registration or different event signature) — fall back to API\n return getAgentByOwnerFromApi(ownerAddress);\n } catch {\n // On-chain lookup failed entirely — try API\n return getAgentByOwnerFromApi(ownerAddress);\n }\n}\n\n/** Fallback: resolve agent ID from the worker API */\nasync function getAgentByOwnerFromApi(ownerAddress: string): Promise<bigint | null> {\n try {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/by-wallet/${ownerAddress}`);\n if (!res.ok) return null;\n const data = await res.json() as { agents?: Array<{ id: string }> };\n if (!data.agents || data.agents.length === 0) return null;\n const idStr = data.agents[0].id;\n return BigInt(idStr.startsWith(\"0x\") ? idStr : idStr);\n } catch {\n return null;\n }\n}\n\n/**\n * Submit feedback for an agent after hiring\n * Links feedback to a completed task via feedbackHash (same keccak256 used in escrow)\n */\nexport async function giveFeedback(\n wallet: Wallet,\n agentId: bigint,\n score: number, // 0-100\n options?: {\n taskId?: string; // Links feedback to a completed task\n agentContractAddress?: string; // Agent's contract address (CA) for tag2\n endpoint?: string;\n }\n): Promise<`0x${string}`> {\n const client = getWalletClient(wallet);\n const publicClient = getPublicClient();\n\n // Compute feedbackHash from taskId (same hash used in escrow contract)\n const feedbackHash: `0x${string}` = options?.taskId\n ? keccak256(toBytes(options.taskId))\n : \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n\n const feedbackURI = options?.taskId\n ? `moltlaunch:task:${options.taskId}`\n : \"\";\n\n const txHash = await client.writeContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"giveFeedback\",\n args: [\n agentId,\n BigInt(score),\n 0, // No decimals for 0-100 score\n \"mandate\", // tag1: platform identifier\n options?.agentContractAddress || \"\", // tag2: agent's contract address\n options?.endpoint || \"\",\n feedbackURI,\n feedbackHash,\n ],\n });\n\n await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n return txHash;\n}\n\n/**\n * Get reputation summary for an agent\n */\nexport async function getReputationSummary(\n agentId: bigint,\n tag1?: string,\n tag2?: string\n): Promise<ReputationSummary> {\n const client = getPublicClient();\n\n const [count, summaryValue, summaryValueDecimals] = await client.readContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"getSummary\",\n args: [agentId, [], tag1 || \"\", tag2 || \"\"],\n });\n\n return {\n count,\n summaryValue,\n summaryValueDecimals,\n };\n}\n\n/**\n * Get all feedback for an agent\n */\nexport async function getAllFeedback(agentId: bigint) {\n const client = getPublicClient();\n\n const result = await client.readContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"readAllFeedback\",\n args: [agentId, [], \"\", \"\", false],\n });\n\n return result;\n}\n","// Flaunch API wrapper for gasless token launches\n// Tokens are launched via Flaunch Web2 API (gasless) with moltlaunch as revenue manager\n\nimport { readFile, stat } from \"node:fs/promises\";\nimport {\n APIS,\n CHAIN,\n REVENUE_MANAGER_ADDRESS,\n POLL_INTERVAL_MS,\n POLL_TIMEOUT_MS,\n MAX_IMAGE_SIZE_BYTES,\n} from \"./constants.js\";\n\n// Types\ninterface FlaunchUploadResponse {\n success: boolean;\n ipfsHash: string;\n tokenURI: string;\n}\n\ninterface FlaunchLaunchResponse {\n success: boolean;\n message: string;\n jobId: string;\n queueStatus: {\n position: number;\n waitingJobs: number;\n activeJobs: number;\n estimatedWaitSeconds: number;\n };\n}\n\ninterface FlaunchStatusResponse {\n success: boolean;\n state: \"waiting\" | \"active\" | \"completed\" | \"failed\";\n queuePosition: number;\n estimatedWaitTime: number;\n transactionHash: string | null;\n error: string | null;\n collectionToken: {\n address: string;\n imageIpfs: string;\n name: string;\n symbol: string;\n tokenURI: string;\n creator: string;\n } | null;\n}\n\nexport interface LaunchResult {\n tokenAddress: string;\n transactionHash: string;\n flaunchUrl: string;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function fetchWithRetry(\n url: string,\n options: RequestInit,\n retries = 3,\n): Promise<Response> {\n for (let attempt = 0; attempt < retries; attempt++) {\n const response = await fetch(url, options);\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 2000 * (attempt + 1);\n await sleep(waitMs);\n continue;\n }\n\n return response;\n }\n\n throw new Error(\"Max retries exceeded (429 rate limit)\");\n}\n\n/**\n * Upload image to IPFS via Flaunch Web2 API.\n */\nexport async function uploadImage(imagePath: string): Promise<string> {\n const fileStat = await stat(imagePath);\n if (fileStat.size > MAX_IMAGE_SIZE_BYTES) {\n throw new Error(`Image exceeds 5MB limit (${(fileStat.size / 1024 / 1024).toFixed(1)}MB)`);\n }\n\n const imageBuffer = await readFile(imagePath);\n const base64 = imageBuffer.toString(\"base64\");\n\n const ext = imagePath.split(\".\").pop()?.toLowerCase();\n const mimeMap: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n };\n const mime = mimeMap[ext ?? \"\"] ?? \"image/png\";\n\n const dataUrl = `data:${mime};base64,${base64}`;\n\n const response = await fetchWithRetry(`${APIS.FLAUNCH}/api/v1/upload-image`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ base64Image: dataUrl }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Image upload failed: ${response.status} - ${text}`);\n }\n\n const data = (await response.json()) as FlaunchUploadResponse;\n return data.ipfsHash;\n}\n\n/**\n * Launch a token via Flaunch Web2 API.\n * This is gasless - Flaunch handles the on-chain transaction server-side.\n * moltlaunch is set as revenue manager to capture 10% of trading fees.\n */\nexport async function launchToken(params: {\n name: string;\n symbol: string;\n description: string;\n imageIpfs: string;\n creatorAddress: string;\n websiteUrl?: string;\n}): Promise<string> {\n const body: Record<string, string | number | undefined> = {\n name: params.name,\n symbol: params.symbol,\n description: params.description,\n imageIpfs: params.imageIpfs,\n creatorAddress: params.creatorAddress,\n revenueManagerAddress: REVENUE_MANAGER_ADDRESS,\n websiteUrl: params.websiteUrl,\n flaunchAt: 0, // immediate launch\n };\n\n // Strip undefined values\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key];\n }\n\n const response = await fetchWithRetry(\n `${APIS.FLAUNCH}/api/v1/${CHAIN.network}/launch-memecoin`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Launch failed: ${response.status} - ${text}`);\n }\n\n const data = (await response.json()) as FlaunchLaunchResponse;\n return data.jobId;\n}\n\n/**\n * Poll launch status until completed or failed.\n */\nexport async function pollLaunchStatus(\n jobId: string,\n onPoll?: (state: string, position: number) => void,\n): Promise<FlaunchStatusResponse> {\n const startTime = Date.now();\n let consecutiveErrors = 0;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n let response: Response;\n try {\n response = await fetch(`${APIS.FLAUNCH}/api/v1/launch-status/${jobId}`);\n } catch {\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new Error(\"Lost connection to Flaunch API during deployment\");\n }\n await sleep(POLL_INTERVAL_MS);\n continue;\n }\n\n if (response.status === 429 || response.status >= 500) {\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new Error(`Status check failed after retries: ${response.status}`);\n }\n await sleep(POLL_INTERVAL_MS * (consecutiveErrors + 1));\n continue;\n }\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Status check failed: ${response.status} - ${text}`);\n }\n\n consecutiveErrors = 0;\n const data = (await response.json()) as FlaunchStatusResponse;\n onPoll?.(data.state, data.queuePosition);\n\n if (data.state === \"completed\") return data;\n if (data.state === \"failed\") {\n throw new Error(data.error ?? \"Launch failed with no error message\");\n }\n\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new Error(\"Launch timed out after 2 minutes\");\n}\n\n/**\n * Full flow: upload image (if provided), launch token, poll until complete.\n * Returns token address and transaction hash.\n */\nexport async function launchFlaunchToken(params: {\n name: string;\n symbol: string;\n description: string;\n imagePath?: string;\n creatorAddress: string;\n websiteUrl?: string;\n onProgress?: (message: string) => void;\n}): Promise<LaunchResult> {\n const { onProgress } = params;\n\n // Step 1: Upload image if provided\n let imageIpfs: string;\n if (params.imagePath) {\n onProgress?.(\"Uploading image to IPFS...\");\n imageIpfs = await uploadImage(params.imagePath);\n onProgress?.(`Image uploaded: ${imageIpfs.slice(0, 16)}...`);\n } else {\n throw new Error(\"Image is required for token launch. Use --image <path>\");\n }\n\n // Step 2: Submit launch\n onProgress?.(\"Submitting token launch...\");\n const jobId = await launchToken({\n name: params.name,\n symbol: params.symbol,\n description: params.description,\n imageIpfs,\n creatorAddress: params.creatorAddress,\n websiteUrl: params.websiteUrl,\n });\n onProgress?.(`Launch queued (job ${jobId})`);\n\n // Step 3: Poll for completion\n onProgress?.(\"Deploying on-chain...\");\n const result = await pollLaunchStatus(jobId, (state, position) => {\n if (position > 0) {\n onProgress?.(`Queue position: ${position}`);\n }\n });\n\n if (!result.collectionToken?.address || !result.transactionHash) {\n throw new Error(\"Launch completed but missing token address or transaction hash\");\n }\n\n const tokenAddress = result.collectionToken.address;\n const flaunchUrl = `${CHAIN.flaunchUrl}/coin/${tokenAddress}`;\n\n return {\n tokenAddress,\n transactionHash: result.transactionHash,\n flaunchUrl,\n };\n}\n","// CLI-side message signing for authenticated API calls\n// Signs EIP-191 personal messages: moltlaunch:<action>:<taskId>:<timestamp>:<nonce>\n\nimport { randomUUID } from \"crypto\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { Wallet } from \"./types.js\";\n\n/** Build the message that must be signed (must match worker/src/auth.ts) */\nexport function buildAuthMessage(action: string, taskId: string, timestamp: number, nonce: string): string {\n return `moltlaunch:${action}:${taskId}:${timestamp}:${nonce}`;\n}\n\n/** Sign an action with the wallet's private key. Includes a random nonce for replay protection. */\nexport async function signAction(\n wallet: Wallet,\n action: string,\n taskId: string,\n): Promise<{ signature: string; timestamp: number; nonce: string }> {\n const timestamp = Math.floor(Date.now() / 1000);\n const nonce = randomUUID();\n const message = buildAuthMessage(action, taskId, timestamp, nonce);\n const account = privateKeyToAccount(wallet.privateKey);\n const signature = await account.signMessage({ message });\n return { signature, timestamp, nonce };\n}\n","// moltlaunch Task Queue API client\n// Quote-based flow: request → quote → accept → submit → complete\n// All mutating actions require wallet signature for authentication\n\nimport { APIS } from \"./constants.js\";\nimport { signAction } from \"./auth.js\";\nimport type { Wallet, TaskFile, TaskMessage } from \"./types.js\";\n\nexport interface Task {\n id: string;\n agentId: string;\n clientAddress: string;\n task: string;\n status: \"requested\" | \"quoted\" | \"accepted\" | \"submitted\" | \"revision\" | \"completed\" | \"declined\" | \"expired\" | \"disputed\" | \"resolved\" | \"cancelled\";\n createdAt: number;\n // Quote phase\n quotedPriceWei?: string;\n quotedAt?: number;\n quotedMessage?: string;\n // Work phase\n acceptedAt?: number;\n submittedAt?: number;\n completedAt?: number;\n result?: string;\n files?: TaskFile[];\n txHash?: string;\n // Messages + revisions\n messages?: TaskMessage[];\n revisionCount?: number;\n // Feedback\n ratedAt?: number;\n ratedTxHash?: string;\n ratedScore?: number;\n ratedComment?: string;\n // Dispute phase\n disputedAt?: number;\n resolvedAt?: number;\n disputeTxHash?: string;\n resolveTxHash?: string;\n disputeResolution?: \"client\" | \"agent\";\n}\n\ninterface TaskResponse {\n task: Task;\n}\n\ninterface TaskListResponse {\n tasks: Task[];\n total: number;\n}\n\ninterface ErrorResponse {\n error: string;\n}\n\nconst API_BASE = APIS.MOLTLAUNCH;\n\n/**\n * Create a new task request (AUTHENTICATED: client wallet signs)\n */\nexport async function createTask(\n wallet: Wallet,\n agentId: string,\n clientAddress: string,\n taskDescription: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"create\", agentId);\n\n const response = await fetch(`${API_BASE}/api/tasks`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n agentId,\n clientAddress,\n task: taskDescription,\n signature,\n timestamp,\n nonce,\n }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Get pending tasks for an agent (inbox)\n */\nexport async function getInbox(agentId: string): Promise<Task[]> {\n const response = await fetch(`${API_BASE}/api/tasks/inbox?agent=${encodeURIComponent(agentId)}`);\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskListResponse;\n return data.tasks;\n}\n\n/**\n * Get tasks created by a client\n */\nexport async function getClientTasks(clientAddress: string): Promise<Task[]> {\n const response = await fetch(\n `${API_BASE}/api/tasks/client?address=${encodeURIComponent(clientAddress)}`,\n );\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskListResponse;\n return data.tasks;\n}\n\n/**\n * Get a specific task by ID\n */\nexport async function getTask(taskId: string): Promise<Task> {\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}`);\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Agent quotes a price for a task (AUTHENTICATED: agent owner)\n */\nexport async function quoteTask(\n wallet: Wallet,\n taskId: string,\n priceWei: string,\n message?: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"quote\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/quote`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ priceWei, message, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Agent declines a task (AUTHENTICATED: agent owner)\n */\nexport async function declineTask(wallet: Wallet, taskId: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"decline\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/decline`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client accepts a quote (AUTHENTICATED: task client)\n */\nexport async function acceptQuote(wallet: Wallet, taskId: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"accept\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/accept`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ clientAddress: wallet.address, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Agent submits work result (AUTHENTICATED: agent owner)\n */\nexport async function submitTask(\n wallet: Wallet,\n taskId: string,\n result: string,\n files?: TaskFile[],\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"submit\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/submit`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ result, files, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Mark task as completed after payment (AUTHENTICATED: task client)\n */\nexport async function completeTask(wallet: Wallet, taskId: string, txHash: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"complete\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/complete`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client requests revision on submitted work (AUTHENTICATED: task client)\n */\nexport async function requestRevision(wallet: Wallet, taskId: string, reason: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"revise\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/revise`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reason, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Send a message on a task (AUTHENTICATED: client or agent owner)\n */\nexport async function sendMessage(wallet: Wallet, taskId: string, content: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"message\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/message`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client refunds a task (AUTHENTICATED: task client)\n */\nexport async function refundTaskRequest(\n wallet: Wallet,\n taskId: string,\n txHash: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"refund\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/refund`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client cancels a task after agent accepted (AUTHENTICATED: task client)\n */\nexport async function cancelTaskRequest(\n wallet: Wallet,\n taskId: string,\n txHash: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"cancel\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/cancel`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client rates an agent after task completion (AUTHENTICATED: task client)\n */\nexport async function rateTask(\n wallet: Wallet,\n taskId: string,\n txHash: string,\n score?: number,\n comment?: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"rate\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/rate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, score, comment, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n// --- Profile API ---\n\nexport interface AgentProfile {\n agentId: string;\n tagline?: string;\n longDescription?: string;\n languages?: string[];\n responseTime?: string;\n website?: string;\n twitter?: string;\n github?: string;\n updatedAt: number;\n}\n\nexport interface Gig {\n id: string;\n agentId: string;\n title: string;\n description: string;\n priceWei: string;\n deliveryTime: string;\n category: string;\n active: boolean;\n createdAt: number;\n updatedAt: number;\n}\n\nexport async function getProfile(agentId: string): Promise<AgentProfile | null> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/profile`);\n if (!response.ok) return null;\n const data = (await response.json()) as { profile: AgentProfile };\n return data.profile;\n}\n\nexport async function updateProfile(\n agentId: string,\n updates: Record<string, string | undefined>,\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<AgentProfile> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/profile`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ ...updates, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { profile: AgentProfile };\n return data.profile;\n}\n\nexport async function listGigs(agentId: string): Promise<Gig[]> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`);\n if (!response.ok) return [];\n const data = (await response.json()) as { gigs: Gig[] };\n return data.gigs;\n}\n\nexport async function createGigRequest(\n agentId: string,\n gig: { title: string; description: string; priceWei: string; deliveryTime: string; category: string },\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<Gig> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"create\", ...gig, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { gig: Gig };\n return data.gig;\n}\n\nexport async function updateGigRequest(\n agentId: string,\n gigId: string,\n updates: Partial<{ title: string; description: string; priceWei: string; deliveryTime: string; category: string }>,\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<Gig> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"update\", gigId, ...updates, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { gig: Gig };\n return data.gig;\n}\n\nexport async function removeGigRequest(\n agentId: string,\n gigId: string,\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<void> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"remove\", gigId, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n}\n","// mltl hire - Request work from an agent\n// Creates a task request - agent will quote a price\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { createTask } from \"../lib/tasks.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface HireOptions {\n agent: string;\n task: string;\n json?: boolean;\n}\n\n// Fetch agent from our worker API (no subgraph needed)\nasync function fetchAgent(agentId: string) {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/${agentId}`);\n if (!res.ok) return null;\n const data = await res.json() as { agent?: { name: string; skills: string[]; reputation: { count: number; summaryValue: number } } };\n return data.agent;\n}\n\nexport async function hire(options: HireOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n const agentId = options.agent;\n\n if (!options.json) {\n console.log(\"\\nPreparing task request...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Get agent details from our worker API\n const agent = await fetchAgent(agentId);\n\n if (!agent) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Agent not found\" }));\n process.exit(1);\n }\n console.error(`\\n❌ Agent #${agentId} not found`);\n process.exit(1);\n }\n\n const name = agent.name || `Agent #${agentId}`;\n const skills = agent.skills || [];\n\n if (!options.json) {\n console.log(`\\nAgent: ${name} (#${agentId})`);\n console.log(`Skills: ${skills.join(\", \") || \"none\"}`);\n if (agent.reputation.count > 0) {\n console.log(`Rating: ${agent.reputation.summaryValue}/100 (${agent.reputation.count} reviews)`);\n }\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask: ${options.task}\\n`);\n console.log(\"Creating task request...\");\n }\n\n // Create task in the queue (authenticated - agent will quote)\n const task = await createTask(wallet, agentId, wallet.address, options.task);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n agentId: agentId,\n status: task.status,\n task: task.task,\n nextActions: [\n { command: `mltl tasks`, description: \"Check task status and quotes\" },\n { command: `mltl view --task ${task.id}`, description: \"View task details\" },\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Add details for the agent\" },\n ],\n flow: \"[requested] → quoted → accepted → submitted → completed\",\n note: \"No funds committed. The agent will quote a price. You decide whether to accept.\",\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Task request created!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Agent: ${name} (#${agentId})`);\n console.log(`Status: ${task.status}`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nNo funds committed yet. The agent will review and quote a price.\");\n console.log(\"You can accept, negotiate, or walk away at no cost.\\n\");\n console.log(\"Next steps:\");\n console.log(` Check for quotes: mltl tasks`);\n console.log(` View details: mltl view --task ${task.id}`);\n console.log(` Add context: mltl message --task ${task.id} --content \"...\"\\n`);\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n process.exit(1);\n }\n\n console.error(`\\n❌ Request failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","// mltl feedback - Submit verified feedback for an agent after completing a task\n// Uses ERC-8004 Reputation Registry with full field utilization:\n// - feedbackHash: keccak256(taskId) — links to escrow record\n// - feedbackURI: \"moltlaunch:task:<taskId>\" — human-readable reference\n// - tag1: \"mandate\" — platform identifier\n// - tag2: agent contract address (CA)\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { giveFeedback, getAgent } from \"../lib/mandate.js\";\nimport { getTask, rateTask } from \"../lib/tasks.js\";\n\ninterface FeedbackOptions {\n agent?: string;\n task?: string;\n score: string;\n comment?: string;\n json?: boolean;\n}\n\nexport async function feedback(options: FeedbackOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n const score = parseInt(options.score, 10);\n\n if (score < 0 || score > 100) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Score must be between 0 and 100\" }));\n process.exit(1);\n }\n console.error(\"Score must be between 0 and 100\");\n process.exit(1);\n }\n\n if (!options.agent && !options.task) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Provide --agent or --task\" }));\n process.exit(1);\n }\n console.error(\"Provide --agent <id> or --task <taskId>\");\n process.exit(1);\n }\n\n let agentIdStr = options.agent || \"\";\n let taskId = options.task;\n\n // If --task provided, resolve agent from task and verify caller is the client\n if (taskId) {\n try {\n const task = await getTask(taskId);\n\n if (task.status !== \"completed\") {\n const msg = `Task ${taskId} is not completed (status: ${task.status})`;\n if (options.json) {\n console.log(JSON.stringify({ error: msg }));\n process.exit(1);\n }\n console.error(msg);\n process.exit(1);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n const msg = \"Only the task client can leave feedback\";\n if (options.json) {\n console.log(JSON.stringify({ error: msg }));\n process.exit(1);\n }\n console.error(msg);\n process.exit(1);\n }\n\n agentIdStr = task.agentId;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (options.json) {\n console.log(JSON.stringify({ error: msg }));\n process.exit(1);\n }\n console.error(`Failed to fetch task: ${msg}`);\n process.exit(1);\n }\n }\n\n const agentId = BigInt(agentIdStr.startsWith(\"0x\") ? agentIdStr : agentIdStr);\n\n if (!options.json) {\n console.log(\"\\nSubmitting verified feedback...\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`Agent: #${agentIdStr}`);\n console.log(`Score: ${score}/100`);\n if (taskId) console.log(`Task: ${taskId}`);\n console.log(`Tag1: mandate`);\n console.log(\"──────────────────────────────────────────────\\n\");\n }\n\n try {\n // Resolve agent's contract address for tag2\n const agent = await getAgent(agentId);\n const agentCA = agent?.owner || \"\";\n\n const txHash = await giveFeedback(wallet, agentId, score, {\n taskId,\n agentContractAddress: agentCA,\n });\n\n // Sync rating to worker KV for verified reputation tracking\n if (taskId) {\n try {\n await rateTask(wallet, taskId, txHash, score, options.comment);\n } catch {\n // Non-fatal: onchain feedback succeeded, KV sync is best-effort\n }\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n agentId: agentIdStr,\n score,\n taskId: taskId || null,\n feedbackHash: taskId ? `keccak256(${taskId})` : null,\n txHash,\n })\n );\n return;\n }\n\n console.log(\"Feedback submitted!\\n\");\n console.log(`Transaction: ${txHash}`);\n console.log(`View on Basescan: https://basescan.org/tx/${txHash}`);\n if (taskId) {\n console.log(`Linked to task: ${taskId}`);\n }\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n })\n );\n process.exit(1);\n }\n\n console.error(`\\nFeedback failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","// mltl agents - Browse registered agents\n\nimport { formatEther } from \"viem\";\nimport { searchAgents as searchAgent0Agents } from \"../lib/agent0.js\";\n\ninterface AgentsOptions {\n skill?: string;\n sort: string;\n limit: string;\n json?: boolean;\n}\n\nexport async function agents(options: AgentsOptions): Promise<void> {\n const limit = parseInt(options.limit, 10);\n\n if (!options.json) {\n console.log(\"\\nmoltlaunch Agent Network\");\n console.log(\"══════════════════════════════════════════════════════════════════\\n\");\n console.log(\"Fetching registered agents via Agent0 SDK...\\n\");\n }\n\n try {\n // Use Agent0 SDK to search agents\n const agentsData = await searchAgent0Agents({\n limit: limit * 2, // Fetch more to allow for filtering\n });\n\n if (agentsData.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ agents: [], total: 0 }));\n return;\n }\n console.log(\"No agents registered yet. Be the first!\");\n console.log(\"\\n mltl register --name 'MyAgent' --skills code,research --endpoint https://...\\n\");\n return;\n }\n\n if (!options.json) {\n console.log(`Found ${agentsData.length} registered agents.\\n`);\n }\n\n // Transform to our format\n let filtered = agentsData.map((agent: any) => ({\n agentId: agent.agentId || agent.id,\n name: agent.name || `Agent #${agent.agentId || agent.id}`,\n description: agent.description || \"\",\n skills: agent.skills || [],\n endpoint: agent.endpoint || agent.a2aEndpoint || \"\",\n priceWei: BigInt(agent.price || 0),\n owner: agent.owner || \"\",\n agentWallet: agent.wallet || agent.owner || \"\",\n reputation: agent.reputation ? {\n count: BigInt(agent.reputation.count || 0),\n summaryValue: BigInt(agent.reputation.total || 0),\n } : null,\n flaunchToken: agent.flaunchToken || null,\n }));\n\n // Filter by skill if specified\n if (options.skill) {\n const skill = options.skill.toLowerCase();\n filtered = filtered.filter((a) =>\n a.skills.some((s: string) => s.toLowerCase().includes(skill))\n );\n }\n\n // Sort\n switch (options.sort) {\n case \"price\":\n filtered.sort((a, b) => Number(a.priceWei - b.priceWei));\n break;\n case \"hires\":\n filtered.sort((a, b) =>\n Number((b.reputation?.count || 0n) - (a.reputation?.count || 0n))\n );\n break;\n case \"reputation\":\n default:\n filtered.sort((a, b) => {\n const aScore = a.reputation && a.reputation.count > 0n\n ? Number(a.reputation.summaryValue)\n : 0;\n const bScore = b.reputation && b.reputation.count > 0n\n ? Number(b.reputation.summaryValue)\n : 0;\n return bScore - aScore;\n });\n }\n\n // Limit\n filtered = filtered.slice(0, limit);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n agents: filtered.map((a) => ({\n agentId: a.agentId.toString(),\n name: a.name,\n description: a.description,\n skills: a.skills,\n endpoint: a.endpoint,\n priceWei: a.priceWei.toString(),\n priceEth: formatEther(a.priceWei),\n owner: a.owner,\n agentWallet: a.agentWallet,\n reputation: a.reputation\n ? {\n count: a.reputation.count.toString(),\n avgScore:\n a.reputation.count > 0n\n ? Number(a.reputation.summaryValue).toFixed(1)\n : \"0\",\n }\n : null,\n flaunchToken: a.flaunchToken,\n })),\n total: agentsData.length,\n filtered: filtered.length,\n filter: options.skill || null,\n sort: options.sort,\n })\n );\n return;\n }\n\n if (filtered.length === 0) {\n console.log(\"No agents match your criteria.\");\n if (options.skill) {\n console.log(`Try without --skill filter to see all agents.`);\n }\n return;\n }\n\n // Display table\n console.log(\n `${\"ID\".padEnd(6)} ${\"Name\".padEnd(20)} ${\"Skills\".padEnd(20)} ${\"Price\".padEnd(10)} ${\"Rating\".padEnd(12)}`\n );\n console.log(\"─\".repeat(70));\n\n for (const agent of filtered) {\n const avgScore =\n agent.reputation && agent.reputation.count > 0n\n ? Number(agent.reputation.summaryValue)\n : 0;\n const ratingStr =\n agent.reputation && agent.reputation.count > 0n\n ? `${avgScore}/100 (${agent.reputation.count})`\n : \"No reviews\";\n\n const priceStr = agent.priceWei > 0n ? formatEther(agent.priceWei) : \"Free\";\n\n console.log(\n `${`#${agent.agentId}`.padEnd(6)} ${agent.name.slice(0, 19).padEnd(20)} ${agent.skills.join(\",\").slice(0, 19).padEnd(20)} ${priceStr.padEnd(10)} ${ratingStr}`\n );\n }\n\n console.log(\"─\".repeat(70));\n console.log(\n `\\nShowing ${filtered.length} of ${agentsData.length} agents.`\n );\n console.log(`Use --skill <skill> to filter, --sort <reputation|price|hires> to reorder.`);\n console.log(`\\nTo hire an agent: mltl hire --agent <ID> --task \"...\"`);\n\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n const isRpcError = errorMsg.includes(\"503\") || errorMsg.includes(\"429\") || errorMsg.includes(\"backend\");\n\n if (options.json) {\n console.log(\n JSON.stringify({\n error: errorMsg,\n hint: isRpcError ? \"Set BASE_RPC_URL env var to a reliable RPC (Alchemy, QuickNode)\" : undefined,\n })\n );\n process.exit(1);\n }\n\n if (isRpcError) {\n console.error(`\\n❌ RPC request failed (public Base RPC is overloaded)`);\n console.error(`\\nFor reliable access, set BASE_RPC_URL environment variable:`);\n console.error(` export BASE_RPC_URL=\"https://base-mainnet.g.alchemy.com/v2/YOUR_KEY\"`);\n console.error(`\\nGet a free key at: https://alchemy.com`);\n } else {\n console.error(\n `\\n❌ Failed to fetch agents: ${errorMsg}`\n );\n }\n process.exit(1);\n }\n}\n","// Agent0 SDK wrapper for moltlaunch\n// Uses official ERC-8004 SDK: https://github.com/agent0lab/agent0-ts\n\nimport { SDK } from \"agent0-sdk\";\nimport { BASE_RPC_URL } from \"./constants.js\";\nimport type { Wallet } from \"./types.js\";\n\nconst BASE_CHAIN_ID = 8453;\n\n/**\n * Get read-only SDK instance (no private key needed)\n */\nexport function getReadOnlySDK() {\n return new SDK({\n chainId: BASE_CHAIN_ID,\n rpcUrl: BASE_RPC_URL,\n });\n}\n\n/**\n * Get SDK instance with signing capability\n */\nexport function getSDK(wallet: Wallet) {\n return new SDK({\n chainId: BASE_CHAIN_ID,\n rpcUrl: BASE_RPC_URL,\n privateKey: wallet.privateKey,\n });\n}\n\n/**\n * Search for agents on Base\n */\nexport async function searchAgents(options?: {\n name?: string;\n active?: boolean;\n x402support?: boolean;\n limit?: number;\n}) {\n const sdk = getReadOnlySDK();\n\n const results = await sdk.searchAgents({\n name: options?.name,\n active: options?.active,\n x402support: options?.x402support,\n });\n\n // Limit results\n const limit = options?.limit || 20;\n return results.slice(0, limit);\n}\n\n/**\n * Get a single agent by ID\n */\nexport async function getAgentById(agentId: string) {\n const sdk = getReadOnlySDK();\n\n // Format: chainId:agentId or just agentId (defaults to current chain)\n const fullId = agentId.includes(\":\") ? agentId : `${BASE_CHAIN_ID}:${agentId}`;\n\n return sdk.getAgent(fullId);\n}\n\n/**\n * Register a new agent\n */\nexport async function registerAgent(\n wallet: Wallet,\n config: {\n name: string;\n description: string;\n image?: string;\n endpoint?: string; // x402 endpoint\n skills?: string[];\n active?: boolean;\n metadata?: Record<string, string>; // Custom metadata (flaunchToken, priceWei, etc.)\n }\n) {\n const sdk = getSDK(wallet);\n\n // Create agent\n const agent = sdk.createAgent(\n config.name,\n config.description,\n config.image || \"\"\n );\n\n // Configure x402 support if endpoint provided\n if (config.endpoint) {\n // Set as A2A endpoint (x402 compatible)\n await agent.setA2A(config.endpoint);\n agent.setTrust(true, false, false); // reputation-based trust\n }\n\n // Build metadata object\n const metadata: Record<string, string> = {};\n\n // Add skills to metadata\n if (config.skills && config.skills.length > 0) {\n metadata.skills = config.skills.join(\",\");\n }\n\n // Add custom metadata (flaunchToken, priceWei, symbol, etc.)\n if (config.metadata) {\n Object.assign(metadata, config.metadata);\n }\n\n // Set all metadata at once\n if (Object.keys(metadata).length > 0) {\n agent.setMetadata(metadata);\n }\n\n agent.setActive(config.active ?? true);\n\n // Register using IPFS (Agent0 SDK handles IPFS upload)\n // Note: This uses the default IPFS node, configure with pinata for production\n const txHandle = await agent.registerIPFS();\n\n // Wait for transaction to be mined\n const { receipt } = await txHandle.waitMined({ confirmations: 1 });\n\n // After registration, agent has ID and URI\n const agentId = agent.agentId;\n const agentURI = agent.agentURI;\n\n if (!agentId) {\n throw new Error(\"Registration failed: no agent ID returned\");\n }\n\n return {\n agentId,\n agentURI: agentURI || \"\",\n txHash: txHandle.hash,\n };\n}\n\n/**\n * Give feedback to an agent\n */\nexport async function giveFeedback(\n wallet: Wallet,\n agentId: string,\n score: number,\n tag?: string\n): Promise<string> {\n const sdk = getSDK(wallet);\n\n const fullId = agentId.includes(\":\") ? agentId : `${BASE_CHAIN_ID}:${agentId}`;\n\n // Give feedback (score 0-100)\n const txHandle = await sdk.giveFeedback(fullId, score, tag || \"mandate\");\n\n // Wait for transaction to be mined\n await txHandle.waitMined({ confirmations: 1 });\n\n return txHandle.hash;\n}\n","// mltl wallet - Show wallet info and balance\n\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\n\ninterface WalletOptions {\n json?: boolean;\n}\n\nexport async function wallet(options: WalletOptions): Promise<void> {\n const { wallet, isNew } = await loadOrCreateWallet();\n const balance = await getWalletBalance(wallet.address);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n address: wallet.address,\n balance,\n isNew,\n },\n null,\n 2\n )\n );\n return;\n }\n\n if (isNew) {\n console.log(\"\\n✨ Created new wallet\\n\");\n }\n\n console.log(\"moltlaunch Wallet\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`Address: ${wallet.address}`);\n console.log(`Balance: ${balance} ETH`);\n console.log(\"──────────────────────────────────────────────\");\n\n if (parseFloat(balance) === 0) {\n console.log(\"\\nFund your wallet with ETH on Base to register or hire agents.\");\n console.log(`Send ETH to: ${wallet.address}`);\n }\n}\n","// mltl earnings - View your earnings from being hired\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { getAgentByOwner, getReputationSummary } from \"../lib/mandate.js\";\nimport { CHAIN } from \"../lib/constants.js\";\n\ninterface EarningsOptions {\n json?: boolean;\n}\n\nexport async function earnings(options: EarningsOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nmoltlaunch Earnings\");\n console.log(\"══════════════════════════════════════════════════════════════════\\n\");\n }\n\n try {\n const balance = await getWalletBalance(wallet.address);\n const agentId = await getAgentByOwner(wallet.address);\n\n if (options.json) {\n const result: Record<string, unknown> = {\n wallet: wallet.address,\n balance,\n agent: null as Record<string, unknown> | null,\n };\n\n if (agentId && agentId > 0n) {\n const rep = await getReputationSummary(agentId);\n result.agent = {\n agentId: agentId.toString(),\n reputation: {\n count: Number(rep.count),\n summaryValue: Number(rep.summaryValue),\n },\n };\n }\n\n console.log(JSON.stringify(result));\n return;\n }\n\n console.log(`Wallet: ${wallet.address}`);\n console.log(`Balance: ${balance} ETH`);\n console.log(\"\");\n\n if (!agentId || agentId <= 0n) {\n console.log(\"No registered agent found for this wallet.\");\n console.log(\"Register one with: mltl register --name <name> --description <desc> --skills <skills> --image <path>\");\n return;\n }\n\n console.log(`Agent ID: ${agentId.toString()}`);\n console.log(`Explorer: ${CHAIN.explorer}/token/${agentId.toString()}`);\n console.log(\"\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"Reputation (ERC-8004):\");\n console.log(\"──────────────────────────────────────────────\");\n\n const rep = await getReputationSummary(agentId);\n const feedbackCount = Number(rep.count);\n const avgScore = feedbackCount > 0 ? Number(rep.summaryValue) / feedbackCount : 0;\n\n console.log(` Feedback received: ${feedbackCount}`);\n console.log(` Average score: ${avgScore > 0 ? avgScore.toFixed(1) + \"/100\" : \"N/A\"}`);\n console.log(\"\");\n console.log(\"Earnings are distributed via buyback-and-burn on your Flaunch token.\");\n console.log(\"Each completed task burns tokens, increasing token value for holders.\");\n\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n })\n );\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to fetch earnings: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","// mltl fees - Check and claim Flaunch trading fees\n\nimport { formatEther } from \"viem\";\nimport { createPublicClient, createWalletClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getAgentByOwner } from \"../lib/mandate.js\";\nimport { BASE_RPC_URL, REVENUE_MANAGER_ADDRESS } from \"../lib/constants.js\";\n\n// Flaunch RevenueManager ABI (subset for fee claiming)\nconst REVENUE_MANAGER_ABI = [\n {\n name: \"balances\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"_recipient\", type: \"address\" }],\n outputs: [{ name: \"balance_\", type: \"uint256\" }],\n },\n {\n name: \"claim\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [{ name: \"amount_\", type: \"uint256\" }],\n },\n] as const;\n\ninterface FeesOptions {\n claim?: boolean;\n json?: boolean;\n}\n\nexport async function fees(options: FeesOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n const publicClient = createPublicClient({ chain: base, transport: http(BASE_RPC_URL) });\n\n if (!options.json) {\n console.log(\"\\nFlaunch Trading Fees\");\n console.log(\"══════════════════════════════════════════════════════════════════\\n\");\n }\n\n try {\n // Agent lookup is best-effort (for display only) — RevenueManager is keyed by wallet address\n let agentId: bigint | null = null;\n try {\n agentId = await getAgentByOwner(wallet.address);\n } catch {\n // Non-fatal: fee claiming doesn't require agent ID\n }\n\n // Check pending fee balance\n const balance = await publicClient.readContract({\n address: REVENUE_MANAGER_ADDRESS,\n abi: REVENUE_MANAGER_ABI,\n functionName: \"balances\",\n args: [wallet.address],\n });\n\n const balanceEth = formatEther(balance);\n\n if (!options.claim) {\n // View-only mode\n if (options.json) {\n console.log(JSON.stringify({\n wallet: wallet.address,\n ...(agentId ? { agentId: agentId.toString() } : {}),\n revenueManager: REVENUE_MANAGER_ADDRESS,\n pendingFees: { wei: balance.toString(), eth: balanceEth },\n }));\n return;\n }\n\n console.log(`Wallet: ${wallet.address}`);\n if (agentId) console.log(`Agent ID: ${agentId.toString()}`);\n console.log(`Revenue Manager: ${REVENUE_MANAGER_ADDRESS}`);\n console.log(\"\");\n console.log(`Pending fees: ${balanceEth} ETH`);\n console.log(\"\");\n\n if (balance === 0n) {\n console.log(\"No fees to claim yet. Fees accumulate from token trading activity.\");\n } else {\n console.log(\"Run with --claim to withdraw fees to your wallet.\");\n }\n return;\n }\n\n // Claim mode\n if (balance === 0n) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"No fees to claim\" }));\n process.exit(1);\n }\n console.log(\"No fees to claim yet.\");\n return;\n }\n\n if (!options.json) {\n console.log(`Claiming ${balanceEth} ETH in trading fees...`);\n }\n\n const account = privateKeyToAccount(wallet.privateKey);\n const walletClient = createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n\n const txHash = await walletClient.writeContract({\n address: REVENUE_MANAGER_ADDRESS,\n abi: REVENUE_MANAGER_ABI,\n functionName: \"claim\",\n args: [],\n });\n\n await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n if (options.json) {\n console.log(JSON.stringify({\n success: true,\n claimed: { wei: balance.toString(), eth: balanceEth },\n txHash,\n }));\n return;\n }\n\n console.log(\"\\n✅ Fees claimed!\");\n console.log(\"──────────────────────────────────────────────────────────\");\n console.log(`Amount: ${balanceEth} ETH`);\n console.log(`TX: ${txHash}`);\n console.log(\"\");\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl inbox - View pending work requests for your agent\n\nimport { formatEther } from \"viem\";\nimport { getInbox, Task } from \"../lib/tasks.js\";\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface AgentEntry {\n id: string;\n owner: string;\n name?: string;\n}\n\ninterface InboxOptions {\n agent?: string;\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts);\n return date.toLocaleString();\n}\n\nfunction taskCounts(task: Task): string {\n const msgCount = task.messages?.length || 0;\n const fileCount = task.files?.length || 0;\n const parts: string[] = [];\n if (msgCount > 0) parts.push(`${msgCount} msg`);\n if (fileCount > 0) parts.push(`${fileCount} file`);\n return parts.length > 0 ? ` [${parts.join(\", \")}]` : \"\";\n}\n\nasync function resolveAgentId(options: InboxOptions): Promise<string> {\n if (options.agent) return options.agent;\n\n // Auto-detect: look up which agent this wallet owns\n const wallet = await loadWallet();\n if (!wallet) {\n throw new Error(\"No wallet found. Register first with: mltl register\");\n }\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents`);\n if (!res.ok) throw new Error(\"Failed to fetch agents\");\n const data = (await res.json()) as { agents: AgentEntry[] };\n const match = data.agents.find(\n (a) => a.owner.toLowerCase() === wallet.address.toLowerCase(),\n );\n if (!match) {\n throw new Error(\n `No agent found for wallet ${wallet.address}. Register first with: mltl register`,\n );\n }\n return match.id;\n}\n\ninterface StatusGroup {\n key: Task[\"status\"];\n label: string;\n emoji: string;\n hint: string;\n}\n\nconst STATUS_GROUPS: StatusGroup[] = [\n { key: \"revision\", label: \"REVISION REQUESTED\", emoji: \"🔄\", hint: \"Rework needed — fix and resubmit:\\n mltl submit --task <task-id> --result \\\"...\\\"\" },\n { key: \"requested\", label: \"NEW REQUESTS\", emoji: \"📥\", hint: \"To quote a price:\\n mltl quote --task <task-id> --price 0.01\\nTo decline:\\n mltl decline --task <task-id>\" },\n { key: \"quoted\", label: \"AWAITING CLIENT\", emoji: \"⏳\", hint: \"Waiting for client to accept your quote.\\nSend a message:\\n mltl message --task <task-id> --content \\\"...\\\"\" },\n { key: \"accepted\", label: \"IN PROGRESS\", emoji: \"🔨\", hint: \"To submit completed work:\\n mltl submit --task <task-id> --result \\\"...\\\"\" },\n { key: \"submitted\", label: \"SUBMITTED\", emoji: \"📤\", hint: \"Waiting for client approval.\\nSend a message:\\n mltl message --task <task-id> --content \\\"...\\\"\" },\n { key: \"disputed\", label: \"DISPUTED\", emoji: \"⚠️\", hint: \"Task is disputed. Await admin resolution.\" },\n];\n\nfunction renderTask(task: Task): void {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : null;\n console.log(`Task ID: ${task.id}${taskCounts(task)}`);\n console.log(`Client: ${task.clientAddress}`);\n if (priceEth) console.log(`Price: ${priceEth} ETH`);\n console.log(`Created: ${formatTimestamp(task.createdAt)}`);\n console.log(`\\nTask:\\n${task.task}\\n`);\n console.log(\"───────────────────────────────────────────────\\n\");\n}\n\nexport async function inbox(options: InboxOptions): Promise<void> {\n const agentId = await resolveAgentId(options);\n\n if (!options.json) {\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(` Inbox for Agent #${agentId}`);\n console.log(\"═══════════════════════════════════════════════\\n\");\n }\n\n try {\n const tasks = await getInbox(agentId);\n\n if (tasks.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({\n tasks: [],\n total: 0,\n polling: { recommended: \"5m\", note: \"No active tasks. Check less frequently.\" },\n meta: {\n skillFile: \"https://moltlaunch.com/skill.md\",\n hint: \"Re-read the skill file periodically — guardrails and features are updated frequently.\",\n },\n }));\n return;\n }\n console.log(\"No pending tasks.\\n\");\n console.log(\"When someone requests work from your agent, tasks will appear here.\");\n console.log(\"Run this command periodically to check for new work.\\n\");\n return;\n }\n\n // Determine polling urgency from task states\n const hasRevision = tasks.some(t => t.status === \"revision\");\n const hasRequested = tasks.some(t => t.status === \"requested\");\n const hasSubmitted = tasks.some(t => t.status === \"submitted\");\n\n let pollingInterval = \"5m\";\n let pollingNote = \"Normal activity.\";\n if (hasRevision) {\n pollingInterval = \"1m\";\n pollingNote = \"Revision requested — client is waiting for your rework.\";\n } else if (hasRequested) {\n pollingInterval = \"2m\";\n pollingNote = \"New requests — quote promptly to win the work.\";\n } else if (hasSubmitted) {\n pollingInterval = \"5m\";\n pollingNote = \"Waiting on client review. Check back periodically.\";\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n tasks,\n total: tasks.length,\n polling: { recommended: pollingInterval, note: pollingNote },\n flow: \"requested → quoted → accepted → submitted → completed\",\n meta: {\n skillFile: \"https://moltlaunch.com/skill.md\",\n hint: \"Re-read the skill file periodically — guardrails and features are updated frequently.\",\n },\n }));\n return;\n }\n\n for (const group of STATUS_GROUPS) {\n const grouped = tasks.filter((t) => t.status === group.key);\n if (grouped.length === 0) continue;\n\n console.log(`${group.emoji} ${group.label} (${grouped.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of grouped) {\n renderTask(task);\n }\n\n console.log(group.hint + \"\\n\");\n }\n\n console.log(`View full thread: mltl view --task <task-id>\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to fetch inbox: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl accept - Accept an agent's quote (client action)\n// Deposits funds into escrow, then marks task as accepted\n\nimport { formatEther, parseEther } from \"viem\";\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { acceptQuote, getTask } from \"../lib/tasks.js\";\nimport { depositEscrow } from \"../lib/escrow.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface AcceptOptions {\n task: string;\n json?: boolean;\n}\n\n// Fetch agent from our worker API (no subgraph needed)\nasync function fetchAgent(agentId: string) {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/${agentId}`);\n if (!res.ok) return null;\n const data = await res.json() as { agent?: { name: string; owner: string; flaunchToken?: string } };\n return data.agent;\n}\n\nexport async function accept(options: AcceptOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nAccepting quote...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // First, get the task details\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"quoted\") {\n throw new Error(`Task is ${taskBefore.status}, cannot accept (must be quoted)`);\n }\n\n // Verify caller is the client\n if (taskBefore.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can accept the quote\");\n }\n\n const priceEth = taskBefore.quotedPriceWei\n ? formatEther(BigInt(taskBefore.quotedPriceWei))\n : \"0\";\n\n // Get agent details for escrow from our API\n const agent = await fetchAgent(taskBefore.agentId);\n if (!agent) {\n throw new Error(`Agent #${taskBefore.agentId} not found`);\n }\n const agentOwner = agent.owner;\n if (!agentOwner) {\n throw new Error(\"Agent has no owner address\");\n }\n\n // V3: Get agent's Flaunch token for buyback-and-burn\n const agentToken = agent.flaunchToken;\n if (!agentToken) {\n throw new Error(\"Agent has no Flaunch token linked. Cannot deposit to escrow without token for buyback.\");\n }\n\n const priceWei = BigInt(taskBefore.quotedPriceWei || \"0\");\n\n // Check balance\n const balance = await getWalletBalance(wallet.address);\n const balanceWei = parseEther(balance);\n if (balanceWei < priceWei) {\n throw new Error(`Insufficient balance. Need ${priceEth} ETH, have ${balance} ETH`);\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${taskBefore.id}`);\n console.log(`Agent: #${taskBefore.agentId} (${agent.name || \"Unknown\"})`);\n console.log(`Owner: ${agentOwner}`);\n console.log(`Quote: ${priceEth} ETH`);\n console.log(`Balance: ${balance} ETH`);\n if (taskBefore.quotedMessage) {\n console.log(`Message: ${taskBefore.quotedMessage}`);\n }\n console.log(`\\nTask:\\n${taskBefore.task}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nThis will deposit ${priceEth} ETH into escrow.`);\n console.log(\"Funds are locked until you approve the work or request a refund.\");\n console.log(\" - Approve submitted work: funds buy back & burn agent's token\");\n console.log(\" - Cancel before submission: 10% fee to agent, 90% refunded\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nDepositing funds into escrow...\");\n }\n\n // Deposit into escrow contract (V3: includes token for buyback-and-burn)\n const escrowTxHash = await depositEscrow(wallet, taskBefore.id, agentOwner, agentToken, priceWei);\n\n if (!options.json) {\n console.log(`Escrow TX: ${escrowTxHash}`);\n console.log(\"Marking task as accepted...\");\n }\n\n // Accept the quote in the task queue (signed with wallet)\n const task = await acceptQuote(wallet, options.task);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n quotedPriceWei: task.quotedPriceWei,\n },\n escrow: {\n txHash: escrowTxHash,\n amount: priceEth,\n tokenAddress: agentToken,\n },\n nextActions: [\n { command: `mltl tasks`, description: \"Check task status\" },\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Message the agent\" },\n { command: `mltl cancel --task ${task.id}`, description: \"Cancel (10% fee to agent)\" },\n ],\n flow: \"requested → quoted → [accepted] → submitted → completed\",\n note: \"Funds are locked in escrow. Agent can now begin work.\",\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Quote accepted! Funds locked in escrow.\");\n console.log(`\\nEscrow: ${priceEth} ETH deposited`);\n console.log(`Token: ${agentToken}`);\n console.log(`TX: ${escrowTxHash}`);\n console.log(\"\\nThe agent can now begin work. When they submit:\");\n console.log(\" - Review & approve: mltl approve --task \" + task.id);\n console.log(\" - Request changes: mltl revise --task \" + task.id + \" --reason \\\"...\\\"\");\n console.log(\" - Cancel (10% fee): mltl cancel --task \" + task.id);\n console.log(`\\nFlow: requested → quoted → [accepted] → submitted → completed\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to accept quote: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// Escrow contract interactions (V5 with UUPS proxy, cancel fees, dispute mechanism)\n\nimport {\n createPublicClient,\n createWalletClient,\n http,\n keccak256,\n toBytes,\n parseAbi,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { BASE_RPC_URL } from \"./constants.js\";\nimport type { Wallet } from \"./types.js\";\n\nexport enum EscrowStatus {\n Active = 0,\n Accepted = 1,\n Submitted = 2,\n Disputed = 3,\n Resolved = 4,\n Released = 5,\n Refunded = 6,\n Cancelled = 7,\n}\n\nconst ESCROW_ADDRESS = (process.env.ESCROW_ADDRESS ||\n \"0x5Df1ffa02c8515a0Fed7d0e5d6375FcD2c1950Ee\") as `0x${string}`;\n\nconst ESCROW_ABI = parseAbi([\n // Write functions\n \"function deposit(bytes32 taskId, address agent, address token) external payable\",\n \"function markAccepted(bytes32 taskId) external\",\n \"function markSubmitted(bytes32 taskId) external\",\n \"function release(bytes32 taskId) external\",\n \"function refund(bytes32 taskId) external\",\n \"function cancel(bytes32 taskId) external\",\n \"function releaseAfterTimeout(bytes32 taskId) external\",\n \"function dispute(bytes32 taskId) external payable\",\n \"function resolveDispute(bytes32 taskId, bool clientWins) external\",\n \"function setDisputeFeeBps(uint256 bps) external\",\n \"function setCancelFeeBps(uint256 bps) external\",\n // View functions\n \"function isPending(bytes32 taskId) external view returns (bool)\",\n \"function isTimedOut(bytes32 taskId) external view returns (bool)\",\n \"function isDisputed(bytes32 taskId) external view returns (bool)\",\n \"function timeUntilTimeout(bytes32 taskId) external view returns (uint256)\",\n \"function getEscrow(bytes32 taskId) external view returns (address client, address agent, address token, uint256 amount, uint256 depositedAt, uint256 submittedAt, uint256 disputeFee, uint8 status)\",\n \"function getDisputeFee(bytes32 taskId) external view returns (uint256)\",\n \"function getCancelFee(bytes32 taskId) external view returns (uint256)\",\n \"function getStatus(bytes32 taskId) external view returns (uint8)\",\n \"function disputeFeeBps() external view returns (uint256)\",\n \"function cancelFeeBps() external view returns (uint256)\",\n \"function TIMEOUT() external view returns (uint256)\",\n // Events\n \"event Deposited(bytes32 indexed taskId, address indexed client, address indexed token, uint256 amount)\",\n \"event Accepted(bytes32 indexed taskId, address indexed agent)\",\n \"event Submitted(bytes32 indexed taskId, address indexed agent, uint256 deadline)\",\n \"event Disputed(bytes32 indexed taskId, address indexed client, uint256 disputeFee)\",\n \"event DisputeResolved(bytes32 indexed taskId, bool clientWins)\",\n \"event BuybackBurned(bytes32 indexed taskId, address indexed token, uint256 ethAmount)\",\n \"event Refunded(bytes32 indexed taskId, address indexed client, uint256 amount)\",\n \"event Cancelled(bytes32 indexed taskId, address indexed client, uint256 cancelFee)\",\n \"event FallbackToAgent(bytes32 indexed taskId, address indexed agent, uint256 amount)\",\n]);\n\n/**\n * Convert task ID string to bytes32 for contract\n */\nexport function taskIdToBytes32(taskId: string): `0x${string}` {\n return keccak256(toBytes(taskId));\n}\n\nfunction getPublicClient() {\n return createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\nfunction getWalletClient(wallet: Wallet) {\n const account = privateKeyToAccount(wallet.privateKey);\n return createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\n/**\n * Deposit funds into escrow when client accepts a quote\n * V3: Now includes token address for buyback-and-burn\n */\nexport async function depositEscrow(\n wallet: Wallet,\n taskId: string,\n agentAddress: string,\n tokenAddress: string,\n amountWei: bigint\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"deposit\",\n args: [taskIdBytes, agentAddress as `0x${string}`, tokenAddress as `0x${string}`],\n value: amountWei,\n });\n\n return hash;\n}\n\n/**\n * Agent marks work as submitted (starts 24h timeout countdown)\n */\nexport async function markSubmitted(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"markSubmitted\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Release funds from escrow to agent when client approves work\n */\nexport async function releaseEscrow(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"release\",\n args: [taskIdBytes],\n gas: 1_000_000n, // Buyback swap needs ~750K gas\n });\n\n return hash;\n}\n\n/**\n * Refund funds from escrow back to client (only before submission)\n */\nexport async function refundEscrow(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"refund\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Release funds after timeout (anyone can call, agent protection)\n */\nexport async function releaseAfterTimeout(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"releaseAfterTimeout\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Agent marks task as accepted on-chain (Active → Accepted)\n */\nexport async function markAccepted(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"markAccepted\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Client cancels after agent accepted (10% fee to agent, 90% back to client)\n */\nexport async function cancelEscrow(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"cancel\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Get the cancel fee for a task (10% of escrow by default)\n */\nexport async function getCancelFee(taskId: string): Promise<bigint> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const fee = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getCancelFee\",\n args: [taskIdBytes],\n });\n\n return fee as bigint;\n}\n\n/**\n * Check if escrow exists and is pending for a task\n */\nexport async function isEscrowPending(taskId: string): Promise<boolean> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const pending = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"isPending\",\n args: [taskIdBytes],\n });\n\n return pending as boolean;\n}\n\n/**\n * Check if timeout has been reached\n */\nexport async function isEscrowTimedOut(taskId: string): Promise<boolean> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const timedOut = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"isTimedOut\",\n args: [taskIdBytes],\n });\n\n return timedOut as boolean;\n}\n\n/**\n * Get seconds until timeout (0 if already timed out or not submitted)\n */\nexport async function getTimeUntilTimeout(taskId: string): Promise<bigint> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const time = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"timeUntilTimeout\",\n args: [taskIdBytes],\n });\n\n return time as bigint;\n}\n\n/**\n * Get escrow details for a task\n * V5: Includes disputeFee and expanded status enum\n */\nexport async function getEscrowDetails(taskId: string): Promise<{\n client: string;\n agent: string;\n token: string;\n amount: bigint;\n depositedAt: bigint;\n submittedAt: bigint;\n disputeFee: bigint;\n status: EscrowStatus;\n} | null> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const result = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getEscrow\",\n args: [taskIdBytes],\n });\n\n const [client, agent, token, amount, depositedAt, submittedAt, disputeFee, status] = result as [\n string,\n string,\n string,\n bigint,\n bigint,\n bigint,\n bigint,\n number\n ];\n\n if (amount === BigInt(0)) return null;\n\n return { client, agent, token, amount, depositedAt, submittedAt, disputeFee, status: status as EscrowStatus };\n}\n\n/**\n * Client disputes submitted work (must pay fee)\n */\nexport async function disputeEscrow(\n wallet: Wallet,\n taskId: string,\n feeWei: bigint\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"dispute\",\n args: [taskIdBytes],\n value: feeWei,\n });\n\n return hash;\n}\n\n/**\n * Get the required dispute fee for a task\n */\nexport async function getDisputeFee(taskId: string): Promise<bigint> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const fee = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getDisputeFee\",\n args: [taskIdBytes],\n });\n\n return fee as bigint;\n}\n\n/**\n * Check if escrow is in disputed state\n */\nexport async function isEscrowDisputed(taskId: string): Promise<boolean> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const disputed = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"isDisputed\",\n args: [taskIdBytes],\n });\n\n return disputed as boolean;\n}\n\n/**\n * Get current escrow status\n */\nexport async function getEscrowStatus(taskId: string): Promise<EscrowStatus> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const status = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getStatus\",\n args: [taskIdBytes],\n });\n\n return (status as number) as EscrowStatus;\n}\n\n/**\n * Admin resolves a disputed escrow\n */\nexport async function resolveEscrowDispute(\n wallet: Wallet,\n taskId: string,\n clientWins: boolean,\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"resolveDispute\",\n args: [taskIdBytes, clientWins],\n });\n\n await publicClient.waitForTransactionReceipt({ hash });\n return hash;\n}\n\nexport { ESCROW_ADDRESS };\n","// mltl decline - Decline a task request (agent action)\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { declineTask, getTask } from \"../lib/tasks.js\";\n\ninterface DeclineOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function decline(options: DeclineOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nDeclining task...\");\n }\n\n try {\n // First verify task exists\n const taskBefore = await getTask(options.task);\n\n if (![\"requested\", \"quoted\"].includes(taskBefore.status)) {\n throw new Error(`Task is ${taskBefore.status}, cannot decline`);\n }\n\n // Decline the task (signed with wallet)\n const task = await declineTask(wallet, options.task);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n status: task.status,\n },\n nextActions: [\n { command: `mltl inbox`, description: \"Check for other tasks\" },\n ],\n note: \"Declined tasks are tracked in your stats. This is normal — only accept work you can deliver.\",\n }),\n );\n return;\n }\n\n console.log(`\\n✅ Task ${task.id} declined.`);\n console.log(\"\\nThe client will be notified.\");\n console.log(\"Tip: Declining tasks you can't deliver is better than accepting and underdelivering.\\n\");\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to decline task: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl submit - Submit completed work for a task (agent action)\n// Also marks submission onchain to start 24h timeout countdown\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { submitTask, getTask } from \"../lib/tasks.js\";\nimport { markSubmitted, markAccepted, isEscrowPending, getEscrowStatus, EscrowStatus } from \"../lib/escrow.js\";\nimport { uploadFiles } from \"../lib/files.js\";\nimport type { TaskFile } from \"../lib/types.js\";\n\ninterface SubmitOptions {\n task: string;\n result: string;\n files?: string;\n json?: boolean;\n}\n\nexport async function submit(options: SubmitOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nSubmitting work...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n let isRevision = false;\n\n try {\n // First verify task exists and is in accepted state\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"accepted\" && taskBefore.status !== \"revision\") {\n throw new Error(`Task is ${taskBefore.status}, cannot submit (must be accepted or in revision)`);\n }\n\n isRevision = taskBefore.status === \"revision\";\n\n // Upload files if provided\n let uploadedFiles: TaskFile[] | undefined;\n if (options.files) {\n const filePaths = options.files.split(\",\").map((f) => f.trim());\n if (!options.json) {\n console.log(`\\nUploading ${filePaths.length} file(s)...`);\n }\n uploadedFiles = await uploadFiles(wallet, options.task, filePaths);\n if (!options.json) {\n for (const f of uploadedFiles) {\n console.log(` Uploaded: ${f.name} (${f.size} bytes)`);\n }\n }\n }\n\n // Submit the work to task queue (signed with wallet)\n const task = await submitTask(wallet, options.task, options.result, uploadedFiles);\n\n // Check if escrow exists for this task (skip on revision — already marked on first submit)\n const hasEscrow = !isRevision && await isEscrowPending(options.task);\n let escrowTxHash: string | null = null;\n\n if (hasEscrow) {\n // Auto-accept on-chain if still Active (V5 requires Accepted before Submitted)\n const onChainStatus = await getEscrowStatus(options.task);\n if (onChainStatus === EscrowStatus.Active) {\n if (!options.json) {\n console.log(\"\\nMarking accepted onchain...\");\n }\n await markAccepted(wallet, options.task);\n }\n\n if (!options.json) {\n console.log(\"\\nMarking submission onchain (starts 24h timeout)...\");\n }\n\n // Mark submitted on escrow contract (starts timeout countdown)\n escrowTxHash = await markSubmitted(wallet, options.task);\n\n if (!options.json) {\n console.log(`Escrow TX: ${escrowTxHash}`);\n }\n }\n\n if (options.json) {\n const nextActions: Array<{ command: string; description: string }> = [\n { command: `mltl view --task ${task.id}`, description: \"View full task thread\" },\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Message the client\" },\n ];\n if (escrowTxHash) {\n nextActions.push({ command: `mltl claim --task ${task.id}`, description: \"Claim payment after 24h timeout\" });\n }\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n quotedPriceWei: task.quotedPriceWei,\n result: task.result,\n },\n escrow: escrowTxHash ? { txHash: escrowTxHash, timeoutHours: 24 } : null,\n nextActions,\n flow: isRevision\n ? \"requested → quoted → accepted → revision → [submitted] → completed\"\n : \"requested → quoted → accepted → [submitted] → completed\",\n note: escrowTxHash\n ? \"24h countdown started. Client must approve, revise, or dispute within 24h — otherwise you can claim payment.\"\n : \"Awaiting client review.\",\n }),\n );\n return;\n }\n\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n\n console.log(isRevision ? \"\\n✅ Revised work submitted!\" : \"\\n✅ Work submitted!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Status: ${task.status}`);\n if (isRevision) {\n console.log(`Revision: #${taskBefore.revisionCount || 1}`);\n }\n console.log(`Price: ${priceEth} ETH`);\n if (escrowTxHash) {\n console.log(`\\nTimeout: 24 hours from now`);\n console.log(` Client must respond or you can auto-claim payment.`);\n }\n console.log(`\\nYour result:\\n${options.result}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nWhat happens next:\");\n console.log(\" - Client approves → payment released (buyback & burn)\");\n console.log(\" - Client revises → you'll see it in your inbox\");\n if (escrowTxHash) {\n console.log(\" - No response 24h → claim with: mltl claim --task \" + task.id);\n }\n console.log(`\\nCheck status: mltl view --task ${task.id}\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to submit work: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// CLI helpers for uploading/downloading task files via Worker proxy\n\nimport { readFileSync, statSync } from \"fs\";\nimport { basename } from \"path\";\nimport { APIS } from \"./constants.js\";\nimport { signAction } from \"./auth.js\";\nimport type { Wallet, TaskFile } from \"./types.js\";\n\nconst API_BASE = APIS.MOLTLAUNCH;\n\n/** Upload a single file to the task's R2 storage */\nexport async function uploadFile(\n wallet: Wallet,\n taskId: string,\n filePath: string,\n): Promise<TaskFile> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"upload\", taskId);\n const filename = basename(filePath);\n const stat = statSync(filePath);\n const body = readFileSync(filePath);\n\n const params = new URLSearchParams({\n signature,\n timestamp: String(timestamp),\n nonce,\n filename,\n });\n\n const response = await fetch(\n `${API_BASE}/api/tasks/${taskId}/upload?${params.toString()}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Length\": String(stat.size),\n },\n body,\n },\n );\n\n if (!response.ok) {\n const error = (await response.json()) as { error: string };\n throw new Error(error.error || `Upload failed: HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { file: TaskFile };\n return data.file;\n}\n\n/** Upload multiple files, return all file metadata */\nexport async function uploadFiles(\n wallet: Wallet,\n taskId: string,\n filePaths: string[],\n): Promise<TaskFile[]> {\n const results: TaskFile[] = [];\n for (const filePath of filePaths) {\n const file = await uploadFile(wallet, taskId, filePath);\n results.push(file);\n }\n return results;\n}\n\n/** Download a file from a task's R2 storage */\nexport async function downloadTaskFile(\n taskId: string,\n fileKey: string,\n): Promise<{ data: ArrayBuffer; contentType: string; filename: string }> {\n const response = await fetch(\n `${API_BASE}/api/tasks/${taskId}/files/${encodeURIComponent(fileKey)}`,\n );\n\n if (!response.ok) {\n const error = (await response.json()) as { error: string };\n throw new Error(error.error || `Download failed: HTTP ${response.status}`);\n }\n\n const disposition = response.headers.get(\"Content-Disposition\") || \"\";\n const filenameMatch = disposition.match(/filename=\"(.+)\"/);\n const filename = filenameMatch ? filenameMatch[1] : \"file\";\n\n return {\n data: await response.arrayBuffer(),\n contentType: response.headers.get(\"Content-Type\") || \"application/octet-stream\",\n filename,\n };\n}\n","// mltl approve - Approve submitted work and release payment from escrow (client action)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask, completeTask } from \"../lib/tasks.js\";\nimport { releaseEscrow, getEscrowDetails, EscrowStatus } from \"../lib/escrow.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface ApproveOptions {\n task: string;\n json?: boolean;\n}\n\n// Fetch agent from our worker API (no subgraph needed)\nasync function fetchAgent(agentId: string) {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/${agentId}`);\n if (!res.ok) return null;\n const data = await res.json() as { agent?: { name: string; owner: string } };\n return data.agent;\n}\n\nexport async function approve(options: ApproveOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nApproving work and preparing payment...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Get task details\n const task = await getTask(options.task);\n\n if (task.status !== \"submitted\") {\n throw new Error(`Task is ${task.status}, cannot approve (must be submitted)`);\n }\n\n // Verify caller is the client\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can approve it\");\n }\n\n // Use the quoted price (set by agent)\n if (!task.quotedPriceWei) {\n throw new Error(\"Task has no quoted price\");\n }\n\n const priceWei = BigInt(task.quotedPriceWei);\n const priceEth = formatEther(priceWei);\n\n // Get agent's wallet address\n const agent = await fetchAgent(task.agentId);\n if (!agent) {\n throw new Error(`Agent #${task.agentId} not found`);\n }\n\n // The agent's owner address receives payment\n const agentOwner = agent.owner;\n if (!agentOwner) {\n throw new Error(\"Agent has no owner address\");\n }\n\n // Verify escrow exists\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task. Was it accepted properly?\");\n }\n if (escrow.status >= EscrowStatus.Released) {\n throw new Error(\"Escrow already released\");\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Agent: ${agent.name || `#${task.agentId}`}`);\n console.log(`Agent Owner: ${agentOwner}`);\n console.log(`Escrow: ${formatEther(escrow.amount)} ETH (locked)`);\n console.log(`\\nSubmitted result:\\n${task.result}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nThis will release payment. This action is final and irreversible.\");\n console.log(\"If unsatisfied, use 'mltl revise' or 'mltl dispute' instead.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nReleasing payment from escrow...\");\n }\n\n // Release funds from escrow to agent\n const txHash = await releaseEscrow(wallet, task.id);\n\n // Mark task as completed (signed with wallet)\n const completedTask = await completeTask(wallet, options.task, txHash);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: completedTask.id,\n agentId: completedTask.agentId,\n status: completedTask.status,\n quotedPriceWei: completedTask.quotedPriceWei,\n txHash: completedTask.txHash,\n },\n payment: {\n to: agentOwner,\n amount: priceEth,\n txHash,\n type: \"escrow_release\",\n },\n nextActions: [\n { command: `mltl feedback --task ${completedTask.id} --score <0-100>`, description: \"Leave a verified review (on-chain)\" },\n ],\n flow: \"requested → quoted → accepted → submitted → [completed]\",\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Work approved! Payment released from escrow.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nPayment: ${priceEth} ETH → ${agentOwner}`);\n console.log(`TX: ${txHash}`);\n console.log(\"\\nLeave a verified review (score 0-100):\");\n console.log(` mltl feedback --task ${completedTask.id} --score 90`);\n console.log(` mltl feedback --task ${completedTask.id} --score 85 --comment \"Great work\"\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to approve: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl tasks - View tasks you've created as a client\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getClientTasks, Task } from \"../lib/tasks.js\";\n\ninterface TasksOptions {\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts);\n return date.toLocaleString();\n}\n\nfunction formatStatus(status: Task[\"status\"]): string {\n const icons: Record<Task[\"status\"], string> = {\n requested: \"📤 Awaiting Quote\",\n quoted: \"💬 Quote Received\",\n accepted: \"🔨 In Progress\",\n submitted: \"📥 Review Needed\",\n revision: \"🔄 Revision Requested\",\n completed: \"✅ Completed\",\n declined: \"❌ Declined\",\n expired: \"⌛ Expired\",\n disputed: \"⚠️ Disputed\",\n resolved: \"✅ Resolved\",\n };\n return icons[status] || status;\n}\n\nexport async function tasks(options: TasksOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(\" Your Task Requests\");\n console.log(\"═══════════════════════════════════════════════\\n\");\n }\n\n try {\n const allTasks = await getClientTasks(wallet.address);\n\n if (allTasks.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({\n tasks: [],\n total: 0,\n nextActions: [\n { command: `mltl agents`, description: \"Browse available agents\" },\n { command: `mltl hire --agent <id> --task \"...\"`, description: \"Request work from an agent\" },\n ],\n }));\n return;\n }\n console.log(\"No tasks yet.\\n\");\n console.log(\"Request work from an agent with:\");\n console.log(\" mltl hire --agent <id> --task \\\"Your task description\\\"\\n\");\n return;\n }\n\n // Determine polling urgency from task states\n const hasSubmittedReview = allTasks.some(t => t.status === \"submitted\");\n const hasQuoted = allTasks.some(t => t.status === \"quoted\");\n let pollingInterval = \"5m\";\n let pollingNote = \"Normal activity.\";\n if (hasSubmittedReview) {\n pollingInterval = \"1m\";\n pollingNote = \"Work submitted — review and approve/revise promptly so agent can get paid.\";\n } else if (hasQuoted) {\n pollingInterval = \"2m\";\n pollingNote = \"Quote received — accept to lock escrow and start work.\";\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n tasks: allTasks,\n total: allTasks.length,\n polling: { recommended: pollingInterval, note: pollingNote },\n flow: \"requested → quoted → accepted → submitted → completed\",\n meta: {\n skillFile: \"https://moltlaunch.com/skill.md\",\n hint: \"Re-read the skill file periodically — guardrails and features are updated frequently.\",\n },\n }));\n return;\n }\n\n // Group by status\n const needsReview = allTasks.filter((t) => t.status === \"submitted\");\n const quoted = allTasks.filter((t) => t.status === \"quoted\");\n const requested = allTasks.filter((t) => t.status === \"requested\");\n const inProgress = allTasks.filter((t) => t.status === \"accepted\");\n const revision = allTasks.filter((t) => t.status === \"revision\");\n const disputed = allTasks.filter((t) => t.status === \"disputed\");\n const resolved = allTasks.filter((t) => t.status === \"resolved\");\n const completed = allTasks.filter((t) => t.status === \"completed\");\n const declined = allTasks.filter((t) => t.status === \"declined\");\n\n // Show tasks needing review first (submitted work)\n if (needsReview.length > 0) {\n console.log(`📥 NEEDS REVIEW (${needsReview.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of needsReview) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Submitted: ${formatTimestamp(task.submittedAt || Date.now())}`);\n console.log(`\\nOriginal task:\\n${task.task}\\n`);\n console.log(`Agent's result:\\n${task.result}\\n`);\n console.log(\"───────────────────────────────────────────────\\n\");\n }\n\n console.log(\"To approve and pay:\");\n console.log(\" mltl approve --task <task-id>\\n\");\n }\n\n // Quotes waiting for acceptance\n if (quoted.length > 0) {\n console.log(`\\n💬 QUOTES RECEIVED (${quoted.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of quoted) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Quote: ${priceEth} ETH`);\n if (task.quotedMessage) {\n console.log(`Message: ${task.quotedMessage}`);\n }\n console.log(`Quoted: ${formatTimestamp(task.quotedAt || Date.now())}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n\n console.log(\"To accept a quote:\");\n console.log(\" mltl accept --task <task-id>\\n\");\n }\n\n // Requests awaiting agent quote\n if (requested.length > 0) {\n console.log(`\\n📤 AWAITING QUOTE (${requested.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of requested) {\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Created: ${formatTimestamp(task.createdAt)}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n }\n\n // Work in progress\n if (inProgress.length > 0) {\n console.log(`\\n🔨 IN PROGRESS (${inProgress.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of inProgress) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Accepted: ${formatTimestamp(task.acceptedAt || task.createdAt)}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n }\n\n // Completed\n if (completed.length > 0) {\n console.log(`\\n✅ COMPLETED (${completed.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of completed.slice(0, 5)) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Paid: ${priceEth} ETH`);\n console.log(`Completed: ${formatTimestamp(task.completedAt || Date.now())}`);\n console.log(`TX: ${task.txHash}\\n`);\n }\n if (completed.length > 5) {\n console.log(` ... and ${completed.length - 5} more\\n`);\n }\n }\n\n // Revision in progress\n if (revision.length > 0) {\n console.log(`\\n🔄 REVISION REQUESTED (${revision.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of revision) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Revisions: ${task.revisionCount || 1}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n }\n\n // Disputed\n if (disputed.length > 0) {\n console.log(`\\n⚠️ DISPUTED (${disputed.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of disputed) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Disputed: ${formatTimestamp(task.disputedAt || Date.now())}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n console.log(\"Awaiting admin resolution.\\n\");\n }\n\n // Resolved\n if (resolved.length > 0) {\n console.log(`\\n✅ RESOLVED (${resolved.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of resolved) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n const winner = task.disputeResolution === \"client\" ? \"Client (refunded)\" : \"Agent (buyback)\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Resolution: ${winner}`);\n console.log(`Resolved: ${formatTimestamp(task.resolvedAt || Date.now())}\\n`);\n }\n }\n\n // Declined\n if (declined.length > 0) {\n console.log(`\\n❌ DECLINED (${declined.length})`);\n for (const task of declined.slice(0, 3)) {\n console.log(` ${task.id}: Agent #${task.agentId} declined`);\n }\n console.log(\"\");\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to fetch tasks: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl quote - Quote a price for a task request\n\nimport { parseEther, formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { quoteTask, getTask } from \"../lib/tasks.js\";\n\ninterface QuoteOptions {\n task: string;\n price: string;\n message?: string;\n json?: boolean;\n}\n\nexport async function quote(options: QuoteOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nQuoting price for task...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Verify task exists and is in requested state\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"requested\" && taskBefore.status !== \"quoted\") {\n throw new Error(`Task is ${taskBefore.status}, cannot quote`);\n }\n\n const priceWei = parseEther(options.price);\n const priceEth = formatEther(priceWei);\n\n if (!options.json) {\n console.log(`\\nTask ID: ${taskBefore.id}`);\n console.log(`Client: ${taskBefore.clientAddress}`);\n console.log(`\\nTask:\\n${taskBefore.task}\\n`);\n console.log(`Your quote: ${priceEth} ETH`);\n if (options.message) {\n console.log(`Message: ${options.message}`);\n }\n console.log(\"──────────────────────────────────────────────\");\n if (taskBefore.status === \"quoted\") {\n console.log(\"\\nNote: Updating your previous quote. Client has not yet accepted.\");\n }\n console.log(\"\\nBy quoting, you commit to delivering this work at this price.\");\n console.log(\"The client can accept at any time, locking funds in escrow.\");\n }\n\n // Submit the quote (signed with wallet)\n const task = await quoteTask(wallet, options.task, priceWei.toString(), options.message);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n quotedPriceWei: task.quotedPriceWei,\n quotedMessage: task.quotedMessage,\n },\n nextActions: [\n { command: `mltl inbox`, description: \"Check inbox for status updates\" },\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Message the client\" },\n ],\n flow: \"requested → [quoted] → accepted → submitted → completed\",\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Quote submitted!\");\n console.log(\"\\nThe client will review your quote.\");\n console.log(\"If they accept, funds lock in escrow and you can begin work.\\n\");\n console.log(\"Next steps:\");\n console.log(` Check inbox: mltl inbox`);\n console.log(` Send a message: mltl message --task ${task.id} --content \"...\"`);\n console.log(`\\nFlow: requested → [quoted] → accepted → submitted → completed\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to quote: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl claim - Claim payment after timeout (agent protection)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask, completeTask } from \"../lib/tasks.js\";\nimport {\n releaseAfterTimeout,\n getEscrowDetails,\n isEscrowTimedOut,\n getTimeUntilTimeout,\n EscrowStatus,\n} from \"../lib/escrow.js\";\n\ninterface ClaimOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function claim(options: ClaimOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nChecking claim eligibility...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Get task details\n const task = await getTask(options.task);\n\n // Get escrow details\n const escrow = await getEscrowDetails(options.task);\n\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n\n if (escrow.status === EscrowStatus.Released || escrow.status === EscrowStatus.Refunded) {\n throw new Error(\"Payment already released or refunded\");\n }\n\n if (escrow.status === EscrowStatus.Disputed) {\n throw new Error(\"Task is disputed. Cannot claim until dispute is resolved.\");\n }\n\n if (escrow.status !== EscrowStatus.Submitted) {\n throw new Error(\"Work not yet submitted. Run 'mltl submit' first.\");\n }\n\n const priceEth = formatEther(escrow.amount);\n\n // Check if timeout reached\n const timedOut = await isEscrowTimedOut(options.task);\n\n if (!timedOut) {\n const secondsLeft = await getTimeUntilTimeout(options.task);\n const hoursLeft = Number(secondsLeft) / 3600;\n\n if (options.json) {\n console.log(\n JSON.stringify({\n error: \"Timeout not reached\",\n timeRemaining: {\n seconds: Number(secondsLeft),\n hours: hoursLeft.toFixed(2),\n },\n }),\n );\n process.exit(1);\n }\n\n console.log(`\\n⏳ Timeout not reached yet.`);\n console.log(`\\nTime remaining: ${hoursLeft.toFixed(1)} hours`);\n console.log(`\\nThe client can still approve the work.`);\n console.log(`If they don't respond, you can claim after the timeout.\\n`);\n return;\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Amount: ${priceEth} ETH`);\n console.log(`Status: Timeout reached - claiming payment...`);\n }\n\n // Release after timeout\n const txHash = await releaseAfterTimeout(wallet, options.task);\n\n // Sync completion to worker KV\n try {\n await completeTask(wallet, options.task, txHash);\n } catch {\n // Non-fatal: onchain release succeeded, KV sync is best-effort\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n },\n payment: {\n amount: priceEth,\n txHash,\n type: \"timeout_release\",\n },\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Payment claimed!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nAmount: ${priceEth} ETH`);\n console.log(`TX: ${txHash}`);\n console.log(`\\nThe client did not respond within 24 hours.`);\n console.log(`Funds have been released to your wallet.\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to claim: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl refund - Refund escrowed funds back to client (only before agent submits work)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask, refundTaskRequest } from \"../lib/tasks.js\";\nimport { refundEscrow, getEscrowDetails, EscrowStatus } from \"../lib/escrow.js\";\n\ninterface RefundOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function refund(options: RefundOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nProcessing refund...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (![\"quoted\", \"accepted\"].includes(task.status)) {\n throw new Error(`Task is ${task.status}, cannot refund (must be quoted or accepted, and before agent submits work)`);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can request a refund\");\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status === EscrowStatus.Accepted) {\n throw new Error(\"Agent has started work. Use 'mltl cancel' instead (10% cancel fee applies)\");\n }\n if (escrow.status !== EscrowStatus.Active) {\n throw new Error(\"Escrow is not in active state (may be submitted, released, or refunded)\");\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrowed: ${formatEther(escrow.amount)} ETH`);\n console.log(\"\\nRefunding to your wallet...\");\n }\n\n const txHash = await refundEscrow(wallet, task.id);\n\n // Sync refund to worker KV\n try {\n await refundTaskRequest(wallet, task.id, txHash);\n } catch {\n // Non-fatal: onchain refund succeeded, KV sync is best-effort\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n refundedAmount: formatEther(escrow.amount),\n txHash,\n nextActions: [\n { command: `mltl hire --agent ${task.agentId} --task \"...\"`, description: \"Hire the same agent again\" },\n { command: `mltl agents`, description: \"Browse other agents\" },\n ],\n note: \"Full refund — no fees deducted. Task is closed.\",\n })\n );\n return;\n }\n\n console.log(\"\\n✅ Refund successful! No fees deducted.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nRefunded: ${formatEther(escrow.amount)} ETH → ${wallet.address}`);\n console.log(`TX: ${txHash}\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to refund: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl cancel - Cancel a task after agent accepted (10% cancel fee)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask } from \"../lib/tasks.js\";\nimport { cancelEscrow, getEscrowDetails, getCancelFee, EscrowStatus } from \"../lib/escrow.js\";\nimport { cancelTaskRequest } from \"../lib/tasks.js\";\n\ninterface CancelOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function cancel(options: CancelOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nProcessing cancellation...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (task.status !== \"accepted\") {\n throw new Error(`Task is ${task.status}, cannot cancel (must be accepted)`);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can cancel\");\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status !== EscrowStatus.Accepted) {\n throw new Error(`Escrow is not in accepted state (status: ${escrow.status})`);\n }\n\n const fee = await getCancelFee(task.id);\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrowed: ${formatEther(escrow.amount)} ETH`);\n console.log(`Cancel fee: ${formatEther(fee)} ETH (10% to agent for lost opportunity)`);\n console.log(`You receive: ${formatEther(escrow.amount - fee)} ETH`);\n console.log(\"\\nNote: If the agent hasn't started yet, consider 'mltl refund' instead (no fee).\");\n console.log(\"Cancel is for tasks already accepted by the agent.\\n\");\n console.log(\"Cancelling...\");\n }\n\n const txHash = await cancelEscrow(wallet, task.id);\n\n // Sync cancellation to worker KV\n try {\n await cancelTaskRequest(wallet, task.id, txHash);\n } catch {\n // Non-fatal: onchain cancel succeeded, KV sync is best-effort\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n cancelFee: formatEther(fee),\n refundedAmount: formatEther(escrow.amount - fee),\n txHash,\n nextActions: [\n { command: `mltl hire --agent ${task.agentId} --task \"...\"`, description: \"Hire the same agent again\" },\n { command: `mltl agents`, description: \"Browse other agents\" },\n ],\n })\n );\n return;\n }\n\n console.log(\"\\nTask cancelled.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nCancel fee: ${formatEther(fee)} ETH → agent`);\n console.log(`Refunded: ${formatEther(escrow.amount - fee)} ETH → ${wallet.address}`);\n console.log(`TX: ${txHash}\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to cancel: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl dispute - Dispute submitted work and freeze timeout (client action)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask } from \"../lib/tasks.js\";\nimport { getEscrowDetails, getDisputeFee, disputeEscrow, EscrowStatus } from \"../lib/escrow.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface DisputeOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function dispute(options: DisputeOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nDisputing submitted work...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (task.status !== \"submitted\") {\n throw new Error(`Task is ${task.status}, cannot dispute (must be submitted)`);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can dispute it\");\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status !== EscrowStatus.Submitted) {\n throw new Error(\"Escrow is not in submitted state\");\n }\n\n const feeWei = await getDisputeFee(task.id);\n const feeEth = formatEther(feeWei);\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrow: ${formatEther(escrow.amount)} ETH`);\n console.log(`Dispute fee: ${feeEth} ETH (10% of escrow, non-refundable if you lose)`);\n console.log(\"\\n⚠ Disputes are a last resort. Consider these alternatives first:\");\n console.log(` Request revision: mltl revise --task ${task.id} --reason \"...\"`);\n console.log(` Message the agent: mltl message --task ${task.id} --content \"...\"`);\n console.log(\"\\n If you win: escrow refunded + dispute fee returned.\");\n console.log(\" If you lose: agent gets paid, you lose the dispute fee.\");\n console.log(\"\\nOpening dispute...\");\n }\n\n const txHash = await disputeEscrow(wallet, task.id, feeWei);\n\n // Sign and notify worker\n const { signature, timestamp, nonce } = await signAction(wallet, \"dispute\", task.id);\n\n await fetch(`${APIS.MOLTLAUNCH}/api/tasks/${task.id}/dispute`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n disputeFee: feeEth,\n txHash,\n note: \"Timeout frozen. Admin will review. If you win: escrow + fee returned. If you lose: agent gets paid, fee lost.\",\n nextActions: [\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Add context for the admin\" },\n { command: `mltl view --task ${task.id}`, description: \"View task details\" },\n ],\n })\n );\n return;\n }\n\n console.log(\"\\nDispute opened! 24h timeout is now frozen.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nFee paid: ${feeEth} ETH`);\n console.log(`TX: ${txHash}`);\n console.log(\"\\nAn admin will review and resolve the dispute.\");\n console.log(\"Add context via messages to help resolution:\");\n console.log(` mltl message --task ${task.id} --content \"...\"\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to dispute: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl resolve - Admin resolves a disputed task\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask } from \"../lib/tasks.js\";\nimport { getEscrowDetails, resolveEscrowDispute, EscrowStatus } from \"../lib/escrow.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface ResolveOptions {\n task: string;\n winner: string;\n json?: boolean;\n}\n\nexport async function resolve(options: ResolveOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (![\"client\", \"agent\"].includes(options.winner)) {\n console.error('❌ --winner must be \"client\" or \"agent\"');\n process.exit(1);\n }\n\n const clientWins = options.winner === \"client\";\n\n if (!options.json) {\n console.log(\"\\nResolving dispute...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (task.status !== \"disputed\") {\n throw new Error(`Task is ${task.status}, cannot resolve (must be disputed)`);\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status !== EscrowStatus.Disputed) {\n throw new Error(\"Escrow is not in disputed state\");\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrow: ${formatEther(escrow.amount)} ETH`);\n console.log(`Dispute fee: ${formatEther(escrow.disputeFee)} ETH`);\n console.log(`Resolution: ${clientWins ? \"CLIENT WINS (refund)\" : \"AGENT WINS (buyback)\"}`);\n console.log(\"\\nCalling resolveDispute on-chain...\");\n }\n\n const txHash = await resolveEscrowDispute(wallet, task.id, clientWins);\n\n // Sign and notify worker\n const { signature, timestamp, nonce } = await signAction(wallet, \"resolve\", task.id);\n\n await fetch(`${APIS.MOLTLAUNCH}/api/tasks/${task.id}/resolve`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n resolution: options.winner,\n txHash,\n signature,\n timestamp,\n nonce,\n }),\n });\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n resolution: options.winner,\n txHash,\n })\n );\n return;\n }\n\n console.log(\"\\nDispute resolved!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nWinner: ${options.winner}`);\n console.log(`TX: ${txHash}`);\n if (clientWins) {\n console.log(\"\\nClient gets escrow + dispute fee refunded.\");\n } else {\n console.log(\"\\nAgent gets dispute fee. Escrow released via buyback-and-burn.\");\n }\n console.log();\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to resolve: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl revise - Request revision on submitted work (client action)\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { requestRevision, getTask } from \"../lib/tasks.js\";\n\ninterface ReviseOptions {\n task: string;\n reason: string;\n json?: boolean;\n}\n\nexport async function revise(options: ReviseOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nRequesting revision...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"submitted\") {\n throw new Error(`Task is ${taskBefore.status}, can only request revision on submitted work`);\n }\n\n const task = await requestRevision(wallet, options.task, options.reason);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n revisionCount: task.revisionCount,\n },\n nextActions: [\n { command: `mltl message --task ${task.id} --content \"...\"`, description: \"Add more context for the agent\" },\n { command: `mltl view --task ${task.id}`, description: \"View task thread\" },\n ],\n flow: \"requested → quoted → accepted → submitted → [revision] → submitted → completed\",\n note: \"Agent will rework and resubmit. No additional cost — same escrow applies.\",\n }),\n );\n return;\n }\n\n console.log(\"\\nRevision requested!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Status: ${task.status}`);\n console.log(`Revisions: ${task.revisionCount || 1}`);\n console.log(`\\nYour feedback:\\n${options.reason}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nThe agent will revise and resubmit. No additional cost.\");\n console.log(\"Add more context:\");\n console.log(` mltl message --task ${task.id} --content \"additional details\"\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to request revision: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl message - Send or read messages on a task\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { sendMessage, getTask } from \"../lib/tasks.js\";\n\ninterface MessageOptions {\n task: string;\n content?: string;\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\nexport async function message(options: MessageOptions): Promise<void> {\n // Read mode: no content provided — display messages\n if (!options.content) {\n try {\n const task = await getTask(options.task);\n\n if (options.json) {\n console.log(JSON.stringify({\n taskId: task.id,\n status: task.status,\n messages: task.messages || [],\n messageCount: task.messages?.length || 0,\n }));\n return;\n }\n\n console.log(`\\nMessages for task ${task.id} (${task.status})\\n`);\n\n if (!task.messages || task.messages.length === 0) {\n console.log(\"No messages yet.\\n\");\n console.log(`Send one: mltl message --task ${task.id} --content \"...\"\\n`);\n return;\n }\n\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const msg of task.messages) {\n const roleTag = msg.role === \"client\" ? \"[CLIENT]\" : \"[AGENT]\";\n console.log(`${roleTag} ${formatTimestamp(msg.timestamp)}`);\n console.log(`${msg.content}\\n`);\n }\n\n console.log(`${task.messages.length} message(s)\\n`);\n return;\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n console.error(`\\nFailed to fetch messages: ${errorMsg}`);\n process.exit(1);\n }\n }\n\n // Send mode\n const { wallet } = await loadOrCreateWallet();\n\n try {\n // Check task status and warn agent if escrow isn't funded\n const taskCheck = await getTask(options.task);\n const isAgent = taskCheck.agentId && wallet.address.toLowerCase() !== taskCheck.clientAddress?.toLowerCase();\n const preFunded = [\"requested\", \"quoted\"].includes(taskCheck.status);\n\n if (isAgent && preFunded && !options.json) {\n console.log(\"\\n⚠️ ESCROW NOT FUNDED — this task is still in '\" + taskCheck.status + \"' status.\");\n console.log(\" The client has not deposited ETH yet. Do not deliver work in messages.\");\n console.log(\" Wait for status 'accepted' before sharing deliverables.\\n\");\n }\n\n if (!options.json) {\n console.log(\"Sending message...\");\n }\n\n const task = await sendMessage(wallet, options.task, options.content);\n\n // Repeat warning in JSON output for agent tooling\n const escrowWarning = isAgent && preFunded\n ? \"Escrow not funded. Do not deliver work in messages — wait for 'accepted' status.\"\n : undefined;\n\n const lastMsg = task.messages?.[task.messages.length - 1];\n\n if (options.json) {\n const jsonOut: Record<string, unknown> = {\n success: true,\n taskId: task.id,\n status: task.status,\n messageCount: task.messages?.length || 0,\n role: lastMsg?.role,\n };\n if (escrowWarning) jsonOut.warning = escrowWarning;\n console.log(JSON.stringify(jsonOut));\n return;\n }\n\n console.log(`\\nMessage sent (as ${lastMsg?.role || \"unknown\"})!`);\n console.log(`Task ${task.id} — ${task.messages?.length || 0} message(s)\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to send message: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl view - View full task details and message thread\n\nimport { formatEther } from \"viem\";\nimport { getTask, Task } from \"../lib/tasks.js\";\nimport { loadWallet } from \"../lib/wallet.js\";\n\ninterface ViewOptions {\n task: string;\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\n// Role-aware action suggestions\nfunction suggestedActions(task: Task, role: \"client\" | \"agent\" | \"unknown\"): string | null {\n const id = task.id;\n switch (task.status) {\n case \"requested\":\n if (role === \"agent\") return `Quote: mltl quote --task ${id} --price <eth>\\nDecline: mltl decline --task ${id}`;\n if (role === \"client\") return `Waiting for agent to quote. You can add context:\\n mltl message --task ${id} --content \"...\"`;\n return `Agent: mltl quote --task ${id} --price <eth>\\nAgent: mltl decline --task ${id}`;\n case \"quoted\":\n if (role === \"client\") return `Accept: mltl accept --task ${id} (deposits ETH into escrow)\\nMessage: mltl message --task ${id} --content \"...\"`;\n if (role === \"agent\") return `Waiting for client to accept your quote.\\nMessage: mltl message --task ${id} --content \"...\"`;\n return `Client: mltl accept --task ${id}\\nEither: mltl message --task ${id} --content \"...\"`;\n case \"accepted\":\n if (role === \"agent\") return `Submit work when ready:\\n mltl submit --task ${id} --result \"...\" --files file1.txt,file2.pdf`;\n if (role === \"client\") return `Agent is working. You can:\\n Message: mltl message --task ${id} --content \"...\"\\n Cancel: mltl cancel --task ${id} (10% fee to agent)`;\n return `Agent: mltl submit --task ${id} --result \"...\"`;\n case \"revision\":\n if (role === \"agent\") return `Revision requested. Fix and resubmit:\\n mltl submit --task ${id} --result \"...\" --files file1.txt`;\n if (role === \"client\") return `Waiting for agent to resubmit.\\nMessage: mltl message --task ${id} --content \"...\"`;\n return `Agent: mltl submit --task ${id} --result \"...\"`;\n case \"submitted\":\n if (role === \"client\") return `Review the result above, then:\\n Approve: mltl approve --task ${id} (releases payment, final)\\n Revise: mltl revise --task ${id} --reason \"...\"\\n Dispute: mltl dispute --task ${id} (10% fee, last resort)`;\n if (role === \"agent\") return `Waiting for client review. 24h timeout protects you.\\n Claim: mltl claim --task ${id} (after 24h with no response)`;\n return `Client: mltl approve --task ${id}\\nClient: mltl revise --task ${id} --reason \"...\"`;\n case \"completed\":\n if (role === \"client\") return `Leave a review:\\n mltl feedback --task ${id} --score <0-100> --comment \"...\"`;\n return null;\n case \"disputed\":\n return `Awaiting admin resolution.\\nAdd context: mltl message --task ${id} --content \"...\"`;\n default:\n return null;\n }\n}\n\nconst STATUS_FLOW: Record<string, string> = {\n requested: \"[requested] → quoted → accepted → submitted → completed\",\n quoted: \"requested → [quoted] → accepted → submitted → completed\",\n accepted: \"requested → quoted → [accepted] → submitted → completed\",\n revision: \"requested → quoted → accepted → [revision] → submitted → completed\",\n submitted: \"requested → quoted → accepted → [submitted] → completed\",\n completed: \"requested → quoted → accepted → submitted → [completed]\",\n declined: \"requested → [declined]\",\n disputed: \"requested → quoted → accepted → submitted → [disputed] → resolved\",\n resolved: \"requested → quoted → accepted → submitted → disputed → [resolved]\",\n};\n\nexport async function view(options: ViewOptions): Promise<void> {\n try {\n const task = await getTask(options.task);\n\n // Detect role from wallet\n let role: \"client\" | \"agent\" | \"unknown\" = \"unknown\";\n try {\n const wallet = await loadWallet();\n if (wallet) {\n const addr = wallet.address.toLowerCase();\n if (task.clientAddress.toLowerCase() === addr) {\n role = \"client\";\n } else {\n role = \"agent\";\n }\n }\n } catch {\n // No wallet loaded, role stays unknown\n }\n\n if (options.json) {\n const flow = STATUS_FLOW[task.status] || null;\n console.log(JSON.stringify({ task, role, flow }));\n return;\n }\n\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : null;\n\n // Header\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(` Task ${task.id}`);\n console.log(\"═══════════════════════════════════════════════\\n\");\n console.log(`Status: ${task.status.toUpperCase()}`);\n console.log(`Client: ${task.clientAddress}`);\n if (priceEth) console.log(`Price: ${priceEth} ETH`);\n console.log(`Created: ${formatTimestamp(task.createdAt)}`);\n if (task.acceptedAt) console.log(`Accepted: ${formatTimestamp(task.acceptedAt)}`);\n if (task.submittedAt) console.log(`Submitted: ${formatTimestamp(task.submittedAt)}`);\n if (task.completedAt) console.log(`Completed: ${formatTimestamp(task.completedAt)}`);\n if (task.revisionCount) console.log(`Revisions: ${task.revisionCount}`);\n\n // Description\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\" Description\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(task.task);\n\n // Quote message\n if (task.quotedMessage) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\" Agent Quote Message\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(task.quotedMessage);\n }\n\n // Result\n if (task.result) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\" Submitted Result\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(task.result);\n }\n\n // Files\n if (task.files && task.files.length > 0) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(` Files (${task.files.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const file of task.files) {\n const sizeKb = (file.size / 1024).toFixed(1);\n console.log(` ${file.name} (${sizeKb} KB)`);\n }\n }\n\n // Messages\n if (task.messages && task.messages.length > 0) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(` Messages (${task.messages.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const msg of task.messages) {\n const roleTag = msg.role === \"client\" ? \"[CLIENT]\" : \"[AGENT]\";\n const time = formatTimestamp(msg.timestamp);\n console.log(`${roleTag} ${time}`);\n console.log(`${msg.content}\\n`);\n }\n }\n\n // Status flow\n const flow = STATUS_FLOW[task.status];\n if (flow) {\n console.log(\"───────────────────────────────────────────────\");\n console.log(\" Flow\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(flow);\n }\n\n // Suggested action (role-aware)\n const action = suggestedActions(task, role);\n if (action) {\n const roleLabel = role === \"client\" ? \" (you are the client)\" : role === \"agent\" ? \" (you are the agent)\" : \"\";\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(` Next Action${roleLabel}`);\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(action);\n }\n\n console.log(\"\");\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to fetch task: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// CLI: mltl profile — Manage agent profile\n\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { updateProfile, getProfile } from \"../lib/tasks.js\";\n\ninterface ProfileOptions {\n agent: string;\n tagline?: string;\n description?: string;\n website?: string;\n twitter?: string;\n github?: string;\n image?: string;\n responseTime?: string;\n json?: boolean;\n}\n\nexport async function profile(options: ProfileOptions): Promise<void> {\n const { agent: agentId } = options;\n\n // If no update flags, just show current profile\n const hasUpdates = options.tagline || options.description || options.website ||\n options.twitter || options.github || options.image || options.responseTime;\n\n if (!hasUpdates) {\n const current = await getProfile(agentId);\n if (options.json) {\n console.log(JSON.stringify(current, null, 2));\n } else {\n console.log(`\\n Profile for agent ${agentId}\\n`);\n console.log(` Tagline: ${current?.tagline || '(not set)'}`);\n console.log(` Description: ${current?.longDescription ? current.longDescription.slice(0, 80) + '...' : '(not set)'}`);\n console.log(` Website: ${current?.website || '(not set)'}`);\n console.log(` Twitter: ${current?.twitter || '(not set)'}`);\n console.log(` GitHub: ${current?.github || '(not set)'}`);\n console.log(` Image: ${current?.image || '(not set)'}`);\n console.log(` Response Time: ${current?.responseTime || '(not set)'}`);\n console.log();\n }\n return;\n }\n\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"profile\", agentId);\n\n const updates: Record<string, string | undefined> = {};\n if (options.tagline) updates.tagline = options.tagline;\n if (options.description) updates.longDescription = options.description;\n if (options.website) updates.website = options.website;\n if (options.twitter) updates.twitter = options.twitter;\n if (options.github) updates.github = options.github;\n if (options.image) updates.image = options.image;\n if (options.responseTime) updates.responseTime = options.responseTime;\n\n const result = await updateProfile(agentId, updates, signature, timestamp, nonce);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\\n Profile updated for agent ${agentId}`);\n if (result.tagline) console.log(` Tagline: ${result.tagline}`);\n console.log();\n }\n}\n","// mltl reviews - View verified reviews for an agent\n\nimport { APIS } from \"../lib/constants.js\";\n\ninterface ReviewsOptions {\n agent: string;\n json?: boolean;\n}\n\ninterface Review {\n taskId: string;\n score: number | null;\n comment: string | null;\n reviewer: string;\n ratedAt: number;\n ratedTxHash: string;\n}\n\ninterface ReviewsResponse {\n reviews: Review[];\n total: number;\n avgScore: number | null;\n reviewCount: number;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\nexport async function reviews(options: ReviewsOptions): Promise<void> {\n try {\n const res = await fetch(`${APIS.MOLTLAUNCH}/api/agents/${encodeURIComponent(options.agent)}/reviews`);\n if (!res.ok) {\n const err = (await res.json()) as { error: string };\n throw new Error(err.error || `HTTP ${res.status}`);\n }\n\n const data = (await res.json()) as ReviewsResponse;\n\n if (options.json) {\n console.log(JSON.stringify(data));\n return;\n }\n\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(` Reviews for Agent #${options.agent}`);\n console.log(\"═══════════════════════════════════════════════\\n\");\n\n if (data.avgScore !== null) {\n console.log(`Score: ${data.avgScore}/100 (${data.reviewCount} verified review${data.reviewCount !== 1 ? \"s\" : \"\"})\\n`);\n }\n\n if (data.reviews.length === 0) {\n console.log(\"No reviews yet.\\n\");\n return;\n }\n\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const review of data.reviews) {\n const scoreStr = review.score !== null ? `${review.score}/100` : \"No score\";\n console.log(`${scoreStr} ${formatTimestamp(review.ratedAt)}`);\n console.log(`Task: ${review.taskId}`);\n console.log(`Reviewer: ${review.reviewer}`);\n if (review.comment) console.log(`Comment: ${review.comment}`);\n console.log(`TX: ${review.ratedTxHash}\\n`);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to fetch reviews: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// CLI: mltl gig — Manage agent gig offerings\n\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport {\n createGigRequest,\n updateGigRequest,\n listGigs,\n removeGigRequest,\n} from \"../lib/tasks.js\";\nimport { parseEther } from \"viem\";\n\ninterface GigCreateOptions {\n agent: string;\n title: string;\n description: string;\n price: string;\n delivery: string;\n category?: string;\n json?: boolean;\n}\n\ninterface GigListOptions {\n agent: string;\n json?: boolean;\n}\n\ninterface GigRemoveOptions {\n agent: string;\n gig: string;\n json?: boolean;\n}\n\nexport async function gigCreate(options: GigCreateOptions): Promise<void> {\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"gig\", options.agent);\n\n const priceWei = parseEther(options.price).toString();\n const category = options.category || \"general\";\n\n const gig = await createGigRequest(\n options.agent,\n {\n title: options.title,\n description: options.description,\n priceWei,\n deliveryTime: options.delivery,\n category,\n },\n signature,\n timestamp,\n nonce,\n );\n\n if (options.json) {\n console.log(JSON.stringify(gig, null, 2));\n } else {\n console.log(`\\n Gig created: ${gig.title}`);\n console.log(` ID: ${gig.id}`);\n console.log(` Price: ${options.price} ETH`);\n console.log(` Delivery: ${gig.deliveryTime}`);\n console.log();\n }\n}\n\nexport async function gigList(options: GigListOptions): Promise<void> {\n const gigs = await listGigs(options.agent);\n\n if (options.json) {\n console.log(JSON.stringify(gigs, null, 2));\n return;\n }\n\n if (gigs.length === 0) {\n console.log(`\\n No gigs found for agent ${options.agent}\\n`);\n return;\n }\n\n console.log(`\\n Gigs for agent ${options.agent}:\\n`);\n for (const gig of gigs) {\n const eth = (Number(gig.priceWei) / 1e18).toFixed(4);\n console.log(` ${gig.title}`);\n console.log(` ID: ${gig.id} | ${eth} ETH | ${gig.deliveryTime} | ${gig.category}`);\n console.log();\n }\n}\n\ninterface GigUpdateOptions {\n agent: string;\n gig: string;\n title?: string;\n description?: string;\n price?: string;\n delivery?: string;\n category?: string;\n json?: boolean;\n}\n\nexport async function gigUpdate(options: GigUpdateOptions): Promise<void> {\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"gig\", options.agent);\n\n const updates: Record<string, string> = {};\n if (options.title) updates.title = options.title;\n if (options.description) updates.description = options.description;\n if (options.price) updates.priceWei = parseEther(options.price).toString();\n if (options.delivery) updates.deliveryTime = options.delivery;\n if (options.category) updates.category = options.category;\n\n if (Object.keys(updates).length === 0) {\n console.error(\"\\n Nothing to update. Use --title, --description, --price, --delivery, or --category.\\n\");\n process.exit(1);\n }\n\n const gig = await updateGigRequest(options.agent, options.gig, updates, signature, timestamp, nonce);\n\n if (options.json) {\n console.log(JSON.stringify(gig, null, 2));\n } else {\n const eth = (Number(gig.priceWei) / 1e18).toFixed(4);\n console.log(`\\n Gig updated: ${gig.title}`);\n console.log(` ID: ${gig.id}`);\n console.log(` Price: ${eth} ETH`);\n console.log(` Delivery: ${gig.deliveryTime}`);\n console.log(` Category: ${gig.category}`);\n console.log();\n }\n}\n\nexport async function gigRemove(options: GigRemoveOptions): Promise<void> {\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"gig\", options.agent);\n\n await removeGigRequest(options.agent, options.gig, signature, timestamp, nonce);\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, gigId: options.gig }));\n } else {\n console.log(`\\n Gig ${options.gig} removed.\\n`);\n }\n}\n"],"mappings":"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","names":["wallet","createPublicClient","createWalletClient","http","base","privateKeyToAccount","createPublicClient","base","http","wallet","privateKeyToAccount","createWalletClient","readFile","resolve","readFile","privateKeyToAccount","wallet","message","wallet","wallet","message","wallet","wallet","formatEther","formatEther","wallet","wallet","rep","formatEther","createPublicClient","createWalletClient","http","base","privateKeyToAccount","wallet","createPublicClient","base","http","formatEther","privateKeyToAccount","createWalletClient","formatEther","wallet","formatEther","tasks","formatEther","parseEther","createPublicClient","createWalletClient","http","keccak256","toBytes","privateKeyToAccount","base","keccak256","toBytes","getPublicClient","createPublicClient","base","http","getWalletClient","wallet","privateKeyToAccount","createWalletClient","getPublicClient","wallet","getWalletClient","fetchAgent","wallet","formatEther","parseEther","wallet","formatEther","API_BASE","wallet","stat","wallet","formatEther","formatEther","fetchAgent","wallet","formatEther","formatEther","formatTimestamp","wallet","formatEther","formatTimestamp","parseEther","formatEther","wallet","parseEther","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","wallet","formatTimestamp","wallet","formatEther","formatTimestamp","wallet","flow","formatEther","wallet","formatTimestamp","parseEther","wallet"]}
|