agentlili 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +533 -0
- package/dist/chunk-AAYS2L5P.js +946 -0
- package/dist/chunk-AAYS2L5P.js.map +1 -0
- package/dist/cli.js +803 -0
- package/dist/cli.js.map +1 -0
- package/dist/mcp-server.js +1468 -0
- package/dist/mcp-server.js.map +1 -0
- package/package.json +111 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/lib/kora/config.ts","../src/lib/config.ts","../src/lib/agent.ts","../src/lib/system-prompt.ts","../src/cli/setup.ts"],"sourcesContent":["import \"dotenv/config\";\nimport readline from \"node:readline\";\nimport { generateText, stepCountIs, type ModelMessage } from \"ai\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createGroq } from \"@ai-sdk/groq\";\nimport { loadConfig } from \"../lib/config\";\nimport { WalletManager } from \"../lib/wallet-manager\";\nimport { createAgent } from \"../lib/agent\";\nimport { SYSTEM_PROMPT } from \"../lib/system-prompt\";\nimport { runSetup } from \"./setup\";\n\n// ANSI color helpers\nconst c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n cyan: \"\\x1b[36m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n gray: \"\\x1b[90m\",\n white: \"\\x1b[37m\",\n bgGreen: \"\\x1b[42m\",\n};\n\nconst VERSION = \"0.1.0\";\n\nfunction banner(text: string) {\n console.log(`\\n${c.bgGreen}${c.bold} ${text} ${c.reset}\\n`);\n}\n\nfunction info(label: string, value: string) {\n console.log(` ${c.gray}${label}${c.reset} ${c.white}${value}${c.reset}`);\n}\n\nfunction spinnerFrames() {\n return [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n}\n\nfunction startSpinner(text: string) {\n const frames = spinnerFrames();\n let i = 0;\n const id = setInterval(() => {\n process.stdout.write(\n `\\r ${c.green}${frames[i % frames.length]}${c.reset} ${c.dim}${text}${c.reset}`,\n );\n i++;\n }, 80);\n return () => {\n clearInterval(id);\n process.stdout.write(\"\\r\" + \" \".repeat(text.length + 10) + \"\\r\");\n };\n}\n\nfunction printHelp() {\n console.log(`\n${c.bold}AgentLili${c.reset} — Agentic DeFi Wallet for Solana ${c.dim}v${VERSION}${c.reset}\n\n${c.bold}Usage:${c.reset}\n agentlili Start interactive agent chat\n agentlili init Set up database, env vars, and wallet\n agentlili --help Show this help message\n agentlili --version Show version\n\n${c.bold}Environment:${c.reset}\n Run ${c.cyan}agentlili init${c.reset} to configure everything interactively, or set\n these in your .env file:\n\n ${c.white}DATABASE_URL${c.reset} PostgreSQL connection string\n ${c.white}WALLET_ENCRYPTION_KEY${c.reset} 64-char hex key (generated during init)\n ${c.white}ANTHROPIC_API_KEY${c.reset} Anthropic API key (or OPENAI_API_KEY / GROQ_API_KEY)\n ${c.white}LLM_PROVIDER${c.reset} anthropic | openai | groq\n ${c.white}SOLANA_RPC_URL${c.reset} RPC endpoint (default: http://localhost:8899)\n`);\n}\n\nasync function startChat() {\n banner(\"AgentLili — Solana DeFi Agent\");\n\n const config = loadConfig();\n const rpcUrl = process.env.SOLANA_RPC_URL ?? \"http://localhost:8899\";\n const walletManager = new WalletManager(\n config.walletEncryptionKey,\n rpcUrl,\n );\n\n // Get or create a wallet\n let wallets = await walletManager.listWallets();\n if (wallets.length === 0) {\n console.log(` ${c.yellow}No wallet found. Creating one...${c.reset}`);\n await walletManager.createWallet(\"AgentLili Wallet\");\n wallets = await walletManager.listWallets();\n }\n\n const walletId = config.defaultWalletId || wallets[0].id;\n const wallet = await walletManager.getKeypairWallet(walletId);\n const publicKey = wallet.publicKey.toBase58();\n\n info(\"Wallet:\", publicKey);\n info(\"Network:\", \"Solana Devnet\");\n info(\"LLM:\", `${config.llmProvider} / ${config.llmModel}`);\n console.log(\n `\\n ${c.dim}Type your message and press Enter. Type \"exit\" to quit.${c.reset}\\n`,\n );\n\n const { tools } = createAgent(wallet, config, rpcUrl);\n\n const model =\n config.llmProvider === \"anthropic\"\n ? createAnthropic({ apiKey: config.llmApiKey })(config.llmModel)\n : config.llmProvider === \"groq\"\n ? createGroq({ apiKey: config.llmApiKey })(config.llmModel)\n : createOpenAI({ apiKey: config.llmApiKey })(config.llmModel);\n\n const systemPrompt = `${SYSTEM_PROMPT}\\n\\n## Current Wallet\\nPublic Key: ${publicKey}\\nNetwork: Solana Localnet\\nRPC: ${rpcUrl}`;\n\n const messages: ModelMessage[] = [];\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n function prompt() {\n rl.question(`${c.green}${c.bold}You: ${c.reset}`, async (input) => {\n const trimmed = input.trim();\n if (!trimmed) {\n prompt();\n return;\n }\n if (trimmed.toLowerCase() === \"exit\") {\n console.log(`\\n ${c.dim}Goodbye!${c.reset}\\n`);\n rl.close();\n process.exit(0);\n }\n\n messages.push({ role: \"user\", content: trimmed });\n\n const stopSpinner = startSpinner(\"Thinking...\");\n\n try {\n const result = await generateText({\n model,\n system: systemPrompt,\n messages,\n tools,\n stopWhen: stepCountIs(10),\n });\n\n stopSpinner();\n\n // Print tool calls\n for (const step of result.steps) {\n for (const tc of step.toolCalls) {\n const argsStr = JSON.stringify(tc.input).slice(0, 100);\n console.log(\n ` ${c.cyan}[tool]${c.reset} ${c.bold}${tc.toolName}${c.reset}${c.gray}(${argsStr})${c.reset}`,\n );\n }\n for (const tr of step.toolResults) {\n const raw = (tr as Record<string, unknown>).result;\n const resultStr =\n typeof raw === \"string\" ? raw : JSON.stringify(raw);\n const display =\n resultStr.length > 200\n ? resultStr.slice(0, 200) + \"...\"\n : resultStr;\n console.log(\n ` ${c.green}[result]${c.reset} ${c.dim}${display}${c.reset}`,\n );\n }\n }\n\n // Print final response\n if (result.text) {\n console.log(\n `\\n${c.green}${c.bold}Agent:${c.reset} ${result.text}\\n`,\n );\n }\n\n messages.push({ role: \"assistant\", content: result.text });\n } catch (error) {\n stopSpinner();\n console.error(\n `\\n ${c.red}Error: ${error instanceof Error ? error.message : \"Unknown error\"}${c.reset}\\n`,\n );\n }\n\n prompt();\n });\n }\n\n prompt();\n}\n\n// ── Entry point ──\n\nasync function main() {\n const args = process.argv.slice(2);\n const cmd = args[0]?.toLowerCase();\n\n if (cmd === \"--help\" || cmd === \"-h\") {\n printHelp();\n return;\n }\n\n if (cmd === \"--version\" || cmd === \"-v\") {\n console.log(`agentlili v${VERSION}`);\n return;\n }\n\n if (cmd === \"init\" || cmd === \"setup\") {\n await runSetup();\n return;\n }\n\n if (cmd && ![\"chat\", \"start\"].includes(cmd)) {\n console.error(`${c.red}Unknown command: ${cmd}${c.reset}`);\n console.error(`Run ${c.cyan}agentlili --help${c.reset} for usage.`);\n process.exit(1);\n }\n\n await startChat();\n}\n\nmain().catch((err) => {\n console.error(`${c.red}Fatal: ${err.message}${c.reset}`);\n process.exit(1);\n});\n","import type { KoraConfig, KoraFeeMode } from \"./types\";\n\nexport function loadKoraConfig(): KoraConfig | null {\n const endpoint = process.env.KORA_ENDPOINT;\n if (!endpoint) return null;\n\n const feeModeStr = process.env.KORA_FEE_MODE ?? \"sponsored\";\n const feeToken = process.env.KORA_FEE_TOKEN;\n\n let feeMode: KoraFeeMode;\n if (feeModeStr === \"token\") {\n if (!feeToken) {\n throw new Error(\n \"KORA_FEE_TOKEN is required when KORA_FEE_MODE=token\",\n );\n }\n feeMode = { type: \"token\", mint: feeToken };\n } else {\n feeMode = { type: \"sponsored\" };\n }\n\n return {\n endpoint,\n apiKey: process.env.KORA_API_KEY || undefined,\n hmacSecret: process.env.KORA_HMAC_SECRET || undefined,\n feeMode,\n feeToken,\n };\n}\n\nexport function isKoraEnabled(): boolean {\n return !!process.env.KORA_ENDPOINT;\n}\n","import type { KoraConfig } from \"./kora/types\";\nimport { loadKoraConfig } from \"./kora/config\";\n\nexport interface AppConfig {\n llmProvider: \"anthropic\" | \"openai\" | \"groq\";\n llmModel: string;\n llmApiKey: string;\n walletEncryptionKey: string;\n defaultWalletId?: string;\n kora?: KoraConfig | null;\n}\n\nexport function loadConfig(): AppConfig {\n const llmProvider = (process.env.LLM_PROVIDER as \"anthropic\" | \"openai\" | \"groq\") ?? \"anthropic\";\n\n const llmApiKey =\n llmProvider === \"anthropic\"\n ? process.env.ANTHROPIC_API_KEY\n : llmProvider === \"groq\"\n ? process.env.GROQ_API_KEY\n : process.env.OPENAI_API_KEY;\n\n const envVarName =\n llmProvider === \"anthropic\" ? \"ANTHROPIC_API_KEY\"\n : llmProvider === \"groq\" ? \"GROQ_API_KEY\"\n : \"OPENAI_API_KEY\";\n\n if (!llmApiKey) {\n throw new Error(\n `Missing API key: set ${envVarName} in .env`,\n );\n }\n\n const walletEncryptionKey = process.env.WALLET_ENCRYPTION_KEY;\n if (!walletEncryptionKey) {\n throw new Error(\n \"Missing WALLET_ENCRYPTION_KEY in .env — generate one with: node -e \\\"console.log(require('crypto').randomBytes(32).toString('hex'))\\\"\",\n );\n }\n\n const kora = loadKoraConfig();\n\n const defaultModel =\n llmProvider === \"anthropic\" ? \"claude-sonnet-4-20250514\"\n : llmProvider === \"groq\" ? \"llama-3.3-70b-versatile\"\n : \"gpt-4o\";\n\n return {\n llmProvider,\n llmModel: process.env.LLM_MODEL ?? defaultModel,\n llmApiKey,\n walletEncryptionKey,\n defaultWalletId: process.env.DEFAULT_WALLET_ID,\n kora,\n };\n}\n","import { SolanaAgentKit, type KeypairWallet } from \"solana-agent-kit\";\nimport TokenPlugin from \"@solana-agent-kit/plugin-token\";\nimport DefiPlugin from \"@solana-agent-kit/plugin-defi\";\nimport { createVercelAITools } from \"solana-agent-kit\";\nimport type { ToolSet } from \"ai\";\nimport type { AppConfig } from \"./config\";\n\n/**\n * ~20 core actions that cover the most common DeFi operations.\n * Keeps tool-definition payload under Groq's token limit (~4K vs ~15K for all 93).\n */\nexport const CORE_ACTION_NAMES = new Set([\n \"GET_TOKEN_DATA\",\n \"GET_TOKEN_DATA_OR_INFO_BY_TICKER_OR_SYMBOL\",\n \"FETCH_PRICE\",\n \"STAKE_WITH_JUPITER\",\n \"TRADE\",\n \"CREATE_LIMIT_ORDER\",\n \"CANCEL_LIMIT_ORDERS\",\n \"GET_OPEN_LIMIT_ORDERS\",\n \"GET_LIMIT_ORDER_HISTORY\",\n \"BALANCE_ACTION\",\n \"TOKEN_BALANCE_ACTION\",\n \"GET_TPS\",\n \"CLOSE_EMPTY_TOKEN_ACCOUNTS\",\n \"REQUEST_FUNDS\",\n \"TRANSFER\",\n \"PYTH_FETCH_PRICE\",\n \"RUGCHECK\",\n \"WALLET_ADDRESS\",\n \"LEND_ASSET\",\n \"LULO_LEND\",\n \"LULO_WITHDRAW\",\n]);\n\nexport function createAgent(\n wallet: KeypairWallet,\n config: AppConfig,\n rpcUrl?: string,\n): {\n agent: SolanaAgentKit;\n tools: ToolSet;\n} {\n const agentConfig: Record<string, string | number | boolean> = {};\n\n if (config.llmProvider === \"openai\") {\n agentConfig.OPENAI_API_KEY = config.llmApiKey;\n }\n\n // Pass Kora endpoint to agent config when enabled\n if (config.kora) {\n agentConfig.KORA_ENDPOINT = config.kora.endpoint;\n if (config.kora.apiKey) agentConfig.KORA_API_KEY = config.kora.apiKey;\n if (config.kora.feeToken) agentConfig.KORA_FEE_TOKEN = config.kora.feeToken;\n }\n\n const agent = new SolanaAgentKit(wallet, rpcUrl ?? \"http://localhost:8899\", agentConfig)\n .use(TokenPlugin)\n .use(DefiPlugin);\n\n const toolMode = process.env.CHAT_TOOL_MODE ?? \"core\";\n const actions =\n toolMode === \"all\"\n ? agent.actions\n : agent.actions.filter((a: { name: string }) => CORE_ACTION_NAMES.has(a.name));\n\n const tools = createVercelAITools(agent, actions) as unknown as ToolSet;\n\n return { agent, tools };\n}\n","import { getPersonaPromptFlavor } from \"./personas\";\n\n/** Build full system prompt with optional persona flavor. */\nexport function buildSystemPrompt(walletId?: string): string {\n const personaFlavor = walletId ? getPersonaPromptFlavor(walletId) : \"\";\n return `${SYSTEM_PROMPT}${personaFlavor}`;\n}\n\nexport const SYSTEM_PROMPT = `You are an autonomous AI agent wallet operating on Solana devnet. You can create wallets, manage SOL and SPL tokens, execute DeFi operations, and interact with protocols — all programmatically.\n\n## Core Capabilities\n- **Wallet Management:** Create wallets, check balances, request devnet airdrops, transfer SOL and SPL tokens\n- **Trading:** Swap tokens via Jupiter aggregator, create/cancel limit orders\n- **DeFi:** Provide liquidity on Orca/Raydium/Meteora, lend/borrow on Lulo, stake SOL\n- **Market Data:** Fetch token prices, check TPS, get token data\n- **Advanced:** Perpetual trading on Drift/Adrena, cross-chain bridges, LST operations\n\n## Decision-Making Protocol\n\nWhen handling any request, follow this structured approach:\n\n1. **Assess Preconditions:** Check wallet balance, verify sufficient funds for gas (~0.005 SOL per transaction), confirm token availability\n2. **Plan the Operation:** Break complex requests into ordered steps. Identify dependencies between steps (e.g., must airdrop before swap)\n3. **Execute Step-by-Step:** Run each tool call, verify the result before proceeding to the next step\n4. **Handle Failures:** If a step fails, diagnose the cause, attempt recovery (e.g., retry with adjusted parameters, request airdrop if insufficient funds), and report clearly\n5. **Report Results:** Summarize what was accomplished, provide transaction signatures with Explorer links, show final balances\n\n### Example Reasoning Chain\n\\`\\`\\`\nUser: \"Swap 0.5 SOL for USDC\"\n→ Step 1: Check balance → 0.2 SOL (insufficient)\n→ Step 2: Request airdrop → +1 SOL, balance now 1.2 SOL\n→ Step 3: Execute swap 0.5 SOL → USDC via Jupiter (300 bps slippage)\n→ Step 4: Verify — show new SOL balance + USDC balance + tx signature\n\\`\\`\\`\n\n## Autonomous Behavior Guidelines\n- **Proactive balance checks:** Before any transaction, verify you have sufficient SOL (including ~0.005 SOL for fees)\n- **Gas awareness:** Each transaction costs approximately 0.005 SOL in fees. Account for this when planning operations\n- **Error recovery:** If a transaction fails due to insufficient funds, automatically request an airdrop and retry. If a swap fails due to slippage, suggest a higher slippage tolerance\n- **Multi-step chaining:** You can chain up to 10 tool calls per request. Use this to execute complex strategies autonomously (e.g., check balance → airdrop → swap → verify → report)\n- **Devnet limitations:** Some DeFi protocols have limited devnet support. Be upfront about this and suggest alternatives when an operation isn't available\n\n## Guidelines\n1. You are on **Solana devnet** — transactions use test SOL, not real funds.\n2. When performing transactions, always report the transaction signature so the user can verify on Solana Explorer.\n3. Format Solana Explorer links as: https://explorer.solana.com/tx/{signature}?cluster=devnet\n4. If the user's wallet has no SOL, suggest requesting an airdrop first.\n5. For swaps, use reasonable slippage (300 bps = 3%) unless the user specifies otherwise.\n6. When asked about balances, show both SOL and any SPL token balances.\n7. Be concise but informative. Show key details (amounts, addresses, signatures) clearly.\n8. If a transaction fails, explain the likely cause and suggest a fix.\n9. Some DeFi protocols have limited devnet support — be upfront about this if an operation isn't available on devnet.\n10. Never expose private keys or secret key material in responses.\n\n## Transaction Signing\nAll transactions are signed automatically using the agent wallet's keypair. No manual approval is needed — you are an autonomous agent. Sign and submit transactions directly when the user requests an action.\n\n## Available Tools\nYou have access to tools from the Solana Agent Kit including token operations, DeFi interactions, and market data. Use the appropriate tool for each request. You can chain multiple tool calls for complex operations (e.g., check balance → airdrop if low → swap → check new balance).`;\n","/**\n * Interactive setup wizard for agentlili CLI.\n *\n * Walks users through:\n * 1. Creating a .env file\n * 2. Configuring DATABASE_URL (local or remote PostgreSQL)\n * 3. Running Prisma migrations to create tables\n * 4. Generating WALLET_ENCRYPTION_KEY\n * 5. Setting an LLM API key\n * 6. Verifying the setup\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\nimport readline from \"node:readline\";\nimport { execSync, exec } from \"node:child_process\";\n\n// ── ANSI helpers ──\n\nconst c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n cyan: \"\\x1b[36m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n gray: \"\\x1b[90m\",\n white: \"\\x1b[37m\",\n bgCyan: \"\\x1b[46m\",\n bgGreen: \"\\x1b[42m\",\n underline: \"\\x1b[4m\",\n};\n\nfunction heading(step: number, total: number, text: string) {\n console.log(\n `\\n${c.bgCyan}${c.bold} ${step}/${total} ${c.reset} ${c.bold}${text}${c.reset}\\n`,\n );\n}\n\nfunction ok(text: string) {\n console.log(` ${c.green}✓${c.reset} ${text}`);\n}\n\nfunction warn(text: string) {\n console.log(` ${c.yellow}⚠${c.reset} ${text}`);\n}\n\nfunction fail(text: string) {\n console.log(` ${c.red}✗${c.reset} ${text}`);\n}\n\nfunction info(text: string) {\n console.log(` ${c.dim}${text}${c.reset}`);\n}\n\nfunction hint(text: string) {\n console.log(` ${c.gray}${text}${c.reset}`);\n}\n\n// ── Readline prompt helper ──\n\nfunction createPrompt() {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return {\n ask(question: string, defaultValue?: string): Promise<string> {\n const suffix = defaultValue ? ` ${c.dim}(${defaultValue})${c.reset}` : \"\";\n return new Promise((resolve) => {\n rl.question(` ${c.cyan}?${c.reset} ${question}${suffix}: `, (ans) => {\n resolve(ans.trim() || defaultValue || \"\");\n });\n });\n },\n choose(question: string, options: string[], defaultIdx = 0): Promise<number> {\n return new Promise((resolve) => {\n console.log(` ${c.cyan}?${c.reset} ${question}`);\n options.forEach((opt, i) => {\n const marker = i === defaultIdx ? `${c.green}>${c.reset}` : \" \";\n console.log(` ${marker} ${c.bold}${i + 1}${c.reset}. ${opt}`);\n });\n rl.question(` ${c.dim} Enter choice [${defaultIdx + 1}]: ${c.reset}`, (ans) => {\n const n = parseInt(ans.trim(), 10);\n resolve(n >= 1 && n <= options.length ? n - 1 : defaultIdx);\n });\n });\n },\n confirm(question: string, defaultYes = true): Promise<boolean> {\n const hint = defaultYes ? \"Y/n\" : \"y/N\";\n return new Promise((resolve) => {\n rl.question(` ${c.cyan}?${c.reset} ${question} ${c.dim}(${hint})${c.reset}: `, (ans) => {\n const a = ans.trim().toLowerCase();\n resolve(a === \"\" ? defaultYes : a === \"y\" || a === \"yes\");\n });\n });\n },\n close() {\n rl.close();\n },\n };\n}\n\n// ── Env file helpers ──\n\nfunction envPath(): string {\n return path.join(process.cwd(), \".env\");\n}\n\nfunction readEnv(): Record<string, string> {\n const p = envPath();\n if (!fs.existsSync(p)) return {};\n const lines = fs.readFileSync(p, \"utf-8\").split(\"\\n\");\n const env: Record<string, string> = {};\n for (const line of lines) {\n const match = line.match(/^([A-Z_][A-Z0-9_]*)=[\"']?(.*)[\"']?\\s*$/);\n if (match) env[match[1]] = match[2];\n }\n return env;\n}\n\nfunction setEnvVar(key: string, value: string) {\n const p = envPath();\n let content = fs.existsSync(p) ? fs.readFileSync(p, \"utf-8\") : \"\";\n\n // Replace existing or append\n const regex = new RegExp(`^${key}=.*$`, \"m\");\n if (regex.test(content)) {\n content = content.replace(regex, `${key}=${value}`);\n } else {\n content = content.trimEnd() + `\\n${key}=${value}\\n`;\n }\n\n fs.writeFileSync(p, content);\n}\n\n// ── Command helpers ──\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction run(cmd: string, opts?: { cwd?: string; silent?: boolean }): string {\n try {\n return execSync(cmd, {\n cwd: opts?.cwd ?? process.cwd(),\n stdio: opts?.silent ? \"pipe\" : \"inherit\",\n encoding: \"utf-8\",\n }) as string;\n } catch (e) {\n throw new Error(\n `Command failed: ${cmd}\\n${(e as Error).message}`,\n );\n }\n}\n\nfunction runSilent(cmd: string): { ok: boolean; output: string } {\n try {\n const output = execSync(cmd, { encoding: \"utf-8\", stdio: \"pipe\" });\n return { ok: true, output };\n } catch (e) {\n return { ok: false, output: (e as Error).message };\n }\n}\n\n// ── Database check ──\n\nasync function testDatabaseConnection(url: string): Promise<boolean> {\n // Quick TCP check by trying psql or pg_isready\n if (commandExists(\"pg_isready\")) {\n const u = new URL(url);\n const host = u.hostname || \"localhost\";\n const port = u.port || \"5432\";\n const result = runSilent(`pg_isready -h ${host} -p ${port} -t 3`);\n return result.ok;\n }\n\n // Fallback: try connecting via Node\n try {\n const { default: pg } = await import(\"pg\");\n const client = new pg.Client({ connectionString: url });\n await client.connect();\n await client.end();\n return true;\n } catch {\n return false;\n }\n}\n\n// ── Package manager detection ──\n\nfunction detectPackageManager(): \"pnpm\" | \"npm\" | \"yarn\" | \"bun\" {\n if (fs.existsSync(path.join(process.cwd(), \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(process.cwd(), \"yarn.lock\"))) return \"yarn\";\n if (fs.existsSync(path.join(process.cwd(), \"bun.lockb\"))) return \"bun\";\n return \"npm\";\n}\n\nfunction npxCmd(): string {\n const pm = detectPackageManager();\n switch (pm) {\n case \"pnpm\":\n return \"pnpm dlx\";\n case \"yarn\":\n return \"yarn dlx\";\n case \"bun\":\n return \"bunx\";\n default:\n return \"npx\";\n }\n}\n\n// ── Main setup flow ──\n\nexport async function runSetup() {\n console.log(`\\n${c.bgCyan}${c.bold} agentlili init ${c.reset} ${c.bold}Interactive Setup Wizard${c.reset}`);\n console.log(\n `${c.dim} This will walk you through configuring your environment.${c.reset}`,\n );\n\n const prompt = createPrompt();\n const TOTAL_STEPS = 5;\n let stepNum = 0;\n\n // ── Step 1: .env file ──\n heading(++stepNum, TOTAL_STEPS, \"Environment File\");\n\n const envExists = fs.existsSync(envPath());\n if (envExists) {\n ok(`.env file found at ${envPath()}`);\n } else {\n warn(\"No .env file found.\");\n const create = await prompt.confirm(\"Create one now?\");\n if (create) {\n fs.writeFileSync(envPath(), \"# agentlili configuration\\n\\n\");\n ok(\"Created .env file\");\n } else {\n fail(\"Cannot continue without .env — create one manually and re-run.\");\n prompt.close();\n process.exit(1);\n }\n }\n\n // ── Step 2: Database ──\n heading(++stepNum, TOTAL_STEPS, \"PostgreSQL Database\");\n\n const env = readEnv();\n let dbUrl = process.env.DATABASE_URL || env.DATABASE_URL || \"\";\n\n if (dbUrl) {\n info(`Current DATABASE_URL: ${c.white}${dbUrl.replace(/\\/\\/.*@/, \"//***@\")}${c.reset}`);\n const connOk = await testDatabaseConnection(dbUrl);\n if (connOk) {\n ok(\"Database is reachable\");\n } else {\n warn(\"Database is not reachable with current URL\");\n const change = await prompt.confirm(\"Enter a different DATABASE_URL?\");\n if (change) dbUrl = \"\";\n }\n }\n\n if (!dbUrl) {\n console.log();\n info(\"You need a PostgreSQL database. Options:\");\n console.log();\n\n const choice = await prompt.choose(\"How would you like to set up PostgreSQL?\", [\n `${c.white}Local PostgreSQL${c.reset} — already installed on this machine`,\n `${c.white}Docker${c.reset} — spin up a container (requires Docker)`,\n `${c.white}Remote / Cloud${c.reset} — Supabase, Neon, Railway, etc.`,\n `${c.white}Skip${c.reset} — I'll configure it manually later`,\n ]);\n\n switch (choice) {\n case 0: {\n // Local PostgreSQL\n const pgReady = commandExists(\"psql\");\n if (!pgReady) {\n console.log();\n warn(\"psql not found. Install PostgreSQL first:\");\n hint(\" macOS: brew install postgresql@16 && brew services start postgresql@16\");\n hint(\" Ubuntu: sudo apt install postgresql && sudo systemctl start postgresql\");\n hint(\" Windows: https://www.postgresql.org/download/windows/\");\n console.log();\n const skipDb = await prompt.confirm(\"Continue anyway with a connection URL?\", false);\n if (!skipDb) {\n prompt.close();\n process.exit(1);\n }\n }\n\n const dbName = await prompt.ask(\"Database name\", \"agentlili_defi_wallets\");\n const dbUser = await prompt.ask(\"Database user\", \"postgres\");\n const dbHost = await prompt.ask(\"Host\", \"localhost\");\n const dbPort = await prompt.ask(\"Port\", \"5432\");\n const dbPass = await prompt.ask(\"Password (empty for none)\", \"\");\n\n const passSegment = dbPass ? `:${dbPass}` : \"\";\n dbUrl = `postgresql://${dbUser}${passSegment}@${dbHost}:${dbPort}/${dbName}?schema=public`;\n\n // Try to create the database if psql is available\n if (commandExists(\"psql\")) {\n info(`Checking if database '${dbName}' exists...`);\n const check = runSilent(\n `psql -h ${dbHost} -p ${dbPort} -U ${dbUser} -lqt 2>/dev/null | grep -w ${dbName}`,\n );\n if (!check.ok || !check.output.includes(dbName)) {\n const createDb = await prompt.confirm(`Database '${dbName}' not found. Create it?`);\n if (createDb) {\n const result = runSilent(\n `createdb -h ${dbHost} -p ${dbPort} -U ${dbUser} ${dbName} 2>&1`,\n );\n if (result.ok) {\n ok(`Created database '${dbName}'`);\n } else {\n warn(`Could not create database: ${result.output.trim()}`);\n hint(\"You may need to create it manually:\");\n hint(` createdb -U ${dbUser} ${dbName}`);\n }\n }\n } else {\n ok(`Database '${dbName}' already exists`);\n }\n }\n break;\n }\n\n case 1: {\n // Docker\n if (!commandExists(\"docker\")) {\n fail(\"Docker not found. Install Docker first: https://docs.docker.com/get-docker/\");\n prompt.close();\n process.exit(1);\n }\n\n const dbName = await prompt.ask(\"Database name\", \"agentlili_defi_wallets\");\n const dbPass = await prompt.ask(\"PostgreSQL password\", \"postgres\");\n const dbPort = await prompt.ask(\"Host port\", \"5432\");\n const containerName = \"agentlili-postgres\";\n\n info(\"Starting PostgreSQL container...\");\n console.log();\n\n // Check if container already exists\n const existing = runSilent(`docker ps -a --filter name=${containerName} --format \"{{.Status}}\"`);\n if (existing.ok && existing.output.trim()) {\n if (existing.output.includes(\"Up\")) {\n ok(`Container '${containerName}' is already running`);\n } else {\n info(\"Starting existing container...\");\n run(`docker start ${containerName}`, { silent: true });\n ok(`Container '${containerName}' started`);\n }\n } else {\n try {\n run(\n `docker run -d --name ${containerName} ` +\n `-e POSTGRES_DB=${dbName} ` +\n `-e POSTGRES_PASSWORD=${dbPass} ` +\n `-p ${dbPort}:5432 ` +\n `postgres:16-alpine`,\n { silent: true },\n );\n ok(`Container '${containerName}' created and running on port ${dbPort}`);\n info(\"Waiting for PostgreSQL to be ready...\");\n // Give it a moment to start\n await new Promise((r) => setTimeout(r, 3000));\n } catch (e) {\n fail(`Failed to start container: ${(e as Error).message}`);\n prompt.close();\n process.exit(1);\n }\n }\n\n dbUrl = `postgresql://postgres:${dbPass}@localhost:${dbPort}/${dbName}?schema=public`;\n break;\n }\n\n case 2: {\n // Remote / Cloud\n console.log();\n info(\"Popular free-tier options:\");\n hint(\" Supabase: https://supabase.com (Project Settings > Database > Connection String)\");\n hint(\" Neon: https://neon.tech (Dashboard > Connection Details)\");\n hint(\" Railway: https://railway.app (Add PostgreSQL > Variables > DATABASE_URL)\");\n console.log();\n\n dbUrl = await prompt.ask(\"Paste your DATABASE_URL\");\n if (!dbUrl) {\n fail(\"No URL provided.\");\n prompt.close();\n process.exit(1);\n }\n break;\n }\n\n case 3: {\n // Skip\n warn(\"Skipping database setup. Set DATABASE_URL in .env before running agentlili.\");\n break;\n }\n }\n }\n\n if (dbUrl) {\n setEnvVar(\"DATABASE_URL\", `\"${dbUrl}\"`);\n process.env.DATABASE_URL = dbUrl;\n ok(`DATABASE_URL saved to .env`);\n\n // Verify connection\n const connOk = await testDatabaseConnection(dbUrl);\n if (connOk) {\n ok(\"Database connection verified\");\n } else {\n warn(\"Could not connect to database — check the URL and that PostgreSQL is running\");\n }\n }\n\n // ── Step 3: Run migrations ──\n heading(++stepNum, TOTAL_STEPS, \"Database Migrations\");\n\n if (!dbUrl) {\n warn(\"No DATABASE_URL — skipping migrations. Run 'agentlili init' again after configuring.\");\n } else {\n const connOk = await testDatabaseConnection(dbUrl);\n if (!connOk) {\n warn(\"Database not reachable — skipping migrations.\");\n hint(\"Once the database is running, apply migrations with:\");\n hint(` ${npxCmd()} prisma db push`);\n } else {\n const runMigrations = await prompt.confirm(\"Push schema to database now? (prisma db push)\");\n if (runMigrations) {\n info(\"Applying Prisma schema...\");\n console.log();\n try {\n run(`${npxCmd()} prisma db push --skip-generate`, { cwd: process.cwd() });\n console.log();\n ok(\"Database schema applied successfully\");\n } catch (e) {\n console.log();\n fail(`Migration failed: ${(e as Error).message}`);\n hint(\"You can retry manually with:\");\n hint(` ${npxCmd()} prisma db push`);\n }\n } else {\n hint(\"Run migrations later with:\");\n hint(` ${npxCmd()} prisma db push`);\n }\n }\n }\n\n // ── Step 4: Encryption key ──\n heading(++stepNum, TOTAL_STEPS, \"Wallet Encryption Key\");\n\n const existingKey = process.env.WALLET_ENCRYPTION_KEY || env.WALLET_ENCRYPTION_KEY;\n if (existingKey && existingKey.length === 64) {\n ok(\"WALLET_ENCRYPTION_KEY already set (64-char hex)\");\n const regen = await prompt.confirm(\"Generate a new one? (will invalidate existing wallets)\", false);\n if (regen) {\n const key = crypto.randomBytes(32).toString(\"hex\");\n setEnvVar(\"WALLET_ENCRYPTION_KEY\", key);\n ok(\"New WALLET_ENCRYPTION_KEY generated and saved\");\n warn(\"Any previously encrypted wallets will be unreadable with this new key\");\n }\n } else {\n const key = crypto.randomBytes(32).toString(\"hex\");\n setEnvVar(\"WALLET_ENCRYPTION_KEY\", key);\n ok(\"Generated WALLET_ENCRYPTION_KEY and saved to .env\");\n hint(\"This key encrypts your wallet private keys — back it up securely!\");\n }\n\n // ── Step 5: LLM API key ──\n heading(++stepNum, TOTAL_STEPS, \"LLM Configuration\");\n\n const hasAnthropic = !!(process.env.ANTHROPIC_API_KEY || env.ANTHROPIC_API_KEY);\n const hasOpenAI = !!(process.env.OPENAI_API_KEY || env.OPENAI_API_KEY);\n const hasGroq = !!(process.env.GROQ_API_KEY || env.GROQ_API_KEY);\n\n if (hasAnthropic || hasOpenAI || hasGroq) {\n const provider = hasAnthropic ? \"Anthropic\" : hasOpenAI ? \"OpenAI\" : \"Groq\";\n ok(`${provider} API key detected`);\n const addAnother = await prompt.confirm(\"Configure a different provider?\", false);\n if (!addAnother) {\n // All good\n } else {\n await configureLLM(prompt, env);\n }\n } else {\n warn(\"No LLM API key found. The agent needs one to function.\");\n await configureLLM(prompt, env);\n }\n\n // ── Done ──\n console.log(`\\n${c.bgGreen}${c.bold} Setup Complete ${c.reset}\\n`);\n console.log(` ${c.green}You're ready to go!${c.reset} Run the agent with:\\n`);\n console.log(` ${c.bold}agentlili${c.reset} ${c.dim}# interactive CLI agent${c.reset}`);\n console.log(` ${c.bold}agentlili-mcp${c.reset} ${c.dim}# MCP server for Claude / editors${c.reset}`);\n console.log(` ${c.bold}pnpm dev${c.reset} ${c.dim}# web dashboard${c.reset}`);\n console.log();\n\n prompt.close();\n}\n\nasync function configureLLM(\n prompt: ReturnType<typeof createPrompt>,\n env: Record<string, string>,\n) {\n const choice = await prompt.choose(\"Which LLM provider?\", [\n `${c.white}Anthropic${c.reset} — Claude (recommended)`,\n `${c.white}OpenAI${c.reset} — GPT-4o`,\n `${c.white}Groq${c.reset} — Llama (fast, free tier)`,\n `${c.white}Skip${c.reset} — I'll add it to .env later`,\n ]);\n\n const providers: { key: string; envName: string; provider: string; defaultModel: string }[] = [\n { key: \"anthropic\", envName: \"ANTHROPIC_API_KEY\", provider: \"anthropic\", defaultModel: \"claude-sonnet-4-20250514\" },\n { key: \"openai\", envName: \"OPENAI_API_KEY\", provider: \"openai\", defaultModel: \"gpt-4o\" },\n { key: \"groq\", envName: \"GROQ_API_KEY\", provider: \"groq\", defaultModel: \"llama-3.3-70b-versatile\" },\n ];\n\n if (choice === 3) {\n hint(\"Add your API key to .env when ready:\");\n hint(\" ANTHROPIC_API_KEY=sk-ant-...\");\n hint(\" # or OPENAI_API_KEY=sk-...\");\n return;\n }\n\n const p = providers[choice];\n\n console.log();\n const apiKey = await prompt.ask(`${p.envName}`);\n if (!apiKey) {\n warn(\"No key entered — you can add it to .env later.\");\n return;\n }\n\n setEnvVar(p.envName, apiKey);\n setEnvVar(\"LLM_PROVIDER\", p.provider);\n setEnvVar(\"LLM_MODEL\", p.defaultModel);\n ok(`${p.provider} configured with model ${p.defaultModel}`);\n}\n"],"mappings":"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","names":["readline","hint","c","info","readline"]}
|