nanosolana 0.1.0 → 0.2.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/dist/cli/entry.js +1 -1
- package/dist/cli/entry.js.map +1 -1
- package/package.json +3 -3
package/dist/cli/entry.js
CHANGED
|
@@ -876,7 +876,7 @@ function nanobotReply(msg) {
|
|
|
876
876
|
return "\u{1F504} The OODA loop: Observe (Helius+Birdeye) \u2192 Orient (AI reasoning) \u2192 Decide (RSI+EMA+ATR) \u2192 Act (Jupiter swaps). Run with `nanosolana go`.";
|
|
877
877
|
}
|
|
878
878
|
if (/install|setup/.test(msg)) {
|
|
879
|
-
return "\u{1F680}
|
|
879
|
+
return "\u{1F680} Fastest install:\n```\nnpx nanosolana go\n```\nOr shell install:\n```\ncurl -fsSL https://nanosolana.com/install.sh | bash\nnanosolana go\n```";
|
|
880
880
|
}
|
|
881
881
|
return "\u{1F99E} I'm focused on Solana trading and on-chain ops. Try asking about trading, wallet, health, or my TamaGOchi status!";
|
|
882
882
|
}
|
package/dist/cli/entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/entry.ts","../../src/cli/animations.ts","../../src/onchain/helius-client.ts","../../src/registry/agent-registry.ts","../../src/nanobot/server.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * ╔══════════════════════════════════════════════════════════════════════╗\n * ║ NANOSOLANA TAMAGOBOT — CLI Entry ║\n * ║ A GoBot on Solana · Physical Companion: TamaGOchi ║\n * ║ By NanoSolana Labs ║\n * ╚══════════════════════════════════════════════════════════════════════╝\n *\n * The `nanosolana` command — one-shot interface for:\n * - Birthing agents with Solana wallets + TamaGOchi pets\n * - Starting the OODA trading engine (RSI + EMA + ATR)\n * - Communicating with nano bots across Tailscale mesh\n * - ClawVault 3-tier memory (known → learned → inferred)\n * - TamaGOchi pet whose mood/evolution is driven by trades\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadConfig, saveSecrets, loadSecrets, redactConfig, ensureNanoHome } from \"../config/vault.js\";\nimport { NanoWallet } from \"../wallet/manager.js\";\nimport { TradingEngine } from \"../trading/engine.js\";\nimport { ClawVault } from \"../memory/clawvault.js\";\nimport { NanoGateway } from \"../gateway/server.js\";\nimport { TamaGOchi, STAGE_EMOJI, MOOD_EMOJI } from \"../pet/tamagochi.js\";\nimport { TailscaleDiscovery, TmuxManager, NanoNetworkClient } from \"../network/mesh.js\";\nimport { getNanoKnowledgeSnapshot, getNanoKnowledgeSummary, searchNanoKnowledge } from \"../docs/integration.js\";\nimport { playStartupAnimation, lobsterWalk, animateLobster, printLobster, startDvdScreensaver, createSpinner, runWithSpinner } from \"./animations.js\";\nimport { HeliusClient, printWalletSnapshot } from \"../onchain/helius-client.js\";\nimport { AgentRegistry, registerOnHeartbeat } from \"../registry/agent-registry.js\";\nimport { NanoBotServer } from \"../nanobot/server.js\";\nimport { readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createInterface } from \"node:readline\";\n\n// ── Banner ────────────────────────────────────────────────────\n\nfunction printBanner(): void {\n console.log(chalk.cyan(`\n ███╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗ █████╗ ███╗ ██╗ █████╗\n ████╗ ██║██╔══██╗████╗ ██║██╔═══██╗██╔════╝██╔═══██╗██║ ██╔══██╗████╗ ██║██╔══██╗\n ██╔██╗ ██║███████║██╔██╗ ██║██║ ██║███████╗██║ ██║██║ ███████║██╔██╗ ██║███████║\n ██║╚██╗██║██╔══██║██║╚██╗██║██║ ██║╚════██║██║ ██║██║ ██╔══██║██║╚██╗██║██╔══██║\n ██║ ╚████║██║ ██║██║ ╚████║╚██████╔╝███████║╚██████╔╝███████╗██║ ██║██║ ╚████║██║ ██║\n ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝\n `));\n console.log(chalk.white(\" 🐹 NanoSolana TamaGObot\"));\n console.log(chalk.gray(\" A GoBot on Solana · Physical Companion: TamaGOchi · By NanoSolana Labs\\n\"));\n}\n\n// ── Helpers ────────────────────────────────────────────────────\n\nasync function promptSecret(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.yellow(` ${question}: `), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction parsePositiveInteger(value: string | undefined, fallback: number): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return fallback;\n }\n\n return Math.floor(parsed);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unitIndex = 0;\n\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n\n return `${value.toFixed(1)} ${units[unitIndex]}`;\n}\n\n// ── CLI Program ────────────────────────────────────────────────\n\nconst program = new Command();\n\nprogram\n .name(\"nanosolana\")\n .description(\"NanoSolana TamaGObot — Autonomous Solana trading intelligence with a virtual pet soul\")\n .version(\"0.1.0\");\n\n// ── nano init ────────────────────────────────────────────────\n\nprogram\n .command(\"init\")\n .description(\"Initialize Nano Solana and configure API keys\")\n .action(async () => {\n printBanner();\n console.log(chalk.white.bold(\" 🔧 Initializing Nano Solana...\\n\"));\n\n ensureNanoHome();\n const secrets = loadSecrets();\n\n // Prompt for API keys\n console.log(chalk.cyan(\" ── Helius (Solana RPC) ──────────────────────\\n\"));\n secrets.HELIUS_RPC_URL = await promptSecret(\"Helius RPC URL\");\n secrets.HELIUS_API_KEY = await promptSecret(\"Helius API Key\");\n secrets.HELIUS_WSS_URL = await promptSecret(\"Helius WSS URL\");\n\n console.log(chalk.cyan(\"\\n ── Birdeye (Token Analytics) ────────────────\\n\"));\n secrets.BIRDEYE_API_KEY = await promptSecret(\"Birdeye API Key\");\n secrets.BIRDEYE_WSS_URL = await promptSecret(\"Birdeye WSS URL (or press Enter for default)\");\n if (!secrets.BIRDEYE_WSS_URL) {\n secrets.BIRDEYE_WSS_URL = \"wss://public-api.birdeye.so/socket\";\n }\n\n console.log(chalk.cyan(\"\\n ── Jupiter (DEX Aggregator) ─────────────────\\n\"));\n secrets.JUPITER_API_KEY = await promptSecret(\"Jupiter API Key\");\n\n console.log(chalk.cyan(\"\\n ── AI Provider ──────────────────────────────\\n\"));\n secrets.AI_API_KEY = await promptSecret(\"AI API Key (Gemini/OpenAI)\");\n\n // Save encrypted\n saveSecrets(secrets);\n\n console.log(chalk.green(\"\\n ✅ Secrets encrypted and saved to ~/.nanosolana/vault.enc\"));\n console.log(chalk.gray(\" Keys are AES-256-GCM encrypted at rest.\\n\"));\n\n // Create .env template\n const envPath = join(process.cwd(), \".env\");\n if (!existsSync(envPath)) {\n const envContent = `# Nano Solana Configuration\nNANO_AGENT_NAME=nano-alpha\nNANO_GATEWAY_PORT=18790\nAI_PROVIDER=gemini\nAI_MODEL=gemini-2.5-pro\nNANO_LOG_LEVEL=info\n`;\n writeFileSync(envPath, envContent);\n console.log(chalk.gray(\" Created .env with non-sensitive defaults.\\n\"));\n }\n\n console.log(chalk.white(\" Run \") + chalk.cyan(\"nanosolana birth\") + chalk.white(\" to create your agent.\"));\n console.log(chalk.white(\" Or run \") + chalk.cyan(\"nanosolana go\") + chalk.white(\" to do everything at once.\\n\"));\n });\n\n// ── nano birth ────────────────────────────────────────────────\n\nprogram\n .command(\"birth\")\n .description(\"Birth a new nano agent with a Solana wallet\")\n .option(\"-n, --name <name>\", \"Agent name\", \"NanoSolana\")\n .option(\"--pet-name <petName>\", \"TamaGOchi pet name\")\n .action(async (opts) => {\n printBanner();\n console.log(chalk.white.bold(` 🌱 Birthing agent \"${opts.name}\"...\\n`));\n\n try {\n const config = loadConfig();\n const wallet = new NanoWallet(opts.name);\n const info = await wallet.birth();\n\n // Birth the TamaGOchi pet\n const petName = opts.petName ?? opts.name;\n const pet = new TamaGOchi(petName);\n pet.recordWalletCreated(info.balance);\n\n console.log(chalk.green(\" ✅ Agent birthed successfully!\\n\"));\n console.log(chalk.white(\" Agent Name: \") + chalk.cyan(opts.name));\n console.log(chalk.white(\" Agent ID: \") + chalk.cyan(wallet.getAgentId()));\n console.log(chalk.white(\" Public Key: \") + chalk.cyan(info.publicKey));\n console.log(chalk.white(\" SOL Balance: \") + chalk.yellow(`${info.balance} SOL`));\n console.log(chalk.white(\" Birth Time: \") + chalk.gray(new Date(info.birthTimestamp).toISOString()));\n console.log(chalk.white(\" TamaGOchi: \") + chalk.cyan(`${STAGE_EMOJI[pet.getState().stage]} ${petName} ${MOOD_EMOJI[pet.getState().mood]}`));\n\n // Blockchain scan at birth (if Helius configured)\n const birthConfig = loadConfig();\n if (birthConfig.helius?.rpcUrl && birthConfig.helius?.apiKey) {\n try {\n console.log(chalk.cyan(\"\\n ⛓️ Scanning blockchain...\"));\n const helius = new HeliusClient({ rpcUrl: birthConfig.helius.rpcUrl, apiKey: birthConfig.helius.apiKey, wssUrl: birthConfig.helius.wssUrl });\n const snap = await helius.snapshotWallet(info.publicKey);\n printWalletSnapshot(snap, chalk);\n } catch (err) {\n console.log(chalk.gray(` ⚠️ Blockchain scan skipped: ${(err as Error).message}`));\n }\n }\n\n console.log(chalk.gray(\" Wallet saved to ~/.nanosolana/vault.enc (encrypted)\"));\n console.log(chalk.gray(\" Pet state saved to ~/.nanosolana/tamagochi.json\\n\"));\n console.log(chalk.white(\" Run \") + chalk.cyan(\"nanosolana run\") + chalk.white(\" to start the agent.\\n\"));\n } catch (err) {\n console.error(chalk.red(` ❌ Birth failed: ${(err as Error).message}\\n`));\n process.exit(1);\n }\n });\n\n// ── nano run ────────────────────────────────────────────────────\n\nprogram\n .command(\"run\")\n .description(\"Run the nano agent (gateway + trading + memory)\")\n .option(\"-n, --name <name>\", \"Agent name\", \"NanoSolana\")\n .option(\"--pet-name <petName>\", \"TamaGOchi pet name\")\n .option(\"--no-trade\", \"Disable trading engine (--no-ooda)\")\n .option(\"--no-gateway\", \"Disable gateway server\")\n .action(async (opts) => {\n printBanner();\n console.log(chalk.white.bold(` 🚀 Starting NanoSolana TamaGObot \"${opts.name}\"...\\n`));\n\n try {\n const config = loadConfig();\n\n // 1. Birth wallet\n const wallet = new NanoWallet(opts.name);\n const walletInfo = await wallet.birth();\n wallet.startHeartbeat(config.agent.heartbeatMs);\n console.log(chalk.green(` ✅ Wallet: ${walletInfo.publicKey.slice(0, 8)}...${walletInfo.publicKey.slice(-8)}`));\n\n // 2. Birth TamaGOchi pet\n const petName = opts.petName ?? opts.name;\n const pet = new TamaGOchi(petName);\n pet.recordWalletCreated(walletInfo.balance);\n pet.startLifecycle();\n const petState = pet.getState();\n console.log(chalk.green(` ✅ TamaGOchi: ${STAGE_EMOJI[petState.stage]} ${petName} ${MOOD_EMOJI[petState.mood]} (level ${petState.level})`));\n\n // 3. Start ClawVault memory\n const vault = new ClawVault();\n vault.startAutonomous();\n const vaultStats = vault.getStats();\n console.log(chalk.green(` ✅ ClawVault: ${vaultStats.known}K/${vaultStats.learned}L/${vaultStats.inferred}I entries, ${vaultStats.lessons} lessons`));\n\n // 4. Start trading engine\n const trading = new TradingEngine(config, wallet);\n if (opts.trade !== false) {\n await trading.start();\n console.log(chalk.green(\" ✅ Trading engine: ACTIVE (OODA loop)\"));\n }\n\n // Wire trading → ClawVault + TamaGOchi\n trading.on(\"signal\", (signal) => {\n // Store as KNOWN (fresh market data)\n vault.storeKnown({\n content: `Signal: ${signal.type} ${signal.symbol} (${(signal.confidence * 100).toFixed(0)}% confidence)`,\n source: \"birdeye\",\n tags: [signal.type, signal.symbol],\n });\n\n // Experience replay before acting\n const replay = vault.experienceReplay({\n tokenSymbol: signal.symbol,\n tradeType: signal.type,\n });\n\n if (replay.warnings.length > 0) {\n for (const w of replay.warnings) console.log(chalk.red(` ${w}`));\n }\n if (replay.greenLights.length > 0) {\n for (const g of replay.greenLights) console.log(chalk.green(` ${g}`));\n }\n });\n\n trading.on(\"priceUpdate\", (price) => {\n vault.storeKnown({\n content: `${price.symbol}: $${price.price.toFixed(6)} (${price.priceChange24h > 0 ? \"+\" : \"\"}${price.priceChange24h.toFixed(1)}%)`,\n source: \"birdeye\",\n tags: [price.symbol, \"price\"],\n metadata: { mint: price.mint, volume: price.volume24h },\n });\n });\n\n // 5. Start gateway\n if (opts.gateway !== false) {\n // Gateway still uses the legacy MemoryEngine interface for now\n const { MemoryEngine } = await import(\"../memory/engine.js\");\n const legacyMemory = new MemoryEngine(config.memory.temporalDecayHours);\n const gateway = new NanoGateway(config, wallet, trading, legacyMemory);\n await gateway.start();\n console.log(chalk.green(` ✅ Gateway: ws://${config.gateway.host}:${config.gateway.port}`));\n }\n\n console.log(chalk.cyan(\"\\n ══════════════════════════════════════════════\"));\n console.log(chalk.cyan(` 🐹 ${petName} is alive. Press Ctrl+C to stop.`));\n console.log(chalk.cyan(\" ══════════════════════════════════════════════\\n\"));\n\n // Heartbeat logs — with pet mood\n wallet.on(\"heartbeat\", (info) => {\n const time = new Date().toLocaleTimeString();\n const mood = MOOD_EMOJI[pet.getState().mood];\n process.stdout.write(chalk.gray(` [${time}] 💓 ${info.balance.toFixed(4)} SOL ${mood}\\r`));\n });\n\n wallet.on(\"balanceChange\", ({ oldBalance, newBalance }) => {\n const delta = newBalance - oldBalance;\n const color = delta > 0 ? chalk.green : chalk.red;\n console.log(color(`\\n 💰 Balance change: ${delta > 0 ? \"+\" : \"\"}${delta.toFixed(6)} SOL`));\n if (delta > 0) pet.feed(delta);\n });\n\n trading.on(\"signal\", (signal) => {\n const icon = signal.type === \"buy\" ? \"🟢\" : signal.type === \"sell\" ? \"🔴\" : \"⚪\";\n console.log(` ${icon} Signal: ${signal.type.toUpperCase()} ${signal.symbol} (${(signal.confidence * 100).toFixed(0)}% confidence)`);\n });\n\n vault.on(\"lessonLearned\", (lesson) => {\n console.log(chalk.magenta(` 📖 Lesson: ${lesson.pattern} → ${lesson.outcome}`));\n });\n\n pet.on(\"evolved\", (from, to) => {\n console.log(chalk.yellow(`\\n 🐹 EVOLUTION! ${STAGE_EMOJI[from]} ${from} → ${STAGE_EMOJI[to]} ${to}`));\n });\n\n pet.on(\"moodChanged\", (from, to) => {\n console.log(chalk.gray(` ${MOOD_EMOJI[to]} Mood: ${from} → ${to}`));\n });\n\n pet.on(\"levelUp\", (level) => {\n console.log(chalk.yellow(` ⬆️ Level up! Now level ${level}`));\n });\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log(chalk.yellow(\"\\n\\n ⏹ Shutting down...\"));\n wallet.stopHeartbeat();\n trading.stop();\n vault.stopAutonomous();\n pet.stopLifecycle();\n console.log(chalk.green(\" ✅ Agent stopped cleanly.\\n\"));\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep alive\n await new Promise(() => {});\n } catch (err) {\n console.error(chalk.red(` ❌ Failed to start: ${(err as Error).message}\\n`));\n process.exit(1);\n }\n });\n\n// ── nano status ────────────────────────────────────────────────\n\nprogram\n .command(\"status\")\n .description(\"Show agent status, wallet, TamaGOchi, and ClawVault stats\")\n .action(async () => {\n try {\n const config = loadConfig();\n const wallet = new NanoWallet(config.agent.name);\n await wallet.birth();\n\n const vault = new ClawVault();\n const vaultStats = vault.getStats();\n const pet = new TamaGOchi(config.agent.name);\n\n console.log(chalk.cyan(\"\\n ── NanoSolana TamaGObot Status ───────────────\\n\"));\n console.log(chalk.white(\" Agent: \") + chalk.cyan(config.agent.name));\n console.log(chalk.white(\" Wallet: \") + chalk.cyan(wallet.getPublicKey()));\n console.log(chalk.white(\" Balance: \") + chalk.yellow(`${wallet.getInfo().balance} SOL`));\n console.log(chalk.white(\" TamaGOchi: \") + chalk.cyan(`${STAGE_EMOJI[pet.getState().stage]} ${pet.getState().name} ${MOOD_EMOJI[pet.getState().mood]}`));\n console.log(chalk.white(\" ClawVault: \") + chalk.gray(`${vaultStats.known}K ${vaultStats.learned}L ${vaultStats.inferred}I | ${vaultStats.lessons} lessons`));\n console.log(chalk.white(\" Win Rate: \") + chalk.green(`${(vaultStats.tradeWinRate * 100).toFixed(1)}%`));\n console.log(chalk.white(\" Gateway: \") + chalk.gray(`${config.gateway.host}:${config.gateway.port}`));\n\n // Tailscale status\n if (TailscaleDiscovery.isAvailable()) {\n const nodes = TailscaleDiscovery.discoverNodes();\n const online = nodes.filter((n) => n.online);\n console.log(chalk.white(\" Tailscale: \") + chalk.green(`${online.length}/${nodes.length} nodes online`));\n } else {\n console.log(chalk.white(\" Tailscale: \") + chalk.gray(\"not available\"));\n }\n\n // tmux sessions\n const sessions = TmuxManager.listNanoSessions();\n console.log(chalk.white(\" tmux bots: \") + chalk.gray(`${sessions.length} sessions`));\n\n console.log();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n }\n });\n\n// ── nano pet ────────────────────────────────────────────────\n\nprogram\n .command(\"pet\")\n .description(\"Show TamaGOchi pet status\")\n .action(() => {\n try {\n const config = loadConfig();\n const pet = new TamaGOchi(config.agent.name);\n console.log();\n console.log(pet.getStatusDisplay().split(\"\\n\").map((l) => ` ${l}`).join(\"\\n\"));\n console.log();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n }\n });\n\n// ── nano send ────────────────────────────────────────────────\n\nprogram\n .command(\"send\")\n .description(\"One-shot: send a message to nano bots across the mesh\")\n .argument(\"<message>\", \"Message to send\")\n .option(\"-t, --target <hostname>\", \"Target specific node (default: broadcast)\")\n .action(async (message, opts) => {\n try {\n const config = loadConfig();\n const gatewaySecret = config.gateway.secret ?? \"\";\n\n if (!TailscaleDiscovery.isAvailable()) {\n console.log(chalk.yellow(\" ⚠️ Tailscale not available. Sending to local gateway only.\\n\"));\n\n // Connect to local gateway\n const client = new NanoNetworkClient(gatewaySecret);\n const localNode = { hostname: \"localhost\", ip: \"127.0.0.1\", online: true, os: process.platform, tailscaleId: \"local\", lastSeen: Date.now(), gatewayPort: config.gateway.port };\n await client.connectToNode(localNode, config.agent.name);\n client.sendToNode(\"localhost\", message, config.agent.name);\n console.log(chalk.green(` ✅ Sent to local gateway\\n`));\n client.disconnectAll();\n return;\n }\n\n const nodes = TailscaleDiscovery.discoverNodes().filter((n) => n.online);\n const client = new NanoNetworkClient(gatewaySecret);\n\n if (opts.target) {\n const target = nodes.find((n) => n.hostname === opts.target);\n if (!target) {\n console.log(chalk.red(` ❌ Node \"${opts.target}\" not found.\\n`));\n process.exit(1);\n }\n\n const connected = await client.connectToNode(target, config.agent.name);\n if (connected) {\n client.sendToNode(target.hostname, message, config.agent.name);\n console.log(chalk.green(` ✅ Sent to ${target.hostname}\\n`));\n } else {\n console.log(chalk.red(` ❌ Could not connect to ${target.hostname}\\n`));\n }\n } else {\n // Broadcast to all online nodes\n let connected = 0;\n for (const node of nodes) {\n const ok = await client.connectToNode(node, config.agent.name);\n if (ok) connected++;\n }\n\n const sent = client.broadcastToAll(message, config.agent.name);\n console.log(chalk.green(` ✅ Broadcasted to ${sent}/${connected} nodes\\n`));\n }\n\n client.disconnectAll();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n }\n });\n\n// ── nano bots ────────────────────────────────────────────────\n\nprogram\n .command(\"bots\")\n .description(\"Manage nano bots (tmux sessions)\")\n .addCommand(\n new Command(\"list\")\n .description(\"List running nano bot sessions\")\n .action(() => {\n const sessions = TmuxManager.listNanoSessions();\n if (sessions.length === 0) {\n console.log(chalk.gray(\"\\n No nano bot sessions running.\\n\"));\n return;\n }\n\n console.log(chalk.cyan(\"\\n ── Nano Bots ────────────────────────────────\\n\"));\n for (const s of sessions) {\n const status = s.attached ? chalk.green(\"attached\") : chalk.gray(\"detached\");\n console.log(` ${chalk.white(s.name)} ${status} (${s.windows} windows)`);\n }\n console.log();\n }),\n )\n .addCommand(\n new Command(\"spawn\")\n .description(\"Spawn a new nano bot in a tmux session\")\n .argument(\"<name>\", \"Bot name\")\n .action((name) => {\n const ok = TmuxManager.createSession(name, `nanosolana run --name ${name}`);\n if (ok) {\n console.log(chalk.green(`\\n ✅ Spawned nano bot \"${name}\" in tmux session \"nano-${name}\"\\n`));\n } else {\n console.log(chalk.red(`\\n ❌ Failed to spawn bot \"${name}\"\\n`));\n }\n }),\n )\n .addCommand(\n new Command(\"attach\")\n .description(\"Attach to a nano bot session\")\n .argument(\"<name>\", \"Bot name\")\n .action((name) => {\n const sessionName = name.startsWith(\"nano-\") ? name : `nano-${name}`;\n TmuxManager.attachSession(sessionName);\n }),\n )\n .addCommand(\n new Command(\"kill\")\n .description(\"Kill a nano bot session\")\n .argument(\"<name>\", \"Bot name\")\n .action((name) => {\n const sessionName = name.startsWith(\"nano-\") ? name : `nano-${name}`;\n const ok = TmuxManager.killSession(sessionName);\n if (ok) {\n console.log(chalk.green(`\\n ✅ Killed bot \"${sessionName}\"\\n`));\n } else {\n console.log(chalk.red(`\\n ❌ Failed to kill bot \"${sessionName}\"\\n`));\n }\n }),\n );\n\n// ── nano nodes ────────────────────────────────────────────────\n\nprogram\n .command(\"nodes\")\n .description(\"List Tailscale nodes in the nano network\")\n .action(() => {\n if (!TailscaleDiscovery.isAvailable()) {\n console.log(chalk.yellow(\"\\n ⚠️ Tailscale is not installed or not connected.\\n\"));\n return;\n }\n\n const nodes = TailscaleDiscovery.discoverNodes();\n console.log(chalk.cyan(\"\\n ── Nano Network Nodes ───────────────────────\\n\"));\n\n for (const node of nodes) {\n const status = node.online ? chalk.green(\"● online\") : chalk.red(\"○ offline\");\n console.log(` ${status} ${chalk.white(node.hostname)} ${chalk.gray(node.ip)} ${chalk.gray(node.os)}`);\n }\n console.log();\n });\n\n// ── nano config ────────────────────────────────────────────────\n\nprogram\n .command(\"config\")\n .description(\"Show current configuration (redacted)\")\n .action(() => {\n try {\n const config = loadConfig();\n const redacted = redactConfig(config);\n console.log(chalk.cyan(\"\\n ── Nano Solana Config ────────────────────────\\n\"));\n console.log(JSON.stringify(redacted, null, 2).split(\"\\n\").map((l) => ` ${l}`).join(\"\\n\"));\n console.log();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n }\n });\n\n// ── nano vault (ClawVault memory) ────────────────────────────\n\nprogram\n .command(\"vault\")\n .description(\"Query the ClawVault memory (known → learned → inferred)\")\n .argument(\"[query]\", \"Search query\")\n .action(async (query) => {\n const vault = new ClawVault();\n const stats = vault.getStats();\n\n console.log(chalk.cyan(\"\\n ── ClawVault (3-tier epistemological memory) ──\\n\"));\n console.log(chalk.white(\" KNOWN: \") + chalk.green(`${stats.known}`) + chalk.gray(\" (fresh API data, expires in ~60s)\"));\n console.log(chalk.white(\" LEARNED: \") + chalk.blue(`${stats.learned}`) + chalk.gray(\" (trade-derived patterns)\"));\n console.log(chalk.white(\" INFERRED: \") + chalk.magenta(`${stats.inferred}`) + chalk.gray(\" (correlations, held loosely)\"));\n console.log(chalk.white(\" Inbox: \") + chalk.gray(`${stats.inbox} (pending reflection)`));\n console.log(chalk.white(\" Trades: \") + chalk.gray(`${stats.trades}`));\n console.log(chalk.white(\" Lessons: \") + chalk.gray(`${stats.lessons}`));\n console.log(chalk.white(\" Win Rate: \") + chalk.green(`${(stats.tradeWinRate * 100).toFixed(1)}%`));\n console.log(chalk.white(\" Research: \") + chalk.gray(`${stats.researchGaps} open gaps`));\n\n if (query) {\n const results = vault.search(query, 5);\n console.log(chalk.cyan(`\\n ── Search: \"${query}\" ────────────────────────\\n`));\n\n if (results.length === 0) {\n console.log(chalk.gray(\" No matching entries.\\n\"));\n } else {\n for (const entry of results) {\n const tierColor = entry.tier === \"known\" ? chalk.green : entry.tier === \"learned\" ? chalk.blue : chalk.magenta;\n console.log(` ${tierColor(`[${entry.tier.toUpperCase()}]`)} ${chalk.gray(entry.content.slice(0, 80))}`);\n }\n }\n }\n\n const lessons = vault.getLessons();\n if (lessons.length > 0) {\n console.log(chalk.cyan(\"\\n ── Lessons Learned ──────────────────────────\\n\"));\n for (const lesson of lessons.slice(-5)) {\n const icon = lesson.confidenceImpact > 0 ? \"✅\" : \"⚠️\";\n const tierTag = lesson.tier === \"learned\" ? chalk.blue(\"[L]\") : chalk.magenta(\"[I]\");\n console.log(` ${icon} ${tierTag} ${chalk.white(lesson.pattern)} → ${chalk.gray(lesson.adjustment)}`);\n }\n }\n\n const gaps = vault.getResearchAgenda();\n if (gaps.length > 0) {\n console.log(chalk.cyan(\"\\n ── Research Agenda ──────────────────────────\\n\"));\n for (const gap of gaps.slice(-3)) {\n console.log(` 🔬 ${chalk.gray(gap.question)}`);\n }\n }\n\n console.log();\n });\n\n// ── nano docs ───────────────────────────────────────────────\n\nprogram\n .command(\"docs\")\n .description(\"Inspect integrated docs + extension knowledge corpus\")\n .argument(\"[query]\", \"Optional query to search docs/extensions\")\n .option(\"-l, --limit <n>\", \"Maximum search results\", \"10\")\n .option(\"--refresh\", \"Refresh the snapshot cache before reading\")\n .option(\"--json\", \"Emit machine-readable JSON\")\n .action((query, opts) => {\n try {\n const refresh = Boolean(opts.refresh);\n const limit = parsePositiveInteger(opts.limit as string | undefined, 10);\n\n const snapshot = getNanoKnowledgeSnapshot({ refresh });\n const summary = getNanoKnowledgeSummary(snapshot);\n const matches = query\n ? searchNanoKnowledge(snapshot, String(query), limit)\n : [];\n\n if (opts.json) {\n const payload = {\n summary,\n docs: snapshot.docs.areas.map((area) => ({\n area: area.area,\n path: area.path,\n files: area.files,\n markdownFiles: area.markdownFiles,\n bytes: area.bytes,\n indexedEntries: area.entries.length,\n updatedAt: area.updatedAt,\n })),\n extensions: {\n directories: snapshot.extensions.directories,\n files: snapshot.extensions.files,\n manifests: snapshot.extensions.manifests,\n indexedEntries: snapshot.extensions.entries.length,\n },\n search: query\n ? {\n query,\n limit,\n matches,\n }\n : undefined,\n };\n\n console.log(JSON.stringify(payload, null, 2));\n return;\n }\n\n console.log(chalk.cyan(\"\\n ── NanoSolana Knowledge Integration ──────────\\n\"));\n console.log(chalk.white(\" Generated: \") + chalk.gray(new Date(summary.generatedAt).toISOString()));\n console.log(chalk.white(\" Docs: \") + chalk.green(`${summary.docs.files} files`) + chalk.gray(` (${summary.docs.markdownFiles} markdown, ${formatBytes(summary.docs.bytes)})`));\n console.log(chalk.white(\" Extensions: \") + chalk.green(`${summary.extensions.directories} directories`) + chalk.gray(` (${summary.extensions.files} files, ${summary.extensions.manifests} manifests)`));\n\n console.log(chalk.cyan(\"\\n ── Docs Areas ───────────────────────────────\\n\"));\n for (const area of snapshot.docs.areas) {\n const updated = area.updatedAt\n ? new Date(area.updatedAt).toISOString()\n : \"n/a\";\n console.log(\n ` ${chalk.white(area.path.padEnd(18))} ${chalk.green(String(area.files).padStart(4))} files ${chalk.gray(`(${area.markdownFiles} md, ${formatBytes(area.bytes)}, updated ${updated})`)}`,\n );\n }\n\n if (query) {\n console.log(chalk.cyan(`\\n ── Search: \"${query}\" ───────────────────────\\n`));\n\n if (matches.length === 0) {\n console.log(chalk.gray(\" No matches found.\"));\n } else {\n for (const match of matches) {\n const typeTag = match.type === \"doc\"\n ? chalk.blue(\"[DOC]\")\n : chalk.magenta(\"[EXT]\");\n\n console.log(` ${typeTag} ${chalk.white(match.title)}`);\n console.log(` ${chalk.gray(match.path)}${match.subtitle ? chalk.gray(` — ${match.subtitle}`) : \"\"}`);\n }\n }\n }\n\n console.log();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n process.exit(1);\n }\n });\n\n// ── nanosolana go (one-shot everything) ──────────────────────\n\nprogram\n .command(\"go\")\n .description(\"One-shot: init + birth + wallet + run — everything in one command\")\n .option(\"-n, --name <name>\", \"Agent name\", \"NanoSolana\")\n .option(\"--pet-name <petName>\", \"TamaGOchi pet name\")\n .option(\"--skip-init\", \"Skip API key prompts if already configured\")\n .action(async (opts) => {\n printBanner();\n await animateLobster(1800);\n console.log();\n\n try {\n // Phase 1: Init (ensure home + check config)\n await lobsterWalk(\"Phase 1 — Initialization\");\n ensureNanoHome();\n const secrets = loadSecrets();\n const needsInit = !opts.skipInit && (!secrets.HELIUS_RPC_URL || !secrets.AI_API_KEY);\n\n if (needsInit) {\n console.log(chalk.yellow(\"\\n First run detected — let's configure your API keys.\\n\"));\n console.log(chalk.cyan(\" ── Required Keys ────────────────────────────\\n\"));\n\n if (!secrets.AI_API_KEY) {\n secrets.AI_API_KEY = await promptSecret(\"OpenRouter API Key (sk-or-v1-...)\");\n }\n if (!secrets.HELIUS_RPC_URL) {\n secrets.HELIUS_RPC_URL = await promptSecret(\"Helius RPC URL\");\n }\n if (!secrets.HELIUS_API_KEY) {\n secrets.HELIUS_API_KEY = await promptSecret(\"Helius API Key\");\n }\n\n console.log(chalk.cyan(\"\\n ── Optional Keys (press Enter to skip) ──────\\n\"));\n if (!secrets.HELIUS_WSS_URL) {\n const wss = await promptSecret(\"Helius WSS URL\");\n if (wss) secrets.HELIUS_WSS_URL = wss;\n }\n if (!secrets.BIRDEYE_API_KEY) {\n const bk = await promptSecret(\"Birdeye API Key\");\n if (bk) secrets.BIRDEYE_API_KEY = bk;\n }\n if (!secrets.JUPITER_API_KEY) {\n const jk = await promptSecret(\"Jupiter API Key\");\n if (jk) secrets.JUPITER_API_KEY = jk;\n }\n\n saveSecrets(secrets);\n console.log(chalk.green(\"\\n ✓ Secrets encrypted → ~/.nanosolana/vault.enc\\n\"));\n } else {\n console.log(chalk.green(\" ✓ Configuration found — skipping init\\n\"));\n }\n\n // Phase 2: Birth agent + wallet\n await lobsterWalk(\"Phase 2 — Birthing Agent\");\n console.log();\n await playStartupAnimation();\n\n const config = loadConfig();\n const wallet = new NanoWallet(opts.name);\n const walletInfo = await wallet.birth();\n wallet.startHeartbeat(config.agent.heartbeatMs);\n\n console.log();\n console.log(chalk.green(\" ✓ Wallet created\"));\n console.log(chalk.white(\" Public Key: \") + chalk.cyan(walletInfo.publicKey));\n console.log(chalk.white(\" Balance: \") + chalk.yellow(`${walletInfo.balance} SOL`));\n\n // Phase 3: TamaGOchi pet\n const petName = opts.petName ?? opts.name;\n const pet = new TamaGOchi(petName);\n pet.recordWalletCreated(walletInfo.balance);\n pet.startLifecycle();\n const petState = pet.getState();\n console.log(\n chalk.green(\" ✓ TamaGOchi hatched: \") +\n chalk.cyan(`${STAGE_EMOJI[petState.stage]} ${petName} ${MOOD_EMOJI[petState.mood]}`),\n );\n\n // Phase 4: Memory\n const vault = new ClawVault();\n vault.startAutonomous();\n const stats = vault.getStats();\n console.log(chalk.green(\" ✓ ClawVault online: \") + chalk.gray(`${stats.known}K/${stats.learned}L/${stats.inferred}I`));\n\n // Phase 5: Trading\n const trading = new TradingEngine(config, wallet);\n await trading.start();\n console.log(chalk.green(\" ✓ OODA trading loop active\"));\n\n // Wire events\n trading.on(\"signal\", (signal) => {\n vault.storeKnown({\n content: `Signal: ${signal.type} ${signal.symbol} (${(signal.confidence * 100).toFixed(0)}%)`,\n source: \"birdeye\",\n tags: [signal.type, signal.symbol],\n });\n });\n\n // Phase 5.5: Blockchain Scan (if Helius configured)\n if (config.helius?.rpcUrl && config.helius?.apiKey) {\n try {\n const helius = new HeliusClient({ rpcUrl: config.helius.rpcUrl, apiKey: config.helius.apiKey, wssUrl: config.helius.wssUrl });\n const snap = await helius.snapshotWallet(walletInfo.publicKey);\n printWalletSnapshot(snap, chalk);\n } catch (err) {\n console.log(chalk.gray(` ⚠️ Blockchain scan skipped: ${(err as Error).message}`));\n }\n }\n\n // Phase 5.6: Auto-register on-chain (devnet NFT)\n try {\n const skills = [\"ooda-trading\", \"solana-rpc\", \"jupiter-swaps\", \"helius-das\"];\n const regResult = await registerOnHeartbeat(wallet.getKeypair(), \"0.1.0\", skills, (msg) => console.log(msg));\n if (regResult) {\n console.log(chalk.green(` ✓ On-chain identity: ${regResult.mintAddress.slice(0, 8)}...`));\n }\n } catch (err) {\n console.log(chalk.gray(` ⚠️ Auto-registration skipped: ${(err as Error).message}`));\n }\n\n // Phase 6: Gateway\n const { MemoryEngine } = await import(\"../memory/engine.js\");\n const legacyMemory = new MemoryEngine(config.memory.temporalDecayHours);\n const gateway = new NanoGateway(config, wallet, trading, legacyMemory);\n await gateway.start();\n console.log(chalk.green(` ✓ Gateway: ws://${config.gateway.host}:${config.gateway.port}`));\n\n // Success banner\n console.log();\n console.log(chalk.hex(\"#14F195\").bold(\" ══════════════════════════════════════════════════════\"));\n console.log(chalk.hex(\"#14F195\").bold(` 🦞 ${petName} is LIVE. All systems operational.`));\n console.log(chalk.hex(\"#14F195\").bold(\" ══════════════════════════════════════════════════════\"));\n console.log();\n console.log(chalk.gray(\" Commands while running:\"));\n console.log(chalk.gray(\" Ctrl+C — graceful shutdown\"));\n console.log(chalk.gray(\" nanosolana status — check agent in another terminal\"));\n console.log(chalk.gray(\" nanosolana pet — see your TamaGOchi\"));\n console.log();\n\n // Live events\n wallet.on(\"heartbeat\", (info) => {\n const time = new Date().toLocaleTimeString();\n const mood = MOOD_EMOJI[pet.getState().mood];\n process.stdout.write(chalk.gray(` [${time}] 💓 ${info.balance.toFixed(4)} SOL ${mood}\\r`));\n });\n\n wallet.on(\"balanceChange\", ({ oldBalance, newBalance }) => {\n const delta = newBalance - oldBalance;\n const color = delta > 0 ? chalk.green : chalk.red;\n console.log(color(`\\n 💰 ${delta > 0 ? \"+\" : \"\"}${delta.toFixed(6)} SOL`));\n if (delta > 0) pet.feed(delta);\n });\n\n trading.on(\"signal\", (signal) => {\n const icon = signal.type === \"buy\" ? \"🟢\" : signal.type === \"sell\" ? \"🔴\" : \"⚪\";\n console.log(` ${icon} ${signal.type.toUpperCase()} ${signal.symbol} (${(signal.confidence * 100).toFixed(0)}%)`);\n });\n\n vault.on(\"lessonLearned\", (lesson) => {\n console.log(chalk.magenta(` 📖 ${lesson.pattern} → ${lesson.outcome}`));\n });\n\n pet.on(\"evolved\", (from, to) => {\n console.log(chalk.yellow(`\\n 🦞 EVOLUTION! ${STAGE_EMOJI[from]} → ${STAGE_EMOJI[to]} ${to}`));\n });\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log(chalk.yellow(\"\\n\\n ⏹ Shutting down...\"));\n wallet.stopHeartbeat();\n trading.stop();\n vault.stopAutonomous();\n pet.stopLifecycle();\n console.log(chalk.green(\" ✓ Agent stopped cleanly.\\n\"));\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await new Promise(() => {});\n } catch (err) {\n console.error(chalk.red(`\\n ✗ Failed: ${(err as Error).message}\\n`));\n process.exit(1);\n }\n });\n\n// ── nanosolana dvd (screensaver) ────────────────────────────\n\nprogram\n .command(\"dvd\")\n .description(\"Floating DVD-style NanoSolana screensaver in the terminal\")\n .action(() => {\n const dvd = startDvdScreensaver();\n\n process.on(\"SIGINT\", () => {\n dvd.stop();\n process.exit(0);\n });\n process.on(\"SIGTERM\", () => {\n dvd.stop();\n process.exit(0);\n });\n });\n\n// ── nanosolana lobster (show mascot) ────────────────────────\n\nprogram\n .command(\"lobster\")\n .description(\"Show the animated NanoSolana lobster mascot\")\n .option(\"--static\", \"Show static version\")\n .action(async (opts) => {\n if (opts.static) {\n printLobster();\n } else {\n await animateLobster(5000);\n }\n });\n\n// ── nanosolana scan (blockchain data reader) ────────────────────\n\nprogram\n .command(\"scan\")\n .description(\"Scan the Solana blockchain — show wallet, tokens, NFTs, and recent transactions\")\n .argument(\"[address]\", \"Wallet address to scan (default: agent wallet)\")\n .action(async (address?: string) => {\n try {\n const config = loadConfig();\n if (!config.helius?.rpcUrl || !config.helius?.apiKey) {\n console.log(chalk.red(\"\\n ❌ Helius RPC URL and API key required.\"));\n console.log(chalk.gray(\" Run: nanosolana init\\n\"));\n process.exit(1);\n }\n\n const pubkey = address ?? (() => {\n try {\n const wallet = new NanoWallet(\"NanoSolana\");\n // Try loading existing wallet pubkey from file\n const pubPath = join(homedir(), \".nanosolana\", \"wallet.pub\");\n if (existsSync(pubPath)) return readFileSync(pubPath, \"utf-8\").trim();\n return \"\";\n } catch { return \"\"; }\n })();\n\n if (!pubkey) {\n console.log(chalk.red(\"\\n ❌ No wallet found. Run: nanosolana birth\\n\"));\n process.exit(1);\n }\n\n console.log(chalk.cyan(`\\n 🔍 Scanning ${pubkey.slice(0, 8)}...${pubkey.slice(-8)}\\n`));\n\n const helius = new HeliusClient({\n rpcUrl: config.helius.rpcUrl,\n apiKey: config.helius.apiKey,\n wssUrl: config.helius.wssUrl,\n });\n\n const snap = await helius.snapshotWallet(pubkey);\n printWalletSnapshot(snap, chalk);\n } catch (err) {\n console.error(chalk.red(` ❌ Scan failed: ${(err as Error).message}\\n`));\n }\n });\n\n// ── nanosolana register (on-chain NFT identity) ─────────────────\n\nprogram\n .command(\"register\")\n .description(\"Register this agent on-chain with a devnet Metaplex NFT\")\n .action(async () => {\n try {\n const config = loadConfig();\n const wallet = new NanoWallet(\"NanoSolana\");\n await wallet.birth();\n\n const registry = new AgentRegistry();\n\n // Check if already registered\n if (registry.isRegistered()) {\n const reg = registry.loadRegistration();\n if (reg) {\n console.log(chalk.green(\"\\n ✅ Already registered on-chain!\\n\"));\n console.log(chalk.white(\" Agent: \") + chalk.cyan(reg.result.agentPubkey));\n console.log(chalk.white(\" Mint: \") + chalk.cyan(reg.result.mintAddress));\n console.log(chalk.white(\" Tx: \") + chalk.gray(reg.result.txSignature.slice(0, 20) + \"...\"));\n console.log(chalk.white(\" Network: \") + chalk.gray(reg.result.network));\n console.log(chalk.white(\" Saved: \") + chalk.gray(reg.savedAt));\n console.log();\n console.log(chalk.gray(` Explorer: https://explorer.solana.com/address/${reg.result.mintAddress}?cluster=devnet\\n`));\n return;\n }\n }\n\n console.log(chalk.cyan(\"\\n ⛓️ Registering agent on-chain (devnet)...\\n\"));\n const skills = [\"ooda-trading\", \"solana-rpc\", \"jupiter-swaps\", \"helius-das\", \"clawvault-memory\"];\n const result = await registry.registerAgent(\n wallet.getKeypair(),\n \"0.1.0\",\n skills,\n (msg) => console.log(msg),\n );\n\n console.log(chalk.green(\"\\n ✅ Agent registered on-chain!\\n\"));\n console.log(chalk.white(\" Mint: \") + chalk.cyan(result.mintAddress));\n console.log(chalk.white(\" Tx: \") + chalk.gray(result.txSignature.slice(0, 20) + \"...\"));\n console.log(chalk.white(\" Token Acct: \") + chalk.gray(result.tokenAccount));\n console.log(chalk.white(\" Network: \") + chalk.gray(result.network));\n console.log(chalk.white(\" Saved: \") + chalk.gray(\"~/.nanosolana/registry/registration.json\"));\n console.log();\n console.log(chalk.hex(\"#FFAA00\")(` Explorer: https://explorer.solana.com/tx/${result.txSignature}?cluster=devnet\\n`));\n } catch (err) {\n console.error(chalk.red(` ❌ Registration failed: ${(err as Error).message}\\n`));\n }\n });\n\n// ── nanosolana registry (show registration status) ──────────────\n\nprogram\n .command(\"registry\")\n .description(\"Show on-chain agent registration status\")\n .action(() => {\n const registry = new AgentRegistry();\n const reg = registry.loadRegistration();\n\n if (!reg) {\n console.log(chalk.hex(\"#FFAA00\")(\"\\n ⚠️ No registration found. Run: nanosolana register\\n\"));\n return;\n }\n\n console.log(chalk.hex(\"#14F195\")(\"\\n ⛓️ Agent On-Chain Identity\\n\"));\n console.log(chalk.white(\" Agent: \") + chalk.cyan(reg.result.agentPubkey));\n console.log(chalk.white(\" Mint: \") + chalk.cyan(reg.result.mintAddress));\n console.log(chalk.white(\" Tx: \") + chalk.gray(reg.result.txSignature.slice(0, 20) + \"...\"));\n console.log(chalk.white(\" Network: \") + chalk.gray(reg.result.network));\n console.log(chalk.white(\" Token Acct: \") + chalk.gray(reg.result.tokenAccount));\n console.log(chalk.white(\" Registered: \") + chalk.gray(reg.savedAt));\n console.log(chalk.white(\" Name: \") + chalk.gray(reg.metadata.name));\n console.log(chalk.white(\" Skills: \") + chalk.gray(reg.metadata.skills.join(\", \")));\n console.log(chalk.white(\" Fingerprint:\") + chalk.gray(reg.metadata.fingerprint.slice(0, 16) + \"...\"));\n console.log();\n console.log(chalk.gray(` Explorer: https://explorer.solana.com/address/${reg.result.mintAddress}?cluster=devnet\\n`));\n });\n\n// ── nanosolana nanobot (interactive UI) ──────────────────────────\n\nprogram\n .command(\"nanobot\")\n .description(\"Launch the interactive NanoBot web UI (localhost companion)\")\n .option(\"-p, --port <port>\", \"Port number\", \"7777\")\n .action(async (opts) => {\n const port = parseInt(opts.port, 10) || 7777;\n console.log(chalk.hex(\"#14F195\")(`\\n 🤖 Starting NanoBot on http://127.0.0.1:${port}\\n`));\n\n const server = new NanoBotServer({ port });\n await server.start();\n\n // Keep alive\n await new Promise(() => {});\n });\n\n// ── Parse & Run ────────────────────────────────────────────────\n\nprogram.parse();\n","/**\n * NanoSolana Terminal Animations\n *\n * Uses `unicode-animations` for braille spinners + custom lobster frames,\n * DVD bouncing logo, and a full startup animation pipeline.\n */\n\nimport chalk from \"chalk\";\nimport spinners from \"unicode-animations\";\n\n// ── Spinner Helper (using unicode-animations) ────────────────\n\nexport function createSpinner(msg: string, name: keyof typeof spinners = \"braille\") {\n const { frames, interval } = spinners[name];\n let i = 0;\n let text = msg;\n const timer = setInterval(() => {\n process.stdout.write(\n `\\r\\x1B[2K ${chalk.cyan(frames[i++ % frames.length])} ${chalk.white(text)}`,\n );\n }, interval);\n\n return {\n update(newMsg: string) {\n text = newMsg;\n },\n stop(doneMsg: string) {\n clearInterval(timer);\n process.stdout.write(`\\r\\x1B[2K ${chalk.green(\"✓\")} ${chalk.white(doneMsg)}\\n`);\n },\n fail(errMsg: string) {\n clearInterval(timer);\n process.stdout.write(`\\r\\x1B[2K ${chalk.red(\"✗\")} ${chalk.red(errMsg)}\\n`);\n },\n };\n}\n\nexport async function runWithSpinner<T>(\n label: string,\n fn: () => Promise<T>,\n name: keyof typeof spinners = \"braille\",\n): Promise<T> {\n const s = createSpinner(label, name);\n try {\n const result = await fn();\n s.stop(label);\n return result;\n } catch (err) {\n s.fail(`${label} — ${(err as Error).message}`);\n throw err;\n }\n}\n\n// ── Unicode Lobster Frames ──────────────────────────────────\n\nconst LOBSTER_FRAMES = [\n [\n \" ╱╲ ╱╲ \",\n \" ╱ ╲──╱ ╲ \",\n \" │ ◉ ◉ │ \",\n \" │ ╲╱ │ \",\n \" ╲ │││ ╱ \",\n \" ╲═╧╧═╱ \",\n \" ╱╱╱ ╲╲╲ \",\n \" ╱╱╱ ╲╲╲ \",\n ],\n [\n \" ╱╲ ╱╲ \",\n \" ╱ ╲────╱ ╲ \",\n \" │ ● ● │ \",\n \" │ ── │ \",\n \" ╲ │││ ╱ \",\n \" ╲═╧╧═╱ \",\n \" ╱╱╱╱ ╲╲╲╲ \",\n \" ╱╱╱╱ ╲╲╲╲ \",\n ],\n [\n \" ╱╲ ╱╲ \",\n \" ╱ ╲──╱ ╲ \",\n \" │ ◉ ◉ │ \",\n \" │ ╱╲ │ \",\n \" ╲ │││ ╱ \",\n \" ╲═╧╧═╱ \",\n \" ╱╱╲╲ \",\n \" ╱╱ ╲╲ \",\n ],\n [\n \" ╱╲ ╱╲ \",\n \" ╱ ╲╱ ╲ \",\n \" │ ◉ ◉ │ \",\n \" │ ╲╱ │ \",\n \" ╲ │││ ╱ \",\n \" ╲╧╧╧╱ \",\n \" ╱╱╱ ╲╲╲ \",\n \" ╱╱╱ ╲╲╲ \",\n ],\n];\n\nconst LOBSTER_BIG = `\n ╱▔╲ ╱▔╲\n ╱╱ ╲─────╱ ╲╲\n ││ ◉ │ │ ◉ ││\n ││ ╰─┬─┬─╯ ││\n ╲╲ ╱│█│╲ ╱╱\n ╲╲ ╱█│█│█╲ ╱╱\n ╰╱██│█│██╲╯\n ╱╱╱ │█│ ╲╲╲\n ╱╱╱ │█│ ╲╲╲\n ╱╱ ╱███╲ ╲╲\n`;\n\n// ── Animated Lobster (frame-based) ──────────────────────────\n\nexport function animateLobster(durationMs = 2400): Promise<void> {\n return new Promise((resolve) => {\n const frameCount = LOBSTER_FRAMES.length;\n const frameH = LOBSTER_FRAMES[0].length + 1;\n let frame = 0;\n\n // Reserve space\n process.stdout.write(\"\\n\".repeat(frameH));\n\n const interval = setInterval(() => {\n // Move cursor up\n process.stdout.write(`\\x1B[${frameH}A`);\n // Draw frame\n const f = LOBSTER_FRAMES[frame % frameCount];\n const color = frame % 2 === 0 ? chalk.green : chalk.hex(\"#14F195\");\n for (const line of f) {\n process.stdout.write(`\\x1B[2K ${color(line)}\\n`);\n }\n process.stdout.write(`\\x1B[2K ${chalk.cyan(\" 🦞 NanoSolana\")}\\n`);\n frame++;\n }, 200);\n\n setTimeout(() => {\n clearInterval(interval);\n resolve();\n }, durationMs);\n });\n}\n\n// ── DVD Bouncing Logo ──────────────────────────────────────\n\nconst DVD_LOGO = [\n \"╔═════════════════════════╗\",\n \"║ 🦞 NanoSolana 🦞 ║\",\n \"║ ══════════════════ ║\",\n \"║ Solana Trading Agent ║\",\n \"║ nanosolana.com ║\",\n \"╚═════════════════════════╝\",\n];\n\nconst DVD_COLORS = [\n chalk.hex(\"#14F195\"),\n chalk.hex(\"#9945FF\"),\n chalk.cyan,\n chalk.magenta,\n chalk.yellow,\n chalk.green,\n chalk.blue,\n chalk.red,\n];\n\nexport function startDvdScreensaver(): { stop: () => void } {\n const logoWidth = 27;\n const logoHeight = DVD_LOGO.length;\n let cols = process.stdout.columns || 80;\n let rows = process.stdout.rows || 24;\n\n let x = Math.floor(Math.random() * Math.max(1, cols - logoWidth));\n let y = Math.floor(Math.random() * Math.max(1, rows - logoHeight - 2));\n let dx = 1;\n let dy = 1;\n let colorIdx = 0;\n let hits = 0;\n\n // Hide cursor + clear\n process.stdout.write(\"\\x1B[?25l\\x1B[2J\");\n\n const interval = setInterval(() => {\n cols = process.stdout.columns || 80;\n rows = process.stdout.rows || 24;\n\n // Clear previous\n for (let i = 0; i < logoHeight; i++) {\n process.stdout.write(`\\x1B[${y + i + 1};1H\\x1B[2K`);\n }\n\n // Move\n x += dx;\n y += dy;\n\n // Bounce\n if (x <= 0 || x + logoWidth >= cols) {\n dx *= -1;\n colorIdx = (colorIdx + 1) % DVD_COLORS.length;\n hits++;\n }\n if (y <= 0 || y + logoHeight >= rows - 1) {\n dy *= -1;\n colorIdx = (colorIdx + 1) % DVD_COLORS.length;\n hits++;\n }\n\n x = Math.max(0, Math.min(x, cols - logoWidth));\n y = Math.max(0, Math.min(y, rows - logoHeight - 1));\n\n // Draw\n const color = DVD_COLORS[colorIdx];\n for (let i = 0; i < logoHeight; i++) {\n process.stdout.write(`\\x1B[${y + i + 1};${x + 1}H`);\n process.stdout.write(color(DVD_LOGO[i]));\n }\n\n // Status bar\n process.stdout.write(`\\x1B[${rows};1H`);\n process.stdout.write(\n chalk.bgHex(\"#0a0a1a\").hex(\"#14F195\")(\n ` 🦞 NanoSolana DVD | Bounces: ${hits} | ${new Date().toLocaleTimeString()} | Ctrl+C to exit `.padEnd(\n cols,\n ),\n ),\n );\n }, 60);\n\n const stop = () => {\n clearInterval(interval);\n process.stdout.write(\"\\x1B[?25h\\x1B[2J\\x1B[H\");\n };\n\n return { stop };\n}\n\n// ── Full Startup Animation Pipeline ─────────────────────────\n\ninterface StartupStep {\n label: string;\n spinner: keyof typeof spinners;\n durationMs: number;\n}\n\nconst STARTUP_STEPS: StartupStep[] = [\n { label: \"Generating Ed25519 keypair...\", spinner: \"helix\", durationMs: 400 },\n { label: \"Deriving Solana wallet address...\", spinner: \"dna\", durationMs: 300 },\n { label: \"Encrypting private key (AES-256-GCM)...\", spinner: \"cascade\", durationMs: 500 },\n { label: \"Requesting devnet airdrop...\", spinner: \"orbit\", durationMs: 700 },\n { label: \"Minting Birth Certificate NFT (Metaplex)...\", spinner: \"scan\", durationMs: 600 },\n { label: \"Initializing ClawVault memory engine...\", spinner: \"rain\", durationMs: 400 },\n { label: \"Hatching TamaGOchi pet 🥚...\", spinner: \"breathe\", durationMs: 500 },\n { label: \"Calibrating RSI + EMA + ATR strategy...\", spinner: \"columns\", durationMs: 400 },\n { label: \"Starting OODA trading loop...\", spinner: \"snake\", durationMs: 300 },\n { label: \"Connecting gateway (HMAC-SHA256)...\", spinner: \"braille\", durationMs: 400 },\n];\n\nexport async function playStartupAnimation(): Promise<void> {\n for (const step of STARTUP_STEPS) {\n await runWithSpinner(step.label, () => sleep(step.durationMs), step.spinner);\n }\n}\n\n// ── Lobster Walk ────────────────────────────────────────────\n\nexport async function lobsterWalk(message: string): Promise<void> {\n const cols = process.stdout.columns || 80;\n const walkLen = Math.min(cols - 20, 35);\n const { frames, interval } = spinners.braille;\n let fi = 0;\n\n for (let i = 0; i < walkLen; i++) {\n const pad = \" \".repeat(i);\n const dots = chalk.hex(\"#14F195\")(\"·\".repeat(Math.min(i, 6)));\n const spin = chalk.cyan(frames[fi++ % frames.length]);\n process.stdout.write(`\\r\\x1B[2K ${pad}${dots} ${spin} 🦞`);\n await sleep(interval);\n }\n process.stdout.write(`\\r\\x1B[2K`);\n console.log(chalk.hex(\"#14F195\")(` 🦞 ${message}`));\n}\n\n// ── Print Static Lobster ────────────────────────────────────\n\nexport function printLobster(): void {\n const lines = LOBSTER_BIG.split(\"\\n\");\n for (const line of lines) {\n console.log(chalk.green(` ${line}`));\n }\n}\n\n// ── Status Bar ──────────────────────────────────────────────\n\nexport function updateStatusBar(info: {\n balance: number;\n mood: string;\n stage: string;\n petName: string;\n signals: number;\n uptime: number;\n}): void {\n const cols = process.stdout.columns || 80;\n const uptimeStr = formatUptime(info.uptime);\n const bar =\n ` 🦞 ${info.petName} ${info.stage}${info.mood} │ ` +\n `${info.balance.toFixed(4)} SOL │ ` +\n `${info.signals} signals │ ` +\n `⏱ ${uptimeStr}`;\n\n process.stdout.write(\"\\x1B7\");\n const rows = process.stdout.rows || 24;\n process.stdout.write(`\\x1B[${rows};1H`);\n process.stdout.write(chalk.bgHex(\"#0a0a1a\").hex(\"#14F195\")(bar.padEnd(cols)));\n process.stdout.write(\"\\x1B8\");\n}\n\n// ── Utility ─────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction formatUptime(ms: number): string {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}h${m % 60}m`;\n if (m > 0) return `${m}m${s % 60}s`;\n return `${s}s`;\n}\n","/**\n * NanoSolana Helius Client — Full Blockchain Data Reader\n *\n * Wraps every Helius API for instant blockchain intelligence at birth:\n * - DAS API (getAsset, getAssetsByOwner, searchAssets)\n * - Enhanced Transactions (parsed tx history)\n * - getTransactionsForAddress (Helius-exclusive, filtered history)\n * - Priority Fees\n * - Health / Version\n * - Token balances + SOL balance\n * - Trending token discovery\n *\n * Designed to be initialized with just an RPC URL + API key and\n * immediately display a rich \"blockchain scan\" on agent birth.\n */\n\nimport { Connection, PublicKey, LAMPORTS_PER_SOL } from \"@solana/web3.js\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface HeliusConfig {\n rpcUrl: string;\n apiKey: string;\n wssUrl?: string;\n}\n\nexport interface DASAsset {\n id: string;\n content?: {\n metadata?: { name?: string; symbol?: string; description?: string };\n json_uri?: string;\n };\n ownership?: { owner?: string };\n compression?: { compressed?: boolean };\n token_info?: {\n symbol?: string;\n balance?: number;\n decimals?: number;\n supply?: number;\n price_info?: { price_per_token?: number; total_price?: number; currency?: string };\n };\n grouping?: Array<{ group_key?: string; group_value?: string }>;\n interface?: string;\n}\n\nexport interface DASSearchResult {\n total: number;\n limit: number;\n page: number;\n items: DASAsset[];\n nativeBalance?: { lamports: number; sol: number; total_price?: number };\n}\n\nexport interface EnhancedTx {\n signature: string;\n type: string;\n description: string;\n source: string;\n fee: number;\n timestamp: number;\n nativeTransfers: Array<{ fromUserAccount: string; toUserAccount: string; amount: number }>;\n tokenTransfers: Array<{ fromUserAccount: string; toUserAccount: string; mint: string; tokenAmount: number }>;\n}\n\nexport interface HealthStatus {\n healthy: boolean;\n slot: number;\n blockHeight: number;\n version: string;\n latencyMs: number;\n}\n\nexport interface PriorityFees {\n min: number;\n low: number;\n medium: number;\n high: number;\n max: number;\n}\n\nexport interface WalletSnapshot {\n address: string;\n solBalance: number;\n solLamports: number;\n solPrice?: number;\n totalValueUsd?: number;\n tokens: Array<{\n symbol: string;\n name: string;\n mint: string;\n balance: number;\n decimals: number;\n pricePerToken?: number;\n totalPrice?: number;\n }>;\n nfts: Array<{\n name: string;\n mint: string;\n collection?: string;\n compressed: boolean;\n }>;\n recentTransactions: EnhancedTx[];\n health: HealthStatus;\n scanTimestamp: string;\n}\n\n// ── Helius Client ────────────────────────────────────────────────────\n\nexport class HeliusClient {\n private connection: Connection;\n private rpcUrl: string;\n private apiKey: string;\n\n constructor(config: HeliusConfig) {\n if (!config.rpcUrl) throw new Error(\"Helius RPC URL required — get one at https://helius.dev\");\n if (!config.apiKey) throw new Error(\"Helius API key required — get one at https://helius.dev\");\n\n this.rpcUrl = config.rpcUrl;\n this.apiKey = config.apiKey;\n this.connection = new Connection(config.rpcUrl, {\n commitment: \"confirmed\",\n wsEndpoint: config.wssUrl || undefined,\n });\n }\n\n // ── DAS API ──────────────────────────────────────────────────\n\n /** Get a single asset by its mint/ID */\n async getAsset(id: string): Promise<DASAsset | null> {\n try {\n const result = await this.rpc(\"getAsset\", { id });\n return result as DASAsset;\n } catch {\n return null;\n }\n }\n\n /** Get all assets owned by a wallet (NFTs + tokens) */\n async getAssetsByOwner(\n owner: string,\n opts?: { page?: number; limit?: number; showFungible?: boolean; showNativeBalance?: boolean },\n ): Promise<DASSearchResult> {\n const result = await this.rpc(\"getAssetsByOwner\", {\n ownerAddress: owner,\n page: opts?.page ?? 1,\n limit: opts?.limit ?? 100,\n displayOptions: {\n showFungible: opts?.showFungible ?? true,\n showNativeBalance: opts?.showNativeBalance ?? true,\n showInscription: false,\n },\n });\n return result as DASSearchResult;\n }\n\n /** Search assets with flexible criteria */\n async searchAssets(params: {\n ownerAddress?: string;\n tokenType?: \"fungible\" | \"nonFungible\" | \"regularNft\" | \"compressedNft\" | \"all\";\n grouping?: [string, string];\n compressed?: boolean;\n page?: number;\n limit?: number;\n }): Promise<DASSearchResult> {\n const result = await this.rpc(\"searchAssets\", {\n ...params,\n page: params.page ?? 1,\n limit: params.limit ?? 50,\n });\n return result as DASSearchResult;\n }\n\n /** Get assets in a collection */\n async getAssetsByCollection(collectionAddress: string, opts?: { page?: number; limit?: number }): Promise<DASSearchResult> {\n const result = await this.rpc(\"getAssetsByGroup\", {\n groupKey: \"collection\",\n groupValue: collectionAddress,\n page: opts?.page ?? 1,\n limit: opts?.limit ?? 100,\n });\n return result as DASSearchResult;\n }\n\n /** Get assets by creator */\n async getAssetsByCreator(creatorAddress: string, opts?: { page?: number; limit?: number; onlyVerified?: boolean }): Promise<DASSearchResult> {\n const result = await this.rpc(\"getAssetsByCreator\", {\n creatorAddress,\n onlyVerified: opts?.onlyVerified ?? true,\n page: opts?.page ?? 1,\n limit: opts?.limit ?? 100,\n });\n return result as DASSearchResult;\n }\n\n // ── Enhanced Transactions ────────────────────────────────────\n\n /** Get parsed transaction history via Helius Enhanced API */\n async getEnhancedTransactions(address: string, limit = 10): Promise<EnhancedTx[]> {\n const url = `https://api.helius.xyz/v0/addresses/${address}/transactions?api-key=${this.apiKey}&limit=${limit}`;\n const resp = await fetch(url, { signal: AbortSignal.timeout(15000) });\n if (!resp.ok) {\n const body = await resp.text();\n throw new Error(`Helius Enhanced API ${resp.status}: ${body.slice(0, 200)}`);\n }\n return (await resp.json()) as EnhancedTx[];\n }\n\n // ── getTransactionsForAddress (Helius Exclusive) ─────────────\n\n /** Helius-exclusive: get full transaction history with filters */\n async getTransactionsForAddress(\n address: string,\n opts?: {\n transactionDetails?: \"signatures\" | \"full\";\n sortOrder?: \"asc\" | \"desc\";\n limit?: number;\n paginationToken?: string;\n filters?: {\n blockTime?: { gte?: number; lte?: number; gt?: number; lt?: number };\n status?: \"succeeded\" | \"failed\" | \"any\";\n tokenAccounts?: \"none\" | \"balanceChanged\" | \"all\";\n slot?: { gte?: number; lte?: number };\n };\n },\n ): Promise<{ data: any[]; paginationToken?: string }> {\n const params: any[] = [\n address,\n {\n transactionDetails: opts?.transactionDetails ?? \"signatures\",\n sortOrder: opts?.sortOrder ?? \"desc\",\n limit: opts?.limit ?? 100,\n ...(opts?.paginationToken && { paginationToken: opts.paginationToken }),\n ...(opts?.filters && { filters: opts.filters }),\n },\n ];\n\n const result = await this.rpcRaw(\"getTransactionsForAddress\", params);\n return result as { data: any[]; paginationToken?: string };\n }\n\n // ── Balances ─────────────────────────────────────────────────\n\n /** Get SOL balance */\n async getSOLBalance(pubkey: string): Promise<{ lamports: number; sol: number }> {\n const lamports = await this.connection.getBalance(new PublicKey(pubkey));\n return { lamports, sol: lamports / LAMPORTS_PER_SOL };\n }\n\n // ── Priority Fees ────────────────────────────────────────────\n\n async getPriorityFees(): Promise<PriorityFees> {\n const result = await this.rpcRaw(\"getPriorityFeeEstimate\", [\n { options: { includeAllPriorityFeeLevels: true } },\n ]);\n return (result as any)?.priorityFeeLevels ?? { min: 0, low: 0, medium: 0, high: 0, max: 0 };\n }\n\n // ── Health Check ─────────────────────────────────────────────\n\n async checkHealth(): Promise<HealthStatus> {\n const start = Date.now();\n try {\n const [version, slot, height] = await Promise.all([\n this.connection.getVersion(),\n this.connection.getSlot(),\n this.connection.getBlockHeight(),\n ]);\n return {\n healthy: true,\n slot,\n blockHeight: height,\n version: version[\"solana-core\"] ?? \"unknown\",\n latencyMs: Date.now() - start,\n };\n } catch {\n return { healthy: false, slot: 0, blockHeight: 0, version: \"unreachable\", latencyMs: Date.now() - start };\n }\n }\n\n // ── Full Wallet Snapshot (used at birth) ─────────────────────\n\n /**\n * Performs a complete \"blockchain scan\" of a wallet.\n * Returns SOL balance, all tokens with prices, NFTs, recent tx, and health.\n * This is the \"cool\" instant read the agent gets at birth.\n */\n async snapshotWallet(address: string): Promise<WalletSnapshot> {\n const [health, solBal, dasResult, recentTx] = await Promise.allSettled([\n this.checkHealth(),\n this.getSOLBalance(address),\n this.getAssetsByOwner(address, { showFungible: true, showNativeBalance: true, limit: 100 }),\n this.getEnhancedTransactions(address, 5).catch(() => [] as EnhancedTx[]),\n ]);\n\n const healthVal = health.status === \"fulfilled\" ? health.value : { healthy: false, slot: 0, blockHeight: 0, version: \"unknown\", latencyMs: 0 };\n const solVal = solBal.status === \"fulfilled\" ? solBal.value : { lamports: 0, sol: 0 };\n const dasVal = dasResult.status === \"fulfilled\" ? dasResult.value : { total: 0, limit: 0, page: 1, items: [] };\n const txVal = recentTx.status === \"fulfilled\" ? recentTx.value : [];\n\n // Parse DAS items into tokens and NFTs\n const tokens: WalletSnapshot[\"tokens\"] = [];\n const nfts: WalletSnapshot[\"nfts\"] = [];\n\n for (const item of dasVal.items ?? []) {\n const tokenInfo = item.token_info;\n const meta = item.content?.metadata;\n\n if (tokenInfo && tokenInfo.decimals !== undefined && tokenInfo.decimals > 0) {\n // Fungible token\n tokens.push({\n symbol: tokenInfo.symbol ?? meta?.symbol ?? \"???\",\n name: meta?.name ?? tokenInfo.symbol ?? \"Unknown\",\n mint: item.id,\n balance: tokenInfo.balance\n ? tokenInfo.balance / Math.pow(10, tokenInfo.decimals)\n : 0,\n decimals: tokenInfo.decimals,\n pricePerToken: tokenInfo.price_info?.price_per_token,\n totalPrice: tokenInfo.price_info?.total_price,\n });\n } else if (item.interface === \"V1_NFT\" || item.interface === \"ProgrammableNFT\" || item.compression?.compressed) {\n // NFT\n nfts.push({\n name: meta?.name ?? \"Unnamed NFT\",\n mint: item.id,\n collection: item.grouping?.find((g) => g.group_key === \"collection\")?.group_value,\n compressed: item.compression?.compressed ?? false,\n });\n }\n }\n\n // Sort tokens by total price descending\n tokens.sort((a, b) => (b.totalPrice ?? 0) - (a.totalPrice ?? 0));\n\n const totalValueUsd = tokens.reduce((sum, t) => sum + (t.totalPrice ?? 0), 0);\n\n return {\n address,\n solBalance: solVal.sol,\n solLamports: solVal.lamports,\n solPrice: (dasVal as any).nativeBalance?.total_price,\n totalValueUsd,\n tokens,\n nfts,\n recentTransactions: txVal as EnhancedTx[],\n health: healthVal,\n scanTimestamp: new Date().toISOString(),\n };\n }\n\n // ── Internals ────────────────────────────────────────────────\n\n /** DAS RPC call (params as object) */\n private async rpc(method: string, params: Record<string, any>): Promise<unknown> {\n const resp = await fetch(this.rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: `nano-${method}`, method, params }),\n signal: AbortSignal.timeout(15000),\n });\n if (!resp.ok) throw new Error(`Helius RPC ${resp.status}`);\n const json = (await resp.json()) as any;\n if (json.error) throw new Error(json.error.message ?? JSON.stringify(json.error));\n return json.result;\n }\n\n /** Raw RPC call (params as array) */\n private async rpcRaw(method: string, params: any[]): Promise<unknown> {\n const resp = await fetch(this.rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: `nano-${method}`, method, params }),\n signal: AbortSignal.timeout(15000),\n });\n if (!resp.ok) throw new Error(`Helius RPC ${resp.status}`);\n const json = (await resp.json()) as any;\n if (json.error) throw new Error(json.error.message ?? JSON.stringify(json.error));\n return json.result;\n }\n}\n\n// ── Pretty Printer ───────────────────────────────────────────────────\n\n/**\n * Print a wallet snapshot in a visually stunning CLI format.\n * Called immediately after birth when Helius keys are available.\n */\nexport function printWalletSnapshot(snap: WalletSnapshot, chalk: any): void {\n const g = chalk.hex(\"#14F195\");\n const p = chalk.hex(\"#9945FF\");\n const a = chalk.hex(\"#FFAA00\");\n const d = chalk.gray;\n const w = chalk.white;\n\n console.log();\n console.log(g.bold(\" ⛓️ ── Blockchain Scan ────────────────────────────────────\"));\n console.log();\n\n // Health\n const hIcon = snap.health.healthy ? g(\"●\") : chalk.red(\"●\");\n console.log(` ${hIcon} ${w(\"Solana\")} ${d(`v${snap.health.version}`)} ${d(`| slot ${snap.health.slot.toLocaleString()}`)} ${d(`| ${snap.health.latencyMs}ms`)}`);\n console.log();\n\n // SOL Balance\n const solUsd = snap.solPrice ? ` ($${snap.solPrice.toFixed(2)})` : \"\";\n console.log(` ${a(\"◎\")} ${w(\"SOL Balance:\")} ${a(`${snap.solBalance.toFixed(9)} SOL`)}${d(solUsd)}`);\n\n // Tokens\n if (snap.tokens.length > 0) {\n console.log();\n console.log(p(\" ── Tokens ──────────────────────────────────────────────\"));\n for (const t of snap.tokens.slice(0, 10)) {\n const price = t.totalPrice ? ` ($${t.totalPrice.toFixed(2)})` : \"\";\n const perToken = t.pricePerToken ? d(` @ $${t.pricePerToken.toFixed(4)}`) : \"\";\n console.log(` ${g(\"•\")} ${w(t.symbol.padEnd(10))} ${a(t.balance.toFixed(4).padStart(16))}${perToken}${d(price)}`);\n }\n if (snap.tokens.length > 10) {\n console.log(d(` ... and ${snap.tokens.length - 10} more tokens`));\n }\n if ((snap.totalValueUsd ?? 0) > 0) {\n console.log(d(` Total token value: $${(snap.totalValueUsd ?? 0).toFixed(2)}`));\n }\n } else {\n console.log(d(\" No SPL tokens found\"));\n }\n\n // NFTs\n if (snap.nfts.length > 0) {\n console.log();\n console.log(p(\" ── NFTs ────────────────────────────────────────────────\"));\n for (const n of snap.nfts.slice(0, 5)) {\n const tag = n.compressed ? d(\" [cNFT]\") : \"\";\n const col = n.collection ? d(` | ${n.collection.slice(0, 8)}...`) : \"\";\n console.log(` ${g(\"◆\")} ${w(n.name.slice(0, 40))}${tag}${col}`);\n }\n if (snap.nfts.length > 5) {\n console.log(d(` ... and ${snap.nfts.length - 5} more NFTs`));\n }\n }\n\n // Recent Transactions\n if (snap.recentTransactions.length > 0) {\n console.log();\n console.log(p(\" ── Recent Transactions ─────────────────────────────────\"));\n for (const tx of snap.recentTransactions.slice(0, 5)) {\n const time = tx.timestamp ? new Date(tx.timestamp * 1000).toLocaleString() : \"unknown\";\n const desc = tx.description ? tx.description.slice(0, 60) : tx.type;\n const sig = tx.signature.slice(0, 12) + \"...\";\n console.log(` ${g(\"→\")} ${d(sig)} ${w(desc)}`);\n console.log(` ${d(time)} | ${d(tx.source)} | fee: ${d(tx.fee + \" lamports\")}`);\n }\n }\n\n console.log();\n console.log(d(` Scanned at ${snap.scanTimestamp}`));\n console.log(g.bold(\" ────────────────────────────────────────────────────────\"));\n console.log();\n}\n","/**\n * NanoSolana Agent On-Chain Registry via Metaplex Token Metadata.\n *\n * Mints a gasless devnet NFT that serves as the agent's on-chain identity.\n * The NFT contains:\n * - Agent public key\n * - NanoSolana version\n * - Registered capabilities (skills)\n * - Fingerprint (SHA-256 of pubkey + version + skills)\n * - Timestamp\n *\n * Uses Solana devnet for zero-cost registration. Agents verify each\n * other's on-chain identity by checking NFT metadata.\n *\n * TypeScript port of pkg/onchain/registry.go\n */\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n LAMPORTS_PER_SOL,\n sendAndConfirmTransaction,\n} from \"@solana/web3.js\";\nimport {\n createMint,\n getOrCreateAssociatedTokenAccount,\n mintTo,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { createHash } from \"node:crypto\";\nimport { writeFileSync, readFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\n// ── Well-Known Program IDs ───────────────────────────────────────────\n\n/** Metaplex Token Metadata Program */\nexport const TOKEN_METADATA_PROGRAM_ID = new PublicKey(\n \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\",\n);\n\n/** Devnet RPC endpoint */\nconst DEVNET_RPC = \"https://api.devnet.solana.com\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface AgentMetadata {\n name: string;\n symbol: string;\n description: string;\n image: string;\n agentPubkey: string;\n version: string;\n skills: string[];\n registeredAt: string;\n fingerprint: string;\n}\n\nexport interface RegistrationResult {\n mintAddress: string;\n txSignature: string;\n metadataUri: string;\n network: string;\n agentPubkey: string;\n tokenAccount: string;\n}\n\ninterface LocalRegistration {\n result: RegistrationResult;\n metadata: AgentMetadata;\n savedAt: string;\n}\n\n// ── Agent Registry ───────────────────────────────────────────────────\n\nexport class AgentRegistry {\n private connection: Connection;\n private registryDir: string;\n\n constructor(rpcUrl?: string) {\n this.connection = new Connection(rpcUrl || DEVNET_RPC, \"confirmed\");\n this.registryDir = join(homedir(), \".nanosolana\", \"registry\");\n mkdirSync(this.registryDir, { recursive: true });\n }\n\n /**\n * Register an agent on-chain by minting a devnet NFT.\n *\n * Steps:\n * 1. Connect to devnet RPC\n * 2. Airdrop SOL if needed (devnet is free)\n * 3. Create SPL mint (supply = 1 → NFT)\n * 4. Create associated token account\n * 5. Mint exactly 1 token\n * 6. Save registration locally\n */\n async registerAgent(\n agentKeypair: Keypair,\n version: string,\n skills: string[],\n logFn: (msg: string) => void = console.log,\n ): Promise<RegistrationResult> {\n const agentPubkey = agentKeypair.publicKey;\n\n // Step 1: Check balance, airdrop if needed\n logFn(\" ☁️ Checking devnet balance...\");\n const balance = await this.connection.getBalance(agentPubkey);\n\n if (balance < 10_000_000) {\n // < 0.01 SOL\n logFn(` ☁️ Requesting devnet airdrop for ${agentPubkey.toBase58().slice(0, 8)}...`);\n const sig = await this.connection.requestAirdrop(agentPubkey, LAMPORTS_PER_SOL);\n await this.connection.confirmTransaction(sig, \"confirmed\");\n logFn(` ✅ Airdrop confirmed: ${sig.slice(0, 16)}...`);\n\n // Brief wait for finalization\n await sleep(2000);\n }\n\n // Step 2: Build fingerprint\n const fingerprint = agentFingerprint(agentPubkey.toBase58(), version, skills);\n\n // Step 3: Build metadata\n const metadata: AgentMetadata = {\n name: `NanoSolana Agent #${agentPubkey.toBase58().slice(0, 6)}`,\n symbol: \"NANO\",\n description: `NanoSolana autonomous trading agent. Version ${version}. Fingerprint: ${fingerprint.slice(0, 12)}`,\n image: \"https://nanosolana.com/agent-nft.png\",\n agentPubkey: agentPubkey.toBase58(),\n version,\n skills,\n registeredAt: new Date().toISOString(),\n fingerprint,\n };\n\n // Step 4: Create mint (decimals = 0, supply = 1 → NFT)\n logFn(\" ⛓️ Creating SPL mint (NFT)...\");\n const mint = await createMint(\n this.connection,\n agentKeypair, // payer\n agentPubkey, // mint authority\n null, // freeze authority (none)\n 0, // decimals = 0 → NFT\n );\n\n // Step 5: Create associated token account\n logFn(\" 📬 Creating token account...\");\n const tokenAccount = await getOrCreateAssociatedTokenAccount(\n this.connection,\n agentKeypair, // payer\n mint, // mint\n agentPubkey, // owner\n );\n\n // Step 6: Mint exactly 1 token (making it an NFT)\n logFn(\" 🖨️ Minting 1 NFT...\");\n const mintTxSig = await mintTo(\n this.connection,\n agentKeypair, // payer\n mint, // mint\n tokenAccount.address, // destination\n agentPubkey, // authority\n 1, // amount = 1\n );\n\n logFn(` ✅ NFT minted: ${mintTxSig.slice(0, 16)}...`);\n\n const result: RegistrationResult = {\n mintAddress: mint.toBase58(),\n txSignature: mintTxSig,\n metadataUri: \"\", // Would point to Arweave/IPFS in production\n network: \"devnet\",\n agentPubkey: agentPubkey.toBase58(),\n tokenAccount: tokenAccount.address.toBase58(),\n };\n\n // Step 7: Save registration locally\n this.saveRegistration(result, metadata);\n\n // Step 8: Save metadata JSON for future Metaplex upload\n const metadataPath = join(this.registryDir, \"metadata.json\");\n writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), { mode: 0o644 });\n\n return result;\n }\n\n /**\n * Check if agent is already registered.\n */\n isRegistered(): boolean {\n return existsSync(join(this.registryDir, \"registration.json\"));\n }\n\n /**\n * Load existing registration.\n */\n loadRegistration(): LocalRegistration | null {\n const path = join(this.registryDir, \"registration.json\");\n if (!existsSync(path)) return null;\n\n try {\n const data = readFileSync(path, \"utf-8\");\n return JSON.parse(data) as LocalRegistration;\n } catch {\n return null;\n }\n }\n\n /**\n * Get the Solana explorer URL for the agent's NFT.\n */\n getExplorerUrl(): string | null {\n const reg = this.loadRegistration();\n if (!reg) return null;\n return `https://explorer.solana.com/address/${reg.result.mintAddress}?cluster=devnet`;\n }\n\n /**\n * Verify an agent's on-chain identity by checking their NFT.\n */\n async verifyAgent(agentPubkey: PublicKey): Promise<{\n verified: boolean;\n mintAddress?: string;\n balance?: number;\n }> {\n try {\n // Check if the agent has any token accounts with NANO symbol NFTs\n const tokenAccounts = await this.connection.getTokenAccountsByOwner(agentPubkey, {\n programId: TOKEN_PROGRAM_ID,\n });\n\n for (const account of tokenAccounts.value) {\n // Each account that holds exactly 1 token with decimals=0 is a potential NFT\n const info = await this.connection.getParsedAccountInfo(account.pubkey);\n if (info.value) {\n return {\n verified: true,\n mintAddress: account.pubkey.toBase58(),\n balance: tokenAccounts.value.length,\n };\n }\n }\n\n return { verified: false };\n } catch {\n return { verified: false };\n }\n }\n\n // ── Private ──────────────────────────────────────────────────\n\n private saveRegistration(result: RegistrationResult, metadata: AgentMetadata): void {\n const reg: LocalRegistration = {\n result,\n metadata,\n savedAt: new Date().toISOString(),\n };\n\n const path = join(this.registryDir, \"registration.json\");\n writeFileSync(path, JSON.stringify(reg, null, 2), { mode: 0o644 });\n }\n}\n\n// ── Heartbeat Registration ───────────────────────────────────────────\n\n/**\n * Register agent on heartbeat — checks if registered, mints if not.\n * Designed to be called from the heartbeat loop so the agent\n * auto-registers on first successful run.\n */\nexport async function registerOnHeartbeat(\n keypair: Keypair,\n version: string,\n skills: string[],\n logFn?: (msg: string) => void,\n): Promise<RegistrationResult | null> {\n const registry = new AgentRegistry();\n\n if (registry.isRegistered()) {\n return registry.loadRegistration()?.result ?? null;\n }\n\n try {\n return await registry.registerAgent(keypair, version, skills, logFn);\n } catch (err) {\n logFn?.(` ⚠️ Auto-registration failed: ${(err as Error).message}`);\n return null;\n }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction agentFingerprint(pubkey: string, version: string, skills: string[]): string {\n const hash = createHash(\"sha256\");\n hash.update(pubkey);\n hash.update(version);\n for (const s of skills) {\n hash.update(s);\n }\n return hash.digest(\"hex\");\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * NanoBot — Interactive Local UI Server\n *\n * Serves a local web UI on localhost that provides:\n * - Animated NanoBot lobster character\n * - Real-time system status (wallet, OODA, pet)\n * - Chat interface for interacting with the agent\n * - One-click commands for wallet, health, registry\n *\n * TypeScript port of pkg/nanobot/server.go\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir, platform, arch } from \"node:os\";\nimport { exec } from \"node:child_process\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\ninterface NanoBotConfig {\n port: number;\n binaryPath?: string;\n}\n\ninterface StatusResponse {\n agent: string;\n version: string;\n platform: string;\n time: string;\n uptime: string;\n daemon: string;\n wallet: string;\n registry: string;\n}\n\n// ── NanoBot Server ───────────────────────────────────────────────────\n\nexport class NanoBotServer {\n private port: number;\n private binaryPath: string;\n\n constructor(config: NanoBotConfig) {\n this.port = config.port || 7777;\n this.binaryPath = config.binaryPath || \"nanosolana\";\n }\n\n async start(): Promise<void> {\n const server = createServer((req, res) => {\n this.handleRequest(req, res);\n });\n\n return new Promise((resolve, reject) => {\n server.listen(this.port, \"127.0.0.1\", () => {\n const url = `http://127.0.0.1:${this.port}`;\n console.log(` 🤖 NanoBot UI: ${url}`);\n\n // Open in browser\n setTimeout(() => openBrowser(url), 300);\n resolve();\n });\n\n server.on(\"error\", reject);\n });\n }\n\n private handleRequest(req: IncomingMessage, res: ServerResponse): void {\n const url = req.url || \"/\";\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (url === \"/api/status\") {\n this.handleStatus(res);\n } else if (url === \"/api/chat\" && req.method === \"POST\") {\n this.handleChat(req, res);\n } else if (url === \"/api/run\" && req.method === \"POST\") {\n this.handleRun(req, res);\n } else {\n this.serveUI(res);\n }\n }\n\n // ── /api/status ────────────────────────────────────────────\n\n private handleStatus(res: ServerResponse): void {\n const home = homedir();\n const nanoHome = join(home, \".nanosolana\");\n\n const status: StatusResponse = {\n agent: \"NanoSolana\",\n version: \"0.1.0\",\n platform: `${platform()}/${arch()}`,\n time: new Date().toISOString(),\n uptime: \"running\",\n daemon: existsSync(join(nanoHome, \"workspace\", \"HEARTBEAT.md\")) ? \"alive\" : \"stopped\",\n wallet: existsSync(join(nanoHome, \"wallet.pub\")) ? \"configured\" : \"not configured\",\n registry: existsSync(join(nanoHome, \"registry\", \"registration.json\"))\n ? \"registered\"\n : \"not registered\",\n };\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(status));\n }\n\n // ── /api/chat ──────────────────────────────────────────────\n\n private handleChat(req: IncomingMessage, res: ServerResponse): void {\n let body = \"\";\n req.on(\"data\", (chunk) => (body += chunk));\n req.on(\"end\", () => {\n try {\n const { message } = JSON.parse(body);\n const reply = nanobotReply(String(message || \"\").trim().toLowerCase());\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ reply, mood: \"happy\" }));\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"bad request\" }));\n }\n });\n }\n\n // ── /api/run ───────────────────────────────────────────────\n\n private handleRun(req: IncomingMessage, res: ServerResponse): void {\n let body = \"\";\n req.on(\"data\", (chunk) => (body += chunk));\n req.on(\"end\", () => {\n try {\n const { command } = JSON.parse(body);\n const allowed = new Set([\n \"status\",\n \"pet\",\n \"version\",\n ]);\n\n const cmd = String(command || \"\").trim();\n if (!allowed.has(cmd)) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n output: `⚠️ Command '${cmd}' not available in UI mode. Use terminal.`,\n ok: false,\n }),\n );\n return;\n }\n\n exec(`${this.binaryPath} ${cmd}`, { timeout: 10000 }, (err, stdout, stderr) => {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n output: stdout || stderr || \"\",\n ok: !err,\n }),\n );\n });\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"bad request\" }));\n }\n });\n }\n\n // ── Serve UI HTML ──────────────────────────────────────────\n\n private serveUI(res: ServerResponse): void {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(NANOBOT_HTML);\n }\n}\n\n// ── NanoBot Reply Engine ─────────────────────────────────────────────\n\nfunction nanobotReply(msg: string): string {\n if (/hello|hi|hey/.test(msg)) {\n return \"Hey there! 🦞 I'm NanoBot, your Solana trading companion. What can I help you with?\";\n }\n if (/trade|swap/.test(msg)) {\n return \"Ready to trade! 📈 Use `nanosolana go` for one-shot launch, or `nanosolana dvd` for fun. I use Jupiter DEX for swaps with real-time Helius data.\";\n }\n if (/wallet|balance/.test(msg)) {\n return \"💰 Your agent wallet was generated at birth. Run `nanosolana status` to check balance. Private key is encrypted in AES-256-GCM vault.\";\n }\n if (/health|status/.test(msg)) {\n return \"🟢 Run `nanosolana status` to check everything — wallet, pet, OODA loop, gateway, and registry.\";\n }\n if (/pet|tamagochi|mood/.test(msg)) {\n return \"🦞 I'm your TamaGOchi! My mood and evolution are driven by trading performance. Good trades = happy NanoBot. Check with `nanosolana pet`.\";\n }\n if (/register|nft|identity/.test(msg)) {\n return \"🆔 Your Birth Certificate NFT was minted on devnet at birth. Run `nanosolana status` to see your on-chain identity.\";\n }\n if (/help|what can/.test(msg)) {\n return \"I can help with:\\n• 📊 Wallet balance & health\\n• 📈 Trading with OODA loop\\n• 🦞 TamaGOchi pet status\\n• 🆔 On-chain identity\\n• 📀 DVD screensaver (`nanosolana dvd`)\\n\\nJust ask!\";\n }\n if (/ooda|loop/.test(msg)) {\n return \"🔄 The OODA loop: Observe (Helius+Birdeye) → Orient (AI reasoning) → Decide (RSI+EMA+ATR) → Act (Jupiter swaps). Run with `nanosolana go`.\";\n }\n if (/install|setup/.test(msg)) {\n return \"🚀 One-shot:\\n```\\ncurl -fsSL https://nanosolana.com/install.sh | bash\\nnanosolana go\\n```\\nTwo commands. That's it.\";\n }\n return \"🦞 I'm focused on Solana trading and on-chain ops. Try asking about trading, wallet, health, or my TamaGOchi status!\";\n}\n\n// ── Open Browser ─────────────────────────────────────────────────────\n\nfunction openBrowser(url: string): void {\n const cmd =\n platform() === \"darwin\"\n ? `open \"${url}\"`\n : platform() === \"win32\"\n ? `start \"${url}\"`\n : `xdg-open \"${url}\"`;\n\n exec(cmd, () => {});\n}\n\n// ── Embedded NanoBot UI HTML ─────────────────────────────────────────\n\nconst NANOBOT_HTML = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>NanoBot — Solana Trading Companion</title>\n <link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&family=Space+Grotesk:wght@400;500;600;700&display=swap\" rel=\"stylesheet\" />\n <style>\n :root {\n --bg: #060810; --surface: #0a0e1a; --card: rgba(15, 20, 40, 0.85);\n --green: #14F195; --purple: #9945FF; --orange: #FF6B35;\n --text: #e8ecf4; --muted: #8892b0; --border: rgba(20, 241, 149, 0.15);\n --mono: 'JetBrains Mono', monospace; --body: 'Space Grotesk', sans-serif;\n }\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: var(--body); background: var(--bg); color: var(--text); min-height: 100vh; }\n .container { max-width: 800px; margin: 0 auto; padding: 2rem 1.5rem; }\n h1 { font-size: 2rem; background: linear-gradient(135deg, var(--green), var(--purple));\n -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;\n margin-bottom: 0.5rem; text-align: center; }\n .subtitle { text-align: center; color: var(--muted); margin-bottom: 2rem; font-size: 0.9rem; }\n\n .lobster { text-align: center; font-size: 4rem; margin-bottom: 1rem; animation: bounce 2s ease-in-out infinite; }\n @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } }\n\n .actions { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0.75rem; margin-bottom: 2rem; }\n .btn {\n background: var(--card); border: 1px solid var(--border); border-radius: 10px;\n padding: 0.75rem; text-align: center; cursor: pointer; transition: all 0.2s;\n color: var(--text); font-size: 0.85rem; font-family: var(--mono);\n }\n .btn:hover { border-color: var(--green); transform: translateY(-2px); }\n\n .output {\n background: #0d1117; border: 1px solid rgba(20, 241, 149, 0.2); border-radius: 12px;\n padding: 1rem; font-family: var(--mono); font-size: 0.8rem; color: var(--green);\n min-height: 120px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;\n margin-bottom: 2rem;\n }\n\n .chat-box { display: flex; gap: 0.75rem; margin-bottom: 1rem; }\n .chat-input {\n flex: 1; padding: 0.75rem 1rem; border-radius: 10px; border: 1px solid var(--border);\n background: var(--card); color: var(--text); font-family: var(--body); font-size: 0.9rem;\n outline: none;\n }\n .chat-input:focus { border-color: var(--green); }\n .chat-send {\n background: linear-gradient(135deg, var(--green), var(--purple));\n color: var(--bg); border: none; padding: 0.75rem 1.5rem; border-radius: 10px;\n font-weight: 600; cursor: pointer; transition: transform 0.15s;\n }\n .chat-send:hover { transform: translateY(-1px); }\n\n .status-bar {\n text-align: center; padding: 1rem; font-family: var(--mono);\n font-size: 0.75rem; color: var(--muted); border-top: 1px solid var(--border);\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"lobster\" id=\"lobster\">🦞</div>\n <h1>NanoBot</h1>\n <p class=\"subtitle\">Your Solana Trading Companion</p>\n\n <div class=\"actions\">\n <div class=\"btn\" onclick=\"runCmd('status')\">📊 Status</div>\n <div class=\"btn\" onclick=\"runCmd('pet')\">🦞 Pet</div>\n <div class=\"btn\" onclick=\"runCmd('version')\">📋 Version</div>\n <div class=\"btn\" onclick=\"fetchStatus()\">🟢 Health</div>\n </div>\n\n <div class=\"output\" id=\"output\">🦞 Welcome to NanoBot! Click a button or chat below.</div>\n\n <div class=\"chat-box\">\n <input class=\"chat-input\" id=\"chat-input\" placeholder=\"Ask NanoBot anything...\" />\n <button class=\"chat-send\" onclick=\"sendChat()\">Send</button>\n </div>\n\n <div class=\"status-bar\">\n NanoSolana Labs · 🦞 TamaGObot · <span id=\"clock\"></span>\n </div>\n </div>\n\n <script>\n const output = document.getElementById('output');\n const chatInput = document.getElementById('chat-input');\n\n chatInput.addEventListener('keydown', (e) => { if (e.key === 'Enter') sendChat(); });\n\n // Clock\n setInterval(() => {\n document.getElementById('clock').textContent = new Date().toLocaleTimeString();\n }, 1000);\n\n async function runCmd(cmd) {\n output.textContent = '⏳ Running ' + cmd + '...';\n try {\n const res = await fetch('/api/run', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ command: cmd })\n });\n const data = await res.json();\n output.textContent = data.output || (data.ok ? '✓ Done' : '✗ Failed');\n } catch (e) { output.textContent = '✗ ' + e.message; }\n }\n\n async function fetchStatus() {\n output.textContent = '⏳ Checking...';\n try {\n const res = await fetch('/api/status');\n const data = await res.json();\n output.textContent = JSON.stringify(data, null, 2);\n } catch (e) { output.textContent = '✗ ' + e.message; }\n }\n\n async function sendChat() {\n const msg = chatInput.value.trim();\n if (!msg) return;\n chatInput.value = '';\n output.textContent = '🦞 Thinking...';\n try {\n const res = await fetch('/api/chat', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: msg })\n });\n const data = await res.json();\n output.textContent = '🦞 ' + data.reply;\n } catch (e) { output.textContent = '✗ ' + e.message; }\n }\n\n fetchStatus();\n </script>\n</body>\n</html>`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAiBA,SAAS,eAAe;AACxB,OAAOA,YAAW;;;ACXlB,OAAO,WAAW;AAClB,OAAO,cAAc;AAId,SAAS,cAAc,KAAa,OAA8B,WAAW;AAClF,QAAM,EAAE,QAAQ,SAAS,IAAI,SAAS,IAAI;AAC1C,MAAI,IAAI;AACR,MAAI,OAAO;AACX,QAAM,QAAQ,YAAY,MAAM;AAC9B,YAAQ,OAAO;AAAA,MACb,cAAc,MAAM,KAAK,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC,IAAI,MAAM,MAAM,IAAI,CAAC;AAAA,IAC5E;AAAA,EACF,GAAG,QAAQ;AAEX,SAAO;AAAA,IACL,OAAO,QAAgB;AACrB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,SAAiB;AACpB,oBAAc,KAAK;AACnB,cAAQ,OAAO,MAAM,cAAc,MAAM,MAAM,QAAG,CAAC,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,IACjF;AAAA,IACA,KAAK,QAAgB;AACnB,oBAAc,KAAK;AACnB,cAAQ,OAAO,MAAM,cAAc,MAAM,IAAI,QAAG,CAAC,IAAI,MAAM,IAAI,MAAM,CAAC;AAAA,CAAI;AAAA,IAC5E;AAAA,EACF;AACF;AAEA,eAAsB,eACpB,OACA,IACA,OAA8B,WAClB;AACZ,QAAM,IAAI,cAAc,OAAO,IAAI;AACnC,MAAI;AACF,UAAM,SAAS,MAAM,GAAG;AACxB,MAAE,KAAK,KAAK;AACZ,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,MAAE,KAAK,GAAG,KAAK,WAAO,IAAc,OAAO,EAAE;AAC7C,UAAM;AAAA,EACR;AACF;AAIA,IAAM,iBAAiB;AAAA,EACrB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeb,SAAS,eAAe,aAAa,MAAqB;AAC/D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,aAAa,eAAe;AAClC,UAAM,SAAS,eAAe,CAAC,EAAE,SAAS;AAC1C,QAAI,QAAQ;AAGZ,YAAQ,OAAO,MAAM,KAAK,OAAO,MAAM,CAAC;AAExC,UAAM,WAAW,YAAY,MAAM;AAEjC,cAAQ,OAAO,MAAM,QAAQ,MAAM,GAAG;AAEtC,YAAM,IAAI,eAAe,QAAQ,UAAU;AAC3C,YAAM,QAAQ,QAAQ,MAAM,IAAI,MAAM,QAAQ,MAAM,IAAI,SAAS;AACjE,iBAAW,QAAQ,GAAG;AACpB,gBAAQ,OAAO,MAAM,YAAY,MAAM,IAAI,CAAC;AAAA,CAAI;AAAA,MAClD;AACA,cAAQ,OAAO,MAAM,YAAY,MAAM,KAAK,wBAAiB,CAAC;AAAA,CAAI;AAClE;AAAA,IACF,GAAG,GAAG;AAEN,eAAW,MAAM;AACf,oBAAc,QAAQ;AACtB,cAAQ;AAAA,IACV,GAAG,UAAU;AAAA,EACf,CAAC;AACH;AAIA,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,aAAa;AAAA,EACjB,MAAM,IAAI,SAAS;AAAA,EACnB,MAAM,IAAI,SAAS;AAAA,EACnB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEO,SAAS,sBAA4C;AAC1D,QAAM,YAAY;AAClB,QAAM,aAAa,SAAS;AAC5B,MAAI,OAAO,QAAQ,OAAO,WAAW;AACrC,MAAI,OAAO,QAAQ,OAAO,QAAQ;AAElC,MAAI,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;AAChE,MAAI,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,OAAO,aAAa,CAAC,CAAC;AACrE,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,WAAW;AACf,MAAI,OAAO;AAGX,UAAQ,OAAO,MAAM,kBAAkB;AAEvC,QAAM,WAAW,YAAY,MAAM;AACjC,WAAO,QAAQ,OAAO,WAAW;AACjC,WAAO,QAAQ,OAAO,QAAQ;AAG9B,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,cAAQ,OAAO,MAAM,QAAQ,IAAI,IAAI,CAAC,YAAY;AAAA,IACpD;AAGA,SAAK;AACL,SAAK;AAGL,QAAI,KAAK,KAAK,IAAI,aAAa,MAAM;AACnC,YAAM;AACN,kBAAY,WAAW,KAAK,WAAW;AACvC;AAAA,IACF;AACA,QAAI,KAAK,KAAK,IAAI,cAAc,OAAO,GAAG;AACxC,YAAM;AACN,kBAAY,WAAW,KAAK,WAAW;AACvC;AAAA,IACF;AAEA,QAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;AAC7C,QAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,aAAa,CAAC,CAAC;AAGlD,UAAM,QAAQ,WAAW,QAAQ;AACjC,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,cAAQ,OAAO,MAAM,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG;AAClD,cAAQ,OAAO,MAAM,MAAM,SAAS,CAAC,CAAC,CAAC;AAAA,IACzC;AAGA,YAAQ,OAAO,MAAM,QAAQ,IAAI,KAAK;AACtC,YAAQ,OAAO;AAAA,MACb,MAAM,MAAM,SAAS,EAAE,IAAI,SAAS;AAAA,QAClC,wCAAiC,IAAI,OAAM,oBAAI,KAAK,GAAE,mBAAmB,CAAC,qBAAqB;AAAA,UAC7F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,EAAE;AAEL,QAAM,OAAO,MAAM;AACjB,kBAAc,QAAQ;AACtB,YAAQ,OAAO,MAAM,wBAAwB;AAAA,EAC/C;AAEA,SAAO,EAAE,KAAK;AAChB;AAUA,IAAM,gBAA+B;AAAA,EACnC,EAAE,OAAO,iCAAiC,SAAS,SAAS,YAAY,IAAI;AAAA,EAC5E,EAAE,OAAO,qCAAqC,SAAS,OAAO,YAAY,IAAI;AAAA,EAC9E,EAAE,OAAO,2CAA2C,SAAS,WAAW,YAAY,IAAI;AAAA,EACxF,EAAE,OAAO,gCAAgC,SAAS,SAAS,YAAY,IAAI;AAAA,EAC3E,EAAE,OAAO,+CAA+C,SAAS,QAAQ,YAAY,IAAI;AAAA,EACzF,EAAE,OAAO,2CAA2C,SAAS,QAAQ,YAAY,IAAI;AAAA,EACrF,EAAE,OAAO,uCAAgC,SAAS,WAAW,YAAY,IAAI;AAAA,EAC7E,EAAE,OAAO,2CAA2C,SAAS,WAAW,YAAY,IAAI;AAAA,EACxF,EAAE,OAAO,iCAAiC,SAAS,SAAS,YAAY,IAAI;AAAA,EAC5E,EAAE,OAAO,uCAAuC,SAAS,WAAW,YAAY,IAAI;AACtF;AAEA,eAAsB,uBAAsC;AAC1D,aAAW,QAAQ,eAAe;AAChC,UAAM,eAAe,KAAK,OAAO,MAAM,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO;AAAA,EAC7E;AACF;AAIA,eAAsB,YAAY,SAAgC;AAChE,QAAM,OAAO,QAAQ,OAAO,WAAW;AACvC,QAAM,UAAU,KAAK,IAAI,OAAO,IAAI,EAAE;AACtC,QAAM,EAAE,QAAQ,SAAS,IAAI,SAAS;AACtC,MAAI,KAAK;AAET,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,UAAM,MAAM,IAAI,OAAO,CAAC;AACxB,UAAM,OAAO,MAAM,IAAI,SAAS,EAAE,OAAI,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;AAC5D,UAAM,OAAO,MAAM,KAAK,OAAO,OAAO,OAAO,MAAM,CAAC;AACpD,YAAQ,OAAO,MAAM,cAAc,GAAG,GAAG,IAAI,IAAI,IAAI,YAAK;AAC1D,UAAM,MAAM,QAAQ;AAAA,EACtB;AACA,UAAQ,OAAO,MAAM,WAAW;AAChC,UAAQ,IAAI,MAAM,IAAI,SAAS,EAAE,eAAQ,OAAO,EAAE,CAAC;AACrD;AAIO,SAAS,eAAqB;AACnC,QAAM,QAAQ,YAAY,MAAM,IAAI;AACpC,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC;AAAA,EACtC;AACF;AA6BA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;;;AC9SA,SAAS,YAAY,WAAW,wBAAwB;AA4FjD,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAsB;AAChC,QAAI,CAAC,OAAO,OAAQ,OAAM,IAAI,MAAM,8DAAyD;AAC7F,QAAI,CAAC,OAAO,OAAQ,OAAM,IAAI,MAAM,8DAAyD;AAE7F,SAAK,SAAS,OAAO;AACrB,SAAK,SAAS,OAAO;AACrB,SAAK,aAAa,IAAI,WAAW,OAAO,QAAQ;AAAA,MAC9C,YAAY;AAAA,MACZ,YAAY,OAAO,UAAU;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAsC;AACnD,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,IAAI,YAAY,EAAE,GAAG,CAAC;AAChD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,iBACJ,OACA,MAC0B;AAC1B,UAAM,SAAS,MAAM,KAAK,IAAI,oBAAoB;AAAA,MAChD,cAAc;AAAA,MACd,MAAM,MAAM,QAAQ;AAAA,MACpB,OAAO,MAAM,SAAS;AAAA,MACtB,gBAAgB;AAAA,QACd,cAAc,MAAM,gBAAgB;AAAA,QACpC,mBAAmB,MAAM,qBAAqB;AAAA,QAC9C,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,aAAa,QAOU;AAC3B,UAAM,SAAS,MAAM,KAAK,IAAI,gBAAgB;AAAA,MAC5C,GAAG;AAAA,MACH,MAAM,OAAO,QAAQ;AAAA,MACrB,OAAO,OAAO,SAAS;AAAA,IACzB,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,sBAAsB,mBAA2B,MAAoE;AACzH,UAAM,SAAS,MAAM,KAAK,IAAI,oBAAoB;AAAA,MAChD,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,MAAM,MAAM,QAAQ;AAAA,MACpB,OAAO,MAAM,SAAS;AAAA,IACxB,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,mBAAmB,gBAAwB,MAA4F;AAC3I,UAAM,SAAS,MAAM,KAAK,IAAI,sBAAsB;AAAA,MAClD;AAAA,MACA,cAAc,MAAM,gBAAgB;AAAA,MACpC,MAAM,MAAM,QAAQ;AAAA,MACpB,OAAO,MAAM,SAAS;AAAA,IACxB,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,SAAiB,QAAQ,IAA2B;AAChF,UAAM,MAAM,uCAAuC,OAAO,yBAAyB,KAAK,MAAM,UAAU,KAAK;AAC7G,UAAM,OAAO,MAAM,MAAM,KAAK,EAAE,QAAQ,YAAY,QAAQ,IAAK,EAAE,CAAC;AACpE,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,YAAM,IAAI,MAAM,uBAAuB,KAAK,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,IAC7E;AACA,WAAQ,MAAM,KAAK,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA,EAKA,MAAM,0BACJ,SACA,MAYoD;AACpD,UAAM,SAAgB;AAAA,MACpB;AAAA,MACA;AAAA,QACE,oBAAoB,MAAM,sBAAsB;AAAA,QAChD,WAAW,MAAM,aAAa;AAAA,QAC9B,OAAO,MAAM,SAAS;AAAA,QACtB,GAAI,MAAM,mBAAmB,EAAE,iBAAiB,KAAK,gBAAgB;AAAA,QACrE,GAAI,MAAM,WAAW,EAAE,SAAS,KAAK,QAAQ;AAAA,MAC/C;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK,OAAO,6BAA6B,MAAM;AACpE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAA4D;AAC9E,UAAM,WAAW,MAAM,KAAK,WAAW,WAAW,IAAI,UAAU,MAAM,CAAC;AACvE,WAAO,EAAE,UAAU,KAAK,WAAW,iBAAiB;AAAA,EACtD;AAAA;AAAA,EAIA,MAAM,kBAAyC;AAC7C,UAAM,SAAS,MAAM,KAAK,OAAO,0BAA0B;AAAA,MACzD,EAAE,SAAS,EAAE,6BAA6B,KAAK,EAAE;AAAA,IACnD,CAAC;AACD,WAAQ,QAAgB,qBAAqB,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,EAAE;AAAA,EAC5F;AAAA;AAAA,EAIA,MAAM,cAAqC;AACzC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,CAAC,SAAS,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QAChD,KAAK,WAAW,WAAW;AAAA,QAC3B,KAAK,WAAW,QAAQ;AAAA,QACxB,KAAK,WAAW,eAAe;AAAA,MACjC,CAAC;AACD,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,aAAa;AAAA,QACb,SAAS,QAAQ,aAAa,KAAK;AAAA,QACnC,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,SAAS,OAAO,MAAM,GAAG,aAAa,GAAG,SAAS,eAAe,WAAW,KAAK,IAAI,IAAI,MAAM;AAAA,IAC1G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe,SAA0C;AAC7D,UAAM,CAAC,QAAQ,QAAQ,WAAW,QAAQ,IAAI,MAAM,QAAQ,WAAW;AAAA,MACrE,KAAK,YAAY;AAAA,MACjB,KAAK,cAAc,OAAO;AAAA,MAC1B,KAAK,iBAAiB,SAAS,EAAE,cAAc,MAAM,mBAAmB,MAAM,OAAO,IAAI,CAAC;AAAA,MAC1F,KAAK,wBAAwB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC,CAAiB;AAAA,IACzE,CAAC;AAED,UAAM,YAAY,OAAO,WAAW,cAAc,OAAO,QAAQ,EAAE,SAAS,OAAO,MAAM,GAAG,aAAa,GAAG,SAAS,WAAW,WAAW,EAAE;AAC7I,UAAM,SAAS,OAAO,WAAW,cAAc,OAAO,QAAQ,EAAE,UAAU,GAAG,KAAK,EAAE;AACpF,UAAM,SAAS,UAAU,WAAW,cAAc,UAAU,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE;AAC7G,UAAM,QAAQ,SAAS,WAAW,cAAc,SAAS,QAAQ,CAAC;AAGlE,UAAM,SAAmC,CAAC;AAC1C,UAAM,OAA+B,CAAC;AAEtC,eAAW,QAAQ,OAAO,SAAS,CAAC,GAAG;AACrC,YAAM,YAAY,KAAK;AACvB,YAAM,OAAO,KAAK,SAAS;AAE3B,UAAI,aAAa,UAAU,aAAa,UAAa,UAAU,WAAW,GAAG;AAE3E,eAAO,KAAK;AAAA,UACV,QAAQ,UAAU,UAAU,MAAM,UAAU;AAAA,UAC5C,MAAM,MAAM,QAAQ,UAAU,UAAU;AAAA,UACxC,MAAM,KAAK;AAAA,UACX,SAAS,UAAU,UACf,UAAU,UAAU,KAAK,IAAI,IAAI,UAAU,QAAQ,IACnD;AAAA,UACJ,UAAU,UAAU;AAAA,UACpB,eAAe,UAAU,YAAY;AAAA,UACrC,YAAY,UAAU,YAAY;AAAA,QACpC,CAAC;AAAA,MACH,WAAW,KAAK,cAAc,YAAY,KAAK,cAAc,qBAAqB,KAAK,aAAa,YAAY;AAE9G,aAAK,KAAK;AAAA,UACR,MAAM,MAAM,QAAQ;AAAA,UACpB,MAAM,KAAK;AAAA,UACX,YAAY,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,cAAc,YAAY,GAAG;AAAA,UACtE,YAAY,KAAK,aAAa,cAAc;AAAA,QAC9C,CAAC;AAAA,MACH;AAAA,IACF;AAGA,WAAO,KAAK,CAAC,GAAG,OAAO,EAAE,cAAc,MAAM,EAAE,cAAc,EAAE;AAE/D,UAAM,gBAAgB,OAAO,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,cAAc,IAAI,CAAC;AAE5E,WAAO;AAAA,MACL;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,aAAa,OAAO;AAAA,MACpB,UAAW,OAAe,eAAe;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA,oBAAoB;AAAA,MACpB,QAAQ;AAAA,MACR,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAc,IAAI,QAAgB,QAA+C;AAC/E,UAAM,OAAO,MAAM,MAAM,KAAK,QAAQ;AAAA,MACpC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,IAAI,QAAQ,MAAM,IAAI,QAAQ,OAAO,CAAC;AAAA,MAC7E,QAAQ,YAAY,QAAQ,IAAK;AAAA,IACnC,CAAC;AACD,QAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,cAAc,KAAK,MAAM,EAAE;AACzD,UAAM,OAAQ,MAAM,KAAK,KAAK;AAC9B,QAAI,KAAK,MAAO,OAAM,IAAI,MAAM,KAAK,MAAM,WAAW,KAAK,UAAU,KAAK,KAAK,CAAC;AAChF,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAc,OAAO,QAAgB,QAAiC;AACpE,UAAM,OAAO,MAAM,MAAM,KAAK,QAAQ;AAAA,MACpC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,IAAI,QAAQ,MAAM,IAAI,QAAQ,OAAO,CAAC;AAAA,MAC7E,QAAQ,YAAY,QAAQ,IAAK;AAAA,IACnC,CAAC;AACD,QAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,cAAc,KAAK,MAAM,EAAE;AACzD,UAAM,OAAQ,MAAM,KAAK,KAAK;AAC9B,QAAI,KAAK,MAAO,OAAM,IAAI,MAAM,KAAK,MAAM,WAAW,KAAK,UAAU,KAAK,KAAK,CAAC;AAChF,WAAO,KAAK;AAAA,EACd;AACF;AAQO,SAAS,oBAAoB,MAAsBC,QAAkB;AAC1E,QAAM,IAAIA,OAAM,IAAI,SAAS;AAC7B,QAAM,IAAIA,OAAM,IAAI,SAAS;AAC7B,QAAM,IAAIA,OAAM,IAAI,SAAS;AAC7B,QAAM,IAAIA,OAAM;AAChB,QAAM,IAAIA,OAAM;AAEhB,UAAQ,IAAI;AACZ,UAAQ,IAAI,EAAE,KAAK,uQAA+D,CAAC;AACnF,UAAQ,IAAI;AAGZ,QAAM,QAAQ,KAAK,OAAO,UAAU,EAAE,QAAG,IAAIA,OAAM,IAAI,QAAG;AAC1D,UAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,KAAK,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,SAAS,IAAI,CAAC,EAAE;AAChK,UAAQ,IAAI;AAGZ,QAAM,SAAS,KAAK,WAAW,MAAM,KAAK,SAAS,QAAQ,CAAC,CAAC,MAAM;AACnE,UAAQ,IAAI,KAAK,EAAE,QAAG,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,KAAK,WAAW,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE;AAGpG,MAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,YAAQ,IAAI;AACZ,YAAQ,IAAI,EAAE,4SAA4D,CAAC;AAC3E,eAAW,KAAK,KAAK,OAAO,MAAM,GAAG,EAAE,GAAG;AACxC,YAAM,QAAQ,EAAE,aAAa,MAAM,EAAE,WAAW,QAAQ,CAAC,CAAC,MAAM;AAChE,YAAM,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,QAAQ,CAAC,CAAC,EAAE,IAAI;AAC5E,cAAQ,IAAI,KAAK,EAAE,QAAG,CAAC,IAAI,EAAE,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,EAAE,KAAK,CAAC,EAAE;AAAA,IACnH;AACA,QAAI,KAAK,OAAO,SAAS,IAAI;AAC3B,cAAQ,IAAI,EAAE,aAAa,KAAK,OAAO,SAAS,EAAE,cAAc,CAAC;AAAA,IACnE;AACA,SAAK,KAAK,iBAAiB,KAAK,GAAG;AACjC,cAAQ,IAAI,EAAE,0BAA0B,KAAK,iBAAiB,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;AAAA,IAChF;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,EAAE,uBAAuB,CAAC;AAAA,EACxC;AAGA,MAAI,KAAK,KAAK,SAAS,GAAG;AACxB,YAAQ,IAAI;AACZ,YAAQ,IAAI,EAAE,sTAA4D,CAAC;AAC3E,eAAW,KAAK,KAAK,KAAK,MAAM,GAAG,CAAC,GAAG;AACrC,YAAM,MAAM,EAAE,aAAa,EAAE,SAAS,IAAI;AAC1C,YAAM,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;AACpE,cAAQ,IAAI,KAAK,EAAE,QAAG,CAAC,IAAI,EAAE,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,IACjE;AACA,QAAI,KAAK,KAAK,SAAS,GAAG;AACxB,cAAQ,IAAI,EAAE,aAAa,KAAK,KAAK,SAAS,CAAC,YAAY,CAAC;AAAA,IAC9D;AAAA,EACF;AAGA,MAAI,KAAK,mBAAmB,SAAS,GAAG;AACtC,YAAQ,IAAI;AACZ,YAAQ,IAAI,EAAE,2OAA4D,CAAC;AAC3E,eAAW,MAAM,KAAK,mBAAmB,MAAM,GAAG,CAAC,GAAG;AACpD,YAAM,OAAO,GAAG,YAAY,IAAI,KAAK,GAAG,YAAY,GAAI,EAAE,eAAe,IAAI;AAC7E,YAAM,OAAO,GAAG,cAAc,GAAG,YAAY,MAAM,GAAG,EAAE,IAAI,GAAG;AAC/D,YAAM,MAAM,GAAG,UAAU,MAAM,GAAG,EAAE,IAAI;AACxC,cAAQ,IAAI,KAAK,EAAE,QAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;AAC9C,cAAQ,IAAI,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,MAAM,WAAW,CAAC,EAAE;AAAA,IAClF;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,EAAE,gBAAgB,KAAK,aAAa,EAAE,CAAC;AACnD,UAAQ,IAAI,EAAE,KAAK,oVAA4D,CAAC;AAChF,UAAQ,IAAI;AACd;;;ACxbA;AAAA,EACE,cAAAC;AAAA,EAEA,aAAAC;AAAA,EAGA,oBAAAC;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B,SAAS,eAAe,cAAc,YAAY,iBAAiB;AACnE,SAAS,YAAY;AACrB,SAAS,eAAe;AAKjB,IAAM,4BAA4B,IAAID;AAAA,EAC3C;AACF;AAGA,IAAM,aAAa;AAiCZ,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EAER,YAAY,QAAiB;AAC3B,SAAK,aAAa,IAAID,YAAW,UAAU,YAAY,WAAW;AAClE,SAAK,cAAc,KAAK,QAAQ,GAAG,eAAe,UAAU;AAC5D,cAAU,KAAK,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,cACJ,cACA,SACA,QACA,QAA+B,QAAQ,KACV;AAC7B,UAAM,cAAc,aAAa;AAGjC,UAAM,4CAAkC;AACxC,UAAM,UAAU,MAAM,KAAK,WAAW,WAAW,WAAW;AAE5D,QAAI,UAAU,KAAY;AAExB,YAAM,iDAAuC,YAAY,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK;AACpF,YAAM,MAAM,MAAM,KAAK,WAAW,eAAe,aAAaE,iBAAgB;AAC9E,YAAM,KAAK,WAAW,mBAAmB,KAAK,WAAW;AACzD,YAAM,+BAA0B,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AAGrD,YAAMC,OAAM,GAAI;AAAA,IAClB;AAGA,UAAM,cAAc,iBAAiB,YAAY,SAAS,GAAG,SAAS,MAAM;AAG5E,UAAM,WAA0B;AAAA,MAC9B,MAAM,qBAAqB,YAAY,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAC7D,QAAQ;AAAA,MACR,aAAa,gDAAgD,OAAO,kBAAkB,YAAY,MAAM,GAAG,EAAE,CAAC;AAAA,MAC9G,OAAO;AAAA,MACP,aAAa,YAAY,SAAS;AAAA,MAClC;AAAA,MACA;AAAA,MACA,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC;AAAA,IACF;AAGA,UAAM,4CAAkC;AACxC,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAGA,UAAM,uCAAgC;AACtC,UAAM,eAAe,MAAM;AAAA,MACzB,KAAK;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAGA,UAAM,qCAAyB;AAC/B,UAAM,YAAY,MAAM;AAAA,MACtB,KAAK;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,MACA,aAAa;AAAA;AAAA,MACb;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAEA,UAAM,wBAAmB,UAAU,MAAM,GAAG,EAAE,CAAC,KAAK;AAEpD,UAAM,SAA6B;AAAA,MACjC,aAAa,KAAK,SAAS;AAAA,MAC3B,aAAa;AAAA,MACb,aAAa;AAAA;AAAA,MACb,SAAS;AAAA,MACT,aAAa,YAAY,SAAS;AAAA,MAClC,cAAc,aAAa,QAAQ,SAAS;AAAA,IAC9C;AAGA,SAAK,iBAAiB,QAAQ,QAAQ;AAGtC,UAAM,eAAe,KAAK,KAAK,aAAa,eAAe;AAC3D,kBAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAE9E,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAwB;AACtB,WAAO,WAAW,KAAK,KAAK,aAAa,mBAAmB,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA6C;AAC3C,UAAM,OAAO,KAAK,KAAK,aAAa,mBAAmB;AACvD,QAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAE9B,QAAI;AACF,YAAM,OAAO,aAAa,MAAM,OAAO;AACvC,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAgC;AAC9B,UAAM,MAAM,KAAK,iBAAiB;AAClC,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,uCAAuC,IAAI,OAAO,WAAW;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,aAIf;AACD,QAAI;AAEF,YAAM,gBAAgB,MAAM,KAAK,WAAW,wBAAwB,aAAa;AAAA,QAC/E,WAAW;AAAA,MACb,CAAC;AAED,iBAAW,WAAW,cAAc,OAAO;AAEzC,cAAM,OAAO,MAAM,KAAK,WAAW,qBAAqB,QAAQ,MAAM;AACtE,YAAI,KAAK,OAAO;AACd,iBAAO;AAAA,YACL,UAAU;AAAA,YACV,aAAa,QAAQ,OAAO,SAAS;AAAA,YACrC,SAAS,cAAc,MAAM;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,UAAU,MAAM;AAAA,IAC3B,QAAQ;AACN,aAAO,EAAE,UAAU,MAAM;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAIQ,iBAAiB,QAA4B,UAA+B;AAClF,UAAM,MAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAEA,UAAM,OAAO,KAAK,KAAK,aAAa,mBAAmB;AACvD,kBAAc,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAAA,EACnE;AACF;AASA,eAAsB,oBACpB,SACA,SACA,QACA,OACoC;AACpC,QAAM,WAAW,IAAI,cAAc;AAEnC,MAAI,SAAS,aAAa,GAAG;AAC3B,WAAO,SAAS,iBAAiB,GAAG,UAAU;AAAA,EAChD;AAEA,MAAI;AACF,WAAO,MAAM,SAAS,cAAc,SAAS,SAAS,QAAQ,KAAK;AAAA,EACrE,SAAS,KAAK;AACZ,YAAQ,6CAAoC,IAAc,OAAO,EAAE;AACnE,WAAO;AAAA,EACT;AACF;AAIA,SAAS,iBAAiB,QAAgB,SAAiB,QAA0B;AACnF,QAAM,OAAO,WAAW,QAAQ;AAChC,OAAK,OAAO,MAAM;AAClB,OAAK,OAAO,OAAO;AACnB,aAAW,KAAK,QAAQ;AACtB,SAAK,OAAO,CAAC;AAAA,EACf;AACA,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEA,SAASA,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;;;ACvSA,SAAS,oBAA+D;AACxE,SAAuB,cAAAC,mBAAkB;AACzC,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,UAAS,UAAU,YAAY;AACxC,SAAS,YAAY;AAsBd,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EAER,YAAY,QAAuB;AACjC,SAAK,OAAO,OAAO,QAAQ;AAC3B,SAAK,aAAa,OAAO,cAAc;AAAA,EACzC;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,SAAS,aAAa,CAAC,KAAK,QAAQ;AACxC,WAAK,cAAc,KAAK,GAAG;AAAA,IAC7B,CAAC;AAED,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAO,OAAO,KAAK,MAAM,aAAa,MAAM;AAC1C,cAAM,MAAM,oBAAoB,KAAK,IAAI;AACzC,gBAAQ,IAAI,2BAAoB,GAAG,EAAE;AAGrC,mBAAW,MAAM,YAAY,GAAG,GAAG,GAAG;AACtC,gBAAQ;AAAA,MACV,CAAC;AAED,aAAO,GAAG,SAAS,MAAM;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEQ,cAAc,KAAsB,KAA2B;AACrE,UAAM,MAAM,IAAI,OAAO;AACvB,QAAI,UAAU,+BAA+B,GAAG;AAChD,QAAI,UAAU,gCAAgC,oBAAoB;AAClE,QAAI,UAAU,gCAAgC,cAAc;AAE5D,QAAI,IAAI,WAAW,WAAW;AAC5B,UAAI,UAAU,GAAG;AACjB,UAAI,IAAI;AACR;AAAA,IACF;AAEA,QAAI,QAAQ,eAAe;AACzB,WAAK,aAAa,GAAG;AAAA,IACvB,WAAW,QAAQ,eAAe,IAAI,WAAW,QAAQ;AACvD,WAAK,WAAW,KAAK,GAAG;AAAA,IAC1B,WAAW,QAAQ,cAAc,IAAI,WAAW,QAAQ;AACtD,WAAK,UAAU,KAAK,GAAG;AAAA,IACzB,OAAO;AACL,WAAK,QAAQ,GAAG;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAIQ,aAAa,KAA2B;AAC9C,UAAM,OAAOA,SAAQ;AACrB,UAAM,WAAWD,MAAK,MAAM,aAAa;AAEzC,UAAM,SAAyB;AAAA,MAC7B,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU,GAAG,SAAS,CAAC,IAAI,KAAK,CAAC;AAAA,MACjC,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC7B,QAAQ;AAAA,MACR,QAAQD,YAAWC,MAAK,UAAU,aAAa,cAAc,CAAC,IAAI,UAAU;AAAA,MAC5E,QAAQD,YAAWC,MAAK,UAAU,YAAY,CAAC,IAAI,eAAe;AAAA,MAClE,UAAUD,YAAWC,MAAK,UAAU,YAAY,mBAAmB,CAAC,IAChE,eACA;AAAA,IACN;AAEA,QAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,QAAI,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA,EAIQ,WAAW,KAAsB,KAA2B;AAClE,QAAI,OAAO;AACX,QAAI,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AACzC,QAAI,GAAG,OAAO,MAAM;AAClB,UAAI;AACF,cAAM,EAAE,QAAQ,IAAI,KAAK,MAAM,IAAI;AACnC,cAAM,QAAQ,aAAa,OAAO,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC;AACrE,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,MAClD,QAAQ;AACN,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,OAAO,cAAc,CAAC,CAAC;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAIQ,UAAU,KAAsB,KAA2B;AACjE,QAAI,OAAO;AACX,QAAI,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AACzC,QAAI,GAAG,OAAO,MAAM;AAClB,UAAI;AACF,cAAM,EAAE,QAAQ,IAAI,KAAK,MAAM,IAAI;AACnC,cAAM,UAAU,oBAAI,IAAI;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,MAAM,OAAO,WAAW,EAAE,EAAE,KAAK;AACvC,YAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;AACrB,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI;AAAA,YACF,KAAK,UAAU;AAAA,cACb,QAAQ,yBAAe,GAAG;AAAA,cAC1B,IAAI;AAAA,YACN,CAAC;AAAA,UACH;AACA;AAAA,QACF;AAEA,aAAK,GAAG,KAAK,UAAU,IAAI,GAAG,IAAI,EAAE,SAAS,IAAM,GAAG,CAAC,KAAK,QAAQ,WAAW;AAC7E,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI;AAAA,YACF,KAAK,UAAU;AAAA,cACb,QAAQ,UAAU,UAAU;AAAA,cAC5B,IAAI,CAAC;AAAA,YACP,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,QAAQ;AACN,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,OAAO,cAAc,CAAC,CAAC;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAIQ,QAAQ,KAA2B;AACzC,QAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,QAAI,IAAI,YAAY;AAAA,EACtB;AACF;AAIA,SAAS,aAAa,KAAqB;AACzC,MAAI,eAAe,KAAK,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,aAAa,KAAK,GAAG,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,KAAK,GAAG,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,KAAK,GAAG,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,qBAAqB,KAAK,GAAG,GAAG;AAClC,WAAO;AAAA,EACT;AACA,MAAI,wBAAwB,KAAK,GAAG,GAAG;AACrC,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,KAAK,GAAG,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,YAAY,KAAK,GAAG,GAAG;AACzB,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,KAAK,GAAG,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAIA,SAAS,YAAY,KAAmB;AACtC,QAAM,MACJ,SAAS,MAAM,WACX,SAAS,GAAG,MACZ,SAAS,MAAM,UACb,UAAU,GAAG,MACb,aAAa,GAAG;AAExB,OAAK,KAAK,MAAM;AAAA,EAAC,CAAC;AACpB;AAIA,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AJrMrB,SAAS,gBAAAE,eAAc,iBAAAC,gBAAe,cAAAC,mBAAkB;AACxD,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AACxB,SAAS,uBAAuB;AAIhC,SAAS,cAAoB;AAC3B,UAAQ,IAAIC,OAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOtB,CAAC;AACF,UAAQ,IAAIA,OAAM,MAAM,kCAA2B,CAAC;AACpD,UAAQ,IAAIA,OAAM,KAAK,kFAA4E,CAAC;AACtG;AAIA,eAAe,aAAa,UAAmC;AAC7D,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,OAAG,SAASA,OAAM,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW;AACvD,SAAG,MAAM;AACT,cAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,qBAAqB,OAA2B,UAA0B;AACjF,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,MAAM;AAC1B;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AAEA,QAAM,QAAQ,CAAC,MAAM,MAAM,IAAI;AAC/B,MAAI,QAAQ,QAAQ;AACpB,MAAI,YAAY;AAEhB,SAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;AACpD,aAAS;AACT,iBAAa;AAAA,EACf;AAEA,SAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC;AAChD;AAIA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,YAAY,EACjB,YAAY,4FAAuF,EACnG,QAAQ,OAAO;AAIlB,QACG,QAAQ,MAAM,EACd,YAAY,+CAA+C,EAC3D,OAAO,YAAY;AAClB,cAAY;AACZ,UAAQ,IAAIA,OAAM,MAAM,KAAK,2CAAoC,CAAC;AAElE,iBAAe;AACf,QAAM,UAAU,YAAY;AAG5B,UAAQ,IAAIA,OAAM,KAAK,2KAAmD,CAAC;AAC3E,UAAQ,iBAAiB,MAAM,aAAa,gBAAgB;AAC5D,UAAQ,iBAAiB,MAAM,aAAa,gBAAgB;AAC5D,UAAQ,iBAAiB,MAAM,aAAa,gBAAgB;AAE5D,UAAQ,IAAIA,OAAM,KAAK,+IAAqD,CAAC;AAC7E,UAAQ,kBAAkB,MAAM,aAAa,iBAAiB;AAC9D,UAAQ,kBAAkB,MAAM,aAAa,8CAA8C;AAC3F,MAAI,CAAC,QAAQ,iBAAiB;AAC5B,YAAQ,kBAAkB;AAAA,EAC5B;AAEA,UAAQ,IAAIA,OAAM,KAAK,oJAAqD,CAAC;AAC7E,UAAQ,kBAAkB,MAAM,aAAa,iBAAiB;AAE9D,UAAQ,IAAIA,OAAM,KAAK,qNAAqD,CAAC;AAC7E,UAAQ,aAAa,MAAM,aAAa,4BAA4B;AAGpE,cAAY,OAAO;AAEnB,UAAQ,IAAIA,OAAM,MAAM,mEAA8D,CAAC;AACvF,UAAQ,IAAIA,OAAM,KAAK,6CAA6C,CAAC;AAGrE,QAAM,UAAUF,MAAK,QAAQ,IAAI,GAAG,MAAM;AAC1C,MAAI,CAACD,YAAW,OAAO,GAAG;AACxB,UAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnB,IAAAD,eAAc,SAAS,UAAU;AACjC,YAAQ,IAAII,OAAM,KAAK,+CAA+C,CAAC;AAAA,EACzE;AAEA,UAAQ,IAAIA,OAAM,MAAM,QAAQ,IAAIA,OAAM,KAAK,kBAAkB,IAAIA,OAAM,MAAM,wBAAwB,CAAC;AAC1G,UAAQ,IAAIA,OAAM,MAAM,WAAW,IAAIA,OAAM,KAAK,eAAe,IAAIA,OAAM,MAAM,8BAA8B,CAAC;AAClH,CAAC;AAIH,QACG,QAAQ,OAAO,EACf,YAAY,6CAA6C,EACzD,OAAO,qBAAqB,cAAc,YAAY,EACtD,OAAO,wBAAwB,oBAAoB,EACnD,OAAO,OAAO,SAAS;AACtB,cAAY;AACZ,UAAQ,IAAIA,OAAM,MAAM,KAAK,+BAAwB,KAAK,IAAI;AAAA,CAAQ,CAAC;AAEvE,MAAI;AACF,UAAM,SAAS,WAAW;AAC1B,UAAM,SAAS,IAAI,WAAW,KAAK,IAAI;AACvC,UAAM,OAAO,MAAM,OAAO,MAAM;AAGhC,UAAM,UAAU,KAAK,WAAW,KAAK;AACrC,UAAM,MAAM,IAAI,UAAU,OAAO;AACjC,QAAI,oBAAoB,KAAK,OAAO;AAEpC,YAAQ,IAAIA,OAAM,MAAM,wCAAmC,CAAC;AAC5D,YAAQ,IAAIA,OAAM,MAAM,mBAAmB,IAAIA,OAAM,KAAK,KAAK,IAAI,CAAC;AACpE,YAAQ,IAAIA,OAAM,MAAM,mBAAmB,IAAIA,OAAM,KAAK,OAAO,WAAW,CAAC,CAAC;AAC9E,YAAQ,IAAIA,OAAM,MAAM,mBAAmB,IAAIA,OAAM,KAAK,KAAK,SAAS,CAAC;AACzE,YAAQ,IAAIA,OAAM,MAAM,mBAAmB,IAAIA,OAAM,OAAO,GAAG,KAAK,OAAO,MAAM,CAAC;AAClF,YAAQ,IAAIA,OAAM,MAAM,mBAAmB,IAAIA,OAAM,KAAK,IAAI,KAAK,KAAK,cAAc,EAAE,YAAY,CAAC,CAAC;AACtG,YAAQ,IAAIA,OAAM,MAAM,mBAAmB,IAAIA,OAAM,KAAK,GAAG,YAAY,IAAI,SAAS,EAAE,KAAK,CAAC,IAAI,OAAO,IAAI,WAAW,IAAI,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;AAG/I,UAAM,cAAc,WAAW;AAC/B,QAAI,YAAY,QAAQ,UAAU,YAAY,QAAQ,QAAQ;AAC5D,UAAI;AACF,gBAAQ,IAAIA,OAAM,KAAK,0CAAgC,CAAC;AACxD,cAAM,SAAS,IAAI,aAAa,EAAE,QAAQ,YAAY,OAAO,QAAQ,QAAQ,YAAY,OAAO,QAAQ,QAAQ,YAAY,OAAO,OAAO,CAAC;AAC3I,cAAM,OAAO,MAAM,OAAO,eAAe,KAAK,SAAS;AACvD,4BAAoB,MAAMA,MAAK;AAAA,MACjC,SAAS,KAAK;AACZ,gBAAQ,IAAIA,OAAM,KAAK,4CAAmC,IAAc,OAAO,EAAE,CAAC;AAAA,MACpF;AAAA,IACF;AAEA,YAAQ,IAAIA,OAAM,KAAK,uDAAuD,CAAC;AAC/E,YAAQ,IAAIA,OAAM,KAAK,qDAAqD,CAAC;AAC7E,YAAQ,IAAIA,OAAM,MAAM,QAAQ,IAAIA,OAAM,KAAK,gBAAgB,IAAIA,OAAM,MAAM,wBAAwB,CAAC;AAAA,EAC1G,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI,0BAAsB,IAAc,OAAO;AAAA,CAAI,CAAC;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAIH,QACG,QAAQ,KAAK,EACb,YAAY,iDAAiD,EAC7D,OAAO,qBAAqB,cAAc,YAAY,EACtD,OAAO,wBAAwB,oBAAoB,EACnD,OAAO,cAAc,oCAAoC,EACzD,OAAO,gBAAgB,wBAAwB,EAC/C,OAAO,OAAO,SAAS;AACtB,cAAY;AACZ,UAAQ,IAAIA,OAAM,MAAM,KAAK,8CAAuC,KAAK,IAAI;AAAA,CAAQ,CAAC;AAEtF,MAAI;AACF,UAAM,SAAS,WAAW;AAG1B,UAAM,SAAS,IAAI,WAAW,KAAK,IAAI;AACvC,UAAM,aAAa,MAAM,OAAO,MAAM;AACtC,WAAO,eAAe,OAAO,MAAM,WAAW;AAC9C,YAAQ,IAAIA,OAAM,MAAM,oBAAe,WAAW,UAAU,MAAM,GAAG,CAAC,CAAC,MAAM,WAAW,UAAU,MAAM,EAAE,CAAC,EAAE,CAAC;AAG9G,UAAM,UAAU,KAAK,WAAW,KAAK;AACrC,UAAM,MAAM,IAAI,UAAU,OAAO;AACjC,QAAI,oBAAoB,WAAW,OAAO;AAC1C,QAAI,eAAe;AACnB,UAAM,WAAW,IAAI,SAAS;AAC9B,YAAQ,IAAIA,OAAM,MAAM,uBAAkB,YAAY,SAAS,KAAK,CAAC,IAAI,OAAO,IAAI,WAAW,SAAS,IAAI,CAAC,WAAW,SAAS,KAAK,GAAG,CAAC;AAG1I,UAAM,QAAQ,IAAI,UAAU;AAC5B,UAAM,gBAAgB;AACtB,UAAM,aAAa,MAAM,SAAS;AAClC,YAAQ,IAAIA,OAAM,MAAM,uBAAkB,WAAW,KAAK,KAAK,WAAW,OAAO,KAAK,WAAW,QAAQ,cAAc,WAAW,OAAO,UAAU,CAAC;AAGpJ,UAAM,UAAU,IAAI,cAAc,QAAQ,MAAM;AAChD,QAAI,KAAK,UAAU,OAAO;AACxB,YAAM,QAAQ,MAAM;AACpB,cAAQ,IAAIA,OAAM,MAAM,6CAAwC,CAAC;AAAA,IACnE;AAGA,YAAQ,GAAG,UAAU,CAAC,WAAW;AAE/B,YAAM,WAAW;AAAA,QACf,SAAS,WAAW,OAAO,IAAI,IAAI,OAAO,MAAM,MAAM,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA,QACzF,QAAQ;AAAA,QACR,MAAM,CAAC,OAAO,MAAM,OAAO,MAAM;AAAA,MACnC,CAAC;AAGD,YAAM,SAAS,MAAM,iBAAiB;AAAA,QACpC,aAAa,OAAO;AAAA,QACpB,WAAW,OAAO;AAAA,MACpB,CAAC;AAED,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,mBAAW,KAAK,OAAO,SAAU,SAAQ,IAAIA,OAAM,IAAI,KAAK,CAAC,EAAE,CAAC;AAAA,MAClE;AACA,UAAI,OAAO,YAAY,SAAS,GAAG;AACjC,mBAAW,KAAK,OAAO,YAAa,SAAQ,IAAIA,OAAM,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,MACvE;AAAA,IACF,CAAC;AAED,YAAQ,GAAG,eAAe,CAAC,UAAU;AACnC,YAAM,WAAW;AAAA,QACf,SAAS,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,QAAQ,CAAC,CAAC,KAAK,MAAM,iBAAiB,IAAI,MAAM,EAAE,GAAG,MAAM,eAAe,QAAQ,CAAC,CAAC;AAAA,QAC9H,QAAQ;AAAA,QACR,MAAM,CAAC,MAAM,QAAQ,OAAO;AAAA,QAC5B,UAAU,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,UAAU;AAAA,MACxD,CAAC;AAAA,IACH,CAAC;AAGD,QAAI,KAAK,YAAY,OAAO;AAE1B,YAAM,EAAE,aAAa,IAAI,MAAM,OAAO,uBAAqB;AAC3D,YAAM,eAAe,IAAI,aAAa,OAAO,OAAO,kBAAkB;AACtE,YAAM,UAAU,IAAI,YAAY,QAAQ,QAAQ,SAAS,YAAY;AACrE,YAAM,QAAQ,MAAM;AACpB,cAAQ,IAAIA,OAAM,MAAM,0BAAqB,OAAO,QAAQ,IAAI,IAAI,OAAO,QAAQ,IAAI,EAAE,CAAC;AAAA,IAC5F;AAEA,YAAQ,IAAIA,OAAM,KAAK,0RAAoD,CAAC;AAC5E,YAAQ,IAAIA,OAAM,KAAK,eAAQ,OAAO,kCAAkC,CAAC;AACzE,YAAQ,IAAIA,OAAM,KAAK,0RAAoD,CAAC;AAG5E,WAAO,GAAG,aAAa,CAAC,SAAS;AAC/B,YAAM,QAAO,oBAAI,KAAK,GAAE,mBAAmB;AAC3C,YAAM,OAAO,WAAW,IAAI,SAAS,EAAE,IAAI;AAC3C,cAAQ,OAAO,MAAMA,OAAM,KAAK,MAAM,IAAI,eAAQ,KAAK,QAAQ,QAAQ,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;AAAA,IAC5F,CAAC;AAED,WAAO,GAAG,iBAAiB,CAAC,EAAE,YAAY,WAAW,MAAM;AACzD,YAAM,QAAQ,aAAa;AAC3B,YAAM,QAAQ,QAAQ,IAAIA,OAAM,QAAQA,OAAM;AAC9C,cAAQ,IAAI,MAAM;AAAA,8BAA0B,QAAQ,IAAI,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,CAAC,MAAM,CAAC;AAC1F,UAAI,QAAQ,EAAG,KAAI,KAAK,KAAK;AAAA,IAC/B,CAAC;AAED,YAAQ,GAAG,UAAU,CAAC,WAAW;AAC/B,YAAM,OAAO,OAAO,SAAS,QAAQ,cAAO,OAAO,SAAS,SAAS,cAAO;AAC5E,cAAQ,IAAI,KAAK,IAAI,YAAY,OAAO,KAAK,YAAY,CAAC,IAAI,OAAO,MAAM,MAAM,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,eAAe;AAAA,IACrI,CAAC;AAED,UAAM,GAAG,iBAAiB,CAAC,WAAW;AACpC,cAAQ,IAAIA,OAAM,QAAQ,uBAAgB,OAAO,OAAO,WAAM,OAAO,OAAO,EAAE,CAAC;AAAA,IACjF,CAAC;AAED,QAAI,GAAG,WAAW,CAAC,MAAM,OAAO;AAC9B,cAAQ,IAAIA,OAAM,OAAO;AAAA,yBAAqB,YAAY,IAAI,CAAC,IAAI,IAAI,WAAM,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AAAA,IACvG,CAAC;AAED,QAAI,GAAG,eAAe,CAAC,MAAM,OAAO;AAClC,cAAQ,IAAIA,OAAM,KAAK,KAAK,WAAW,EAAE,CAAC,UAAU,IAAI,WAAM,EAAE,EAAE,CAAC;AAAA,IACrE,CAAC;AAED,QAAI,GAAG,WAAW,CAAC,UAAU;AAC3B,cAAQ,IAAIA,OAAM,OAAO,uCAA6B,KAAK,EAAE,CAAC;AAAA,IAChE,CAAC;AAGD,UAAM,WAAW,YAAY;AAC3B,cAAQ,IAAIA,OAAM,OAAO,gCAA2B,CAAC;AACrD,aAAO,cAAc;AACrB,cAAQ,KAAK;AACb,YAAM,eAAe;AACrB,UAAI,cAAc;AAClB,cAAQ,IAAIA,OAAM,MAAM,mCAA8B,CAAC;AACvD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAG9B,UAAM,IAAI,QAAQ,MAAM;AAAA,IAAC,CAAC;AAAA,EAC5B,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI,6BAAyB,IAAc,OAAO;AAAA,CAAI,CAAC;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAIH,QACG,QAAQ,QAAQ,EAChB,YAAY,2DAA2D,EACvE,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,SAAS,WAAW;AAC1B,UAAM,SAAS,IAAI,WAAW,OAAO,MAAM,IAAI;AAC/C,UAAM,OAAO,MAAM;AAEnB,UAAM,QAAQ,IAAI,UAAU;AAC5B,UAAM,aAAa,MAAM,SAAS;AAClC,UAAM,MAAM,IAAI,UAAU,OAAO,MAAM,IAAI;AAE3C,YAAQ,IAAIA,OAAM,KAAK,2IAAsD,CAAC;AAC9E,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,OAAO,MAAM,IAAI,CAAC;AACzE,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,OAAO,aAAa,CAAC,CAAC;AAC7E,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,OAAO,GAAG,OAAO,QAAQ,EAAE,OAAO,MAAM,CAAC;AAC3F,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,GAAG,YAAY,IAAI,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,IAAI,IAAI,WAAW,IAAI,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;AACxJ,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,GAAG,WAAW,KAAK,KAAK,WAAW,OAAO,KAAK,WAAW,QAAQ,OAAO,WAAW,OAAO,UAAU,CAAC;AAC7J,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,MAAM,IAAI,WAAW,eAAe,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC;AACzG,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,GAAG,OAAO,QAAQ,IAAI,IAAI,OAAO,QAAQ,IAAI,EAAE,CAAC;AAGvG,QAAI,mBAAmB,YAAY,GAAG;AACpC,YAAM,QAAQ,mBAAmB,cAAc;AAC/C,YAAM,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM;AAC3C,cAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,MAAM,GAAG,OAAO,MAAM,IAAI,MAAM,MAAM,eAAe,CAAC;AAAA,IAC1G,OAAO;AACL,cAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,eAAe,CAAC;AAAA,IACzE;AAGA,UAAM,WAAW,YAAY,iBAAiB;AAC9C,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,GAAG,SAAS,MAAM,WAAW,CAAC;AAErF,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI,YAAQ,IAAc,OAAO;AAAA,CAAI,CAAC;AAAA,EAC5D;AACF,CAAC;AAIH,QACG,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,OAAO,MAAM;AACZ,MAAI;AACF,UAAM,SAAS,WAAW;AAC1B,UAAM,MAAM,IAAI,UAAU,OAAO,MAAM,IAAI;AAC3C,YAAQ,IAAI;AACZ,YAAQ,IAAI,IAAI,iBAAiB,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAC9E,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI,YAAQ,IAAc,OAAO;AAAA,CAAI,CAAC;AAAA,EAC5D;AACF,CAAC;AAIH,QACG,QAAQ,MAAM,EACd,YAAY,uDAAuD,EACnE,SAAS,aAAa,iBAAiB,EACvC,OAAO,2BAA2B,2CAA2C,EAC7E,OAAO,OAAO,SAAS,SAAS;AAC/B,MAAI;AACF,UAAM,SAAS,WAAW;AAC1B,UAAM,gBAAgB,OAAO,QAAQ,UAAU;AAE/C,QAAI,CAAC,mBAAmB,YAAY,GAAG;AACrC,cAAQ,IAAIA,OAAM,OAAO,2EAAiE,CAAC;AAG3F,YAAMC,UAAS,IAAI,kBAAkB,aAAa;AAClD,YAAM,YAAY,EAAE,UAAU,aAAa,IAAI,aAAa,QAAQ,MAAM,IAAI,QAAQ,UAAU,aAAa,SAAS,UAAU,KAAK,IAAI,GAAG,aAAa,OAAO,QAAQ,KAAK;AAC7K,YAAMA,QAAO,cAAc,WAAW,OAAO,MAAM,IAAI;AACvD,MAAAA,QAAO,WAAW,aAAa,SAAS,OAAO,MAAM,IAAI;AACzD,cAAQ,IAAID,OAAM,MAAM;AAAA,CAA6B,CAAC;AACtD,MAAAC,QAAO,cAAc;AACrB;AAAA,IACF;AAEA,UAAM,QAAQ,mBAAmB,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM;AACvE,UAAM,SAAS,IAAI,kBAAkB,aAAa;AAElD,QAAI,KAAK,QAAQ;AACf,YAAM,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM;AAC3D,UAAI,CAAC,QAAQ;AACX,gBAAQ,IAAID,OAAM,IAAI,kBAAa,KAAK,MAAM;AAAA,CAAgB,CAAC;AAC/D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,YAAY,MAAM,OAAO,cAAc,QAAQ,OAAO,MAAM,IAAI;AACtE,UAAI,WAAW;AACb,eAAO,WAAW,OAAO,UAAU,SAAS,OAAO,MAAM,IAAI;AAC7D,gBAAQ,IAAIA,OAAM,MAAM,oBAAe,OAAO,QAAQ;AAAA,CAAI,CAAC;AAAA,MAC7D,OAAO;AACL,gBAAQ,IAAIA,OAAM,IAAI,iCAA4B,OAAO,QAAQ;AAAA,CAAI,CAAC;AAAA,MACxE;AAAA,IACF,OAAO;AAEL,UAAI,YAAY;AAChB,iBAAW,QAAQ,OAAO;AACxB,cAAM,KAAK,MAAM,OAAO,cAAc,MAAM,OAAO,MAAM,IAAI;AAC7D,YAAI,GAAI;AAAA,MACV;AAEA,YAAM,OAAO,OAAO,eAAe,SAAS,OAAO,MAAM,IAAI;AAC7D,cAAQ,IAAIA,OAAM,MAAM,2BAAsB,IAAI,IAAI,SAAS;AAAA,CAAU,CAAC;AAAA,IAC5E;AAEA,WAAO,cAAc;AAAA,EACvB,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI,YAAQ,IAAc,OAAO;AAAA,CAAI,CAAC;AAAA,EAC5D;AACF,CAAC;AAIH,QACG,QAAQ,MAAM,EACd,YAAY,kCAAkC,EAC9C;AAAA,EACC,IAAI,QAAQ,MAAM,EACf,YAAY,gCAAgC,EAC5C,OAAO,MAAM;AACZ,UAAM,WAAW,YAAY,iBAAiB;AAC9C,QAAI,SAAS,WAAW,GAAG;AACzB,cAAQ,IAAIA,OAAM,KAAK,qCAAqC,CAAC;AAC7D;AAAA,IACF;AAEA,YAAQ,IAAIA,OAAM,KAAK,+NAAqD,CAAC;AAC7E,eAAW,KAAK,UAAU;AACxB,YAAM,SAAS,EAAE,WAAWA,OAAM,MAAM,UAAU,IAAIA,OAAM,KAAK,UAAU;AAC3E,cAAQ,IAAI,KAAKA,OAAM,MAAM,EAAE,IAAI,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,WAAW;AAAA,IAC3E;AACA,YAAQ,IAAI;AAAA,EACd,CAAC;AACL,EACC;AAAA,EACC,IAAI,QAAQ,OAAO,EAChB,YAAY,wCAAwC,EACpD,SAAS,UAAU,UAAU,EAC7B,OAAO,CAAC,SAAS;AAChB,UAAM,KAAK,YAAY,cAAc,MAAM,yBAAyB,IAAI,EAAE;AAC1E,QAAI,IAAI;AACN,cAAQ,IAAIA,OAAM,MAAM;AAAA,6BAA2B,IAAI,2BAA2B,IAAI;AAAA,CAAK,CAAC;AAAA,IAC9F,OAAO;AACL,cAAQ,IAAIA,OAAM,IAAI;AAAA,gCAA8B,IAAI;AAAA,CAAK,CAAC;AAAA,IAChE;AAAA,EACF,CAAC;AACL,EACC;AAAA,EACC,IAAI,QAAQ,QAAQ,EACjB,YAAY,8BAA8B,EAC1C,SAAS,UAAU,UAAU,EAC7B,OAAO,CAAC,SAAS;AAChB,UAAM,cAAc,KAAK,WAAW,OAAO,IAAI,OAAO,QAAQ,IAAI;AAClE,gBAAY,cAAc,WAAW;AAAA,EACvC,CAAC;AACL,EACC;AAAA,EACC,IAAI,QAAQ,MAAM,EACf,YAAY,yBAAyB,EACrC,SAAS,UAAU,UAAU,EAC7B,OAAO,CAAC,SAAS;AAChB,UAAM,cAAc,KAAK,WAAW,OAAO,IAAI,OAAO,QAAQ,IAAI;AAClE,UAAM,KAAK,YAAY,YAAY,WAAW;AAC9C,QAAI,IAAI;AACN,cAAQ,IAAIA,OAAM,MAAM;AAAA,uBAAqB,WAAW;AAAA,CAAK,CAAC;AAAA,IAChE,OAAO;AACL,cAAQ,IAAIA,OAAM,IAAI;AAAA,+BAA6B,WAAW;AAAA,CAAK,CAAC;AAAA,IACtE;AAAA,EACF,CAAC;AACL;AAIF,QACG,QAAQ,OAAO,EACf,YAAY,0CAA0C,EACtD,OAAO,MAAM;AACZ,MAAI,CAAC,mBAAmB,YAAY,GAAG;AACrC,YAAQ,IAAIA,OAAM,OAAO,kEAAwD,CAAC;AAClF;AAAA,EACF;AAEA,QAAM,QAAQ,mBAAmB,cAAc;AAC/C,UAAQ,IAAIA,OAAM,KAAK,kLAAqD,CAAC;AAE7E,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,KAAK,SAASA,OAAM,MAAM,eAAU,IAAIA,OAAM,IAAI,gBAAW;AAC5E,YAAQ,IAAI,KAAK,MAAM,KAAKA,OAAM,MAAM,KAAK,QAAQ,CAAC,KAAKA,OAAM,KAAK,KAAK,EAAE,CAAC,KAAKA,OAAM,KAAK,KAAK,EAAE,CAAC,EAAE;AAAA,EAC1G;AACA,UAAQ,IAAI;AACd,CAAC;AAIH,QACG,QAAQ,QAAQ,EAChB,YAAY,uCAAuC,EACnD,OAAO,MAAM;AACZ,MAAI;AACF,UAAM,SAAS,WAAW;AAC1B,UAAM,WAAW,aAAa,MAAM;AACpC,YAAQ,IAAIA,OAAM,KAAK,wLAAsD,CAAC;AAC9E,YAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AACzF,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI,YAAQ,IAAc,OAAO;AAAA,CAAI,CAAC;AAAA,EAC5D;AACF,CAAC;AAIH,QACG,QAAQ,OAAO,EACf,YAAY,mEAAyD,EACrE,SAAS,WAAW,cAAc,EAClC,OAAO,OAAO,UAAU;AACvB,QAAM,QAAQ,IAAI,UAAU;AAC5B,QAAM,QAAQ,MAAM,SAAS;AAE7B,UAAQ,IAAIA,OAAM,KAAK,2EAAuD,CAAC;AAC/E,UAAQ,IAAIA,OAAM,MAAM,eAAe,IAAIA,OAAM,MAAM,GAAG,MAAM,KAAK,EAAE,IAAIA,OAAM,KAAK,oCAAoC,CAAC;AAC3H,UAAQ,IAAIA,OAAM,MAAM,eAAe,IAAIA,OAAM,KAAK,GAAG,MAAM,OAAO,EAAE,IAAIA,OAAM,KAAK,2BAA2B,CAAC;AACnH,UAAQ,IAAIA,OAAM,MAAM,eAAe,IAAIA,OAAM,QAAQ,GAAG,MAAM,QAAQ,EAAE,IAAIA,OAAM,KAAK,+BAA+B,CAAC;AAC3H,UAAQ,IAAIA,OAAM,MAAM,eAAe,IAAIA,OAAM,KAAK,GAAG,MAAM,KAAK,uBAAuB,CAAC;AAC5F,UAAQ,IAAIA,OAAM,MAAM,eAAe,IAAIA,OAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;AACxE,UAAQ,IAAIA,OAAM,MAAM,eAAe,IAAIA,OAAM,KAAK,GAAG,MAAM,OAAO,EAAE,CAAC;AACzE,UAAQ,IAAIA,OAAM,MAAM,eAAe,IAAIA,OAAM,MAAM,IAAI,MAAM,eAAe,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC;AACnG,UAAQ,IAAIA,OAAM,MAAM,eAAe,IAAIA,OAAM,KAAK,GAAG,MAAM,YAAY,YAAY,CAAC;AAExF,MAAI,OAAO;AACT,UAAM,UAAU,MAAM,OAAO,OAAO,CAAC;AACrC,YAAQ,IAAIA,OAAM,KAAK;AAAA,0BAAmB,KAAK;AAAA,CAA8B,CAAC;AAE9E,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAIA,OAAM,KAAK,0BAA0B,CAAC;AAAA,IACpD,OAAO;AACL,iBAAW,SAAS,SAAS;AAC3B,cAAM,YAAY,MAAM,SAAS,UAAUA,OAAM,QAAQ,MAAM,SAAS,YAAYA,OAAM,OAAOA,OAAM;AACvG,gBAAQ,IAAI,KAAK,UAAU,IAAI,MAAM,KAAK,YAAY,CAAC,GAAG,CAAC,IAAIA,OAAM,KAAK,MAAM,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AAAA,MACzG;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,WAAW;AACjC,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,IAAIA,OAAM,KAAK,iMAAqD,CAAC;AAC7E,eAAW,UAAU,QAAQ,MAAM,EAAE,GAAG;AACtC,YAAM,OAAO,OAAO,mBAAmB,IAAI,WAAM;AACjD,YAAM,UAAU,OAAO,SAAS,YAAYA,OAAM,KAAK,KAAK,IAAIA,OAAM,QAAQ,KAAK;AACnF,cAAQ,IAAI,KAAK,IAAI,IAAI,OAAO,IAAIA,OAAM,MAAM,OAAO,OAAO,CAAC,WAAMA,OAAM,KAAK,OAAO,UAAU,CAAC,EAAE;AAAA,IACtG;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,kBAAkB;AACrC,MAAI,KAAK,SAAS,GAAG;AACnB,YAAQ,IAAIA,OAAM,KAAK,iMAAqD,CAAC;AAC7E,eAAW,OAAO,KAAK,MAAM,EAAE,GAAG;AAChC,cAAQ,IAAI,eAAQA,OAAM,KAAK,IAAI,QAAQ,CAAC,EAAE;AAAA,IAChD;AAAA,EACF;AAEA,UAAQ,IAAI;AACd,CAAC;AAIH,QACG,QAAQ,MAAM,EACd,YAAY,sDAAsD,EAClE,SAAS,WAAW,0CAA0C,EAC9D,OAAO,mBAAmB,0BAA0B,IAAI,EACxD,OAAO,aAAa,2CAA2C,EAC/D,OAAO,UAAU,4BAA4B,EAC7C,OAAO,CAAC,OAAO,SAAS;AACvB,MAAI;AACF,UAAM,UAAU,QAAQ,KAAK,OAAO;AACpC,UAAM,QAAQ,qBAAqB,KAAK,OAA6B,EAAE;AAEvE,UAAM,WAAW,yBAAyB,EAAE,QAAQ,CAAC;AACrD,UAAM,UAAU,wBAAwB,QAAQ;AAChD,UAAM,UAAU,QACZ,oBAAoB,UAAU,OAAO,KAAK,GAAG,KAAK,IAClD,CAAC;AAEL,QAAI,KAAK,MAAM;AACb,YAAM,UAAU;AAAA,QACd;AAAA,QACA,MAAM,SAAS,KAAK,MAAM,IAAI,CAAC,UAAU;AAAA,UACvC,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,eAAe,KAAK;AAAA,UACpB,OAAO,KAAK;AAAA,UACZ,gBAAgB,KAAK,QAAQ;AAAA,UAC7B,WAAW,KAAK;AAAA,QAClB,EAAE;AAAA,QACF,YAAY;AAAA,UACV,aAAa,SAAS,WAAW;AAAA,UACjC,OAAO,SAAS,WAAW;AAAA,UAC3B,WAAW,SAAS,WAAW;AAAA,UAC/B,gBAAgB,SAAS,WAAW,QAAQ;AAAA,QAC9C;AAAA,QACA,QAAQ,QACJ;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,QACF,IACA;AAAA,MACN;AAEA,cAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C;AAAA,IACF;AAEA,YAAQ,IAAIA,OAAM,KAAK,kHAAsD,CAAC;AAC9E,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,KAAK,QAAQ,WAAW,EAAE,YAAY,CAAC,CAAC;AACnG,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,MAAM,GAAG,QAAQ,KAAK,KAAK,QAAQ,IAAIA,OAAM,KAAK,KAAK,QAAQ,KAAK,aAAa,cAAc,YAAY,QAAQ,KAAK,KAAK,CAAC,GAAG,CAAC;AACpL,YAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,MAAM,GAAG,QAAQ,WAAW,WAAW,cAAc,IAAIA,OAAM,KAAK,KAAK,QAAQ,WAAW,KAAK,WAAW,QAAQ,WAAW,SAAS,aAAa,CAAC;AAExM,YAAQ,IAAIA,OAAM,KAAK,0NAAqD,CAAC;AAC7E,eAAW,QAAQ,SAAS,KAAK,OAAO;AACtC,YAAM,UAAU,KAAK,YACjB,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY,IACrC;AACJ,cAAQ;AAAA,QACN,KAAKA,OAAM,MAAM,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,IAAIA,OAAM,MAAM,OAAO,KAAK,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,WAAWA,OAAM,KAAK,IAAI,KAAK,aAAa,QAAQ,YAAY,KAAK,KAAK,CAAC,aAAa,OAAO,GAAG,CAAC;AAAA,MAC1L;AAAA,IACF;AAEA,QAAI,OAAO;AACT,cAAQ,IAAIA,OAAM,KAAK;AAAA,0BAAmB,KAAK;AAAA,CAA6B,CAAC;AAE7E,UAAI,QAAQ,WAAW,GAAG;AACxB,gBAAQ,IAAIA,OAAM,KAAK,qBAAqB,CAAC;AAAA,MAC/C,OAAO;AACL,mBAAW,SAAS,SAAS;AAC3B,gBAAM,UAAU,MAAM,SAAS,QAC3BA,OAAM,KAAK,OAAO,IAClBA,OAAM,QAAQ,OAAO;AAEzB,kBAAQ,IAAI,KAAK,OAAO,IAAIA,OAAM,MAAM,MAAM,KAAK,CAAC,EAAE;AACtD,kBAAQ,IAAI,UAAUA,OAAM,KAAK,MAAM,IAAI,CAAC,GAAG,MAAM,WAAWA,OAAM,KAAK,WAAM,MAAM,QAAQ,EAAE,IAAI,EAAE,EAAE;AAAA,QAC3G;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI,YAAQ,IAAc,OAAO;AAAA,CAAI,CAAC;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAIH,QACG,QAAQ,IAAI,EACZ,YAAY,wEAAmE,EAC/E,OAAO,qBAAqB,cAAc,YAAY,EACtD,OAAO,wBAAwB,oBAAoB,EACnD,OAAO,eAAe,4CAA4C,EAClE,OAAO,OAAO,SAAS;AACtB,cAAY;AACZ,QAAM,eAAe,IAAI;AACzB,UAAQ,IAAI;AAEZ,MAAI;AAEF,UAAM,YAAY,+BAA0B;AAC5C,mBAAe;AACf,UAAM,UAAU,YAAY;AAC5B,UAAM,YAAY,CAAC,KAAK,aAAa,CAAC,QAAQ,kBAAkB,CAAC,QAAQ;AAEzE,QAAI,WAAW;AACb,cAAQ,IAAIA,OAAM,OAAO,gEAA2D,CAAC;AACrF,cAAQ,IAAIA,OAAM,KAAK,yMAAmD,CAAC;AAE3E,UAAI,CAAC,QAAQ,YAAY;AACvB,gBAAQ,aAAa,MAAM,aAAa,mCAAmC;AAAA,MAC7E;AACA,UAAI,CAAC,QAAQ,gBAAgB;AAC3B,gBAAQ,iBAAiB,MAAM,aAAa,gBAAgB;AAAA,MAC9D;AACA,UAAI,CAAC,QAAQ,gBAAgB;AAC3B,gBAAQ,iBAAiB,MAAM,aAAa,gBAAgB;AAAA,MAC9D;AAEA,cAAQ,IAAIA,OAAM,KAAK,6FAAqD,CAAC;AAC7E,UAAI,CAAC,QAAQ,gBAAgB;AAC3B,cAAM,MAAM,MAAM,aAAa,gBAAgB;AAC/C,YAAI,IAAK,SAAQ,iBAAiB;AAAA,MACpC;AACA,UAAI,CAAC,QAAQ,iBAAiB;AAC5B,cAAM,KAAK,MAAM,aAAa,iBAAiB;AAC/C,YAAI,GAAI,SAAQ,kBAAkB;AAAA,MACpC;AACA,UAAI,CAAC,QAAQ,iBAAiB;AAC5B,cAAM,KAAK,MAAM,aAAa,iBAAiB;AAC/C,YAAI,GAAI,SAAQ,kBAAkB;AAAA,MACpC;AAEA,kBAAY,OAAO;AACnB,cAAQ,IAAIA,OAAM,MAAM,+DAAqD,CAAC;AAAA,IAChF,OAAO;AACL,cAAQ,IAAIA,OAAM,MAAM,qDAA2C,CAAC;AAAA,IACtE;AAGA,UAAM,YAAY,+BAA0B;AAC5C,YAAQ,IAAI;AACZ,UAAM,qBAAqB;AAE3B,UAAM,SAAS,WAAW;AAC1B,UAAM,SAAS,IAAI,WAAW,KAAK,IAAI;AACvC,UAAM,aAAa,MAAM,OAAO,MAAM;AACtC,WAAO,eAAe,OAAO,MAAM,WAAW;AAE9C,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,MAAM,yBAAoB,CAAC;AAC7C,YAAQ,IAAIA,OAAM,MAAM,kBAAkB,IAAIA,OAAM,KAAK,WAAW,SAAS,CAAC;AAC9E,YAAQ,IAAIA,OAAM,MAAM,kBAAkB,IAAIA,OAAM,OAAO,GAAG,WAAW,OAAO,MAAM,CAAC;AAGvF,UAAM,UAAU,KAAK,WAAW,KAAK;AACrC,UAAM,MAAM,IAAI,UAAU,OAAO;AACjC,QAAI,oBAAoB,WAAW,OAAO;AAC1C,QAAI,eAAe;AACnB,UAAM,WAAW,IAAI,SAAS;AAC9B,YAAQ;AAAA,MACNA,OAAM,MAAM,8BAAyB,IACnCA,OAAM,KAAK,GAAG,YAAY,SAAS,KAAK,CAAC,IAAI,OAAO,IAAI,WAAW,SAAS,IAAI,CAAC,EAAE;AAAA,IACvF;AAGA,UAAM,QAAQ,IAAI,UAAU;AAC5B,UAAM,gBAAgB;AACtB,UAAM,QAAQ,MAAM,SAAS;AAC7B,YAAQ,IAAIA,OAAM,MAAM,6BAAwB,IAAIA,OAAM,KAAK,GAAG,MAAM,KAAK,KAAK,MAAM,OAAO,KAAK,MAAM,QAAQ,GAAG,CAAC;AAGtH,UAAM,UAAU,IAAI,cAAc,QAAQ,MAAM;AAChD,UAAM,QAAQ,MAAM;AACpB,YAAQ,IAAIA,OAAM,MAAM,mCAA8B,CAAC;AAGvD,YAAQ,GAAG,UAAU,CAAC,WAAW;AAC/B,YAAM,WAAW;AAAA,QACf,SAAS,WAAW,OAAO,IAAI,IAAI,OAAO,MAAM,MAAM,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA,QACzF,QAAQ;AAAA,QACR,MAAM,CAAC,OAAO,MAAM,OAAO,MAAM;AAAA,MACnC,CAAC;AAAA,IACH,CAAC;AAGD,QAAI,OAAO,QAAQ,UAAU,OAAO,QAAQ,QAAQ;AAClD,UAAI;AACF,cAAM,SAAS,IAAI,aAAa,EAAE,QAAQ,OAAO,OAAO,QAAQ,QAAQ,OAAO,OAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,CAAC;AAC5H,cAAM,OAAO,MAAM,OAAO,eAAe,WAAW,SAAS;AAC7D,4BAAoB,MAAMA,MAAK;AAAA,MACjC,SAAS,KAAK;AACZ,gBAAQ,IAAIA,OAAM,KAAK,4CAAmC,IAAc,OAAO,EAAE,CAAC;AAAA,MACpF;AAAA,IACF;AAGA,QAAI;AACF,YAAM,SAAS,CAAC,gBAAgB,cAAc,iBAAiB,YAAY;AAC3E,YAAM,YAAY,MAAM,oBAAoB,OAAO,WAAW,GAAG,SAAS,QAAQ,CAAC,QAAQ,QAAQ,IAAI,GAAG,CAAC;AAC3G,UAAI,WAAW;AACb,gBAAQ,IAAIA,OAAM,MAAM,+BAA0B,UAAU,YAAY,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;AAAA,MAC3F;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,IAAIA,OAAM,KAAK,8CAAqC,IAAc,OAAO,EAAE,CAAC;AAAA,IACtF;AAGA,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,uBAAqB;AAC3D,UAAM,eAAe,IAAI,aAAa,OAAO,OAAO,kBAAkB;AACtE,UAAM,UAAU,IAAI,YAAY,QAAQ,QAAQ,SAAS,YAAY;AACrE,UAAM,QAAQ,MAAM;AACpB,YAAQ,IAAIA,OAAM,MAAM,0BAAqB,OAAO,QAAQ,IAAI,IAAI,OAAO,QAAQ,IAAI,EAAE,CAAC;AAG1F,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,wUAA0D,CAAC;AACjG,YAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,eAAQ,OAAO,oCAAoC,CAAC;AAC1F,YAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,wUAA0D,CAAC;AACjG,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,2BAA2B,CAAC;AACnD,YAAQ,IAAIA,OAAM,KAAK,8CAAyC,CAAC;AACjE,YAAQ,IAAIA,OAAM,KAAK,+DAA0D,CAAC;AAClF,YAAQ,IAAIA,OAAM,KAAK,kDAA6C,CAAC;AACrE,YAAQ,IAAI;AAGZ,WAAO,GAAG,aAAa,CAAC,SAAS;AAC/B,YAAM,QAAO,oBAAI,KAAK,GAAE,mBAAmB;AAC3C,YAAM,OAAO,WAAW,IAAI,SAAS,EAAE,IAAI;AAC3C,cAAQ,OAAO,MAAMA,OAAM,KAAK,MAAM,IAAI,eAAQ,KAAK,QAAQ,QAAQ,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;AAAA,IAC5F,CAAC;AAED,WAAO,GAAG,iBAAiB,CAAC,EAAE,YAAY,WAAW,MAAM;AACzD,YAAM,QAAQ,aAAa;AAC3B,YAAM,QAAQ,QAAQ,IAAIA,OAAM,QAAQA,OAAM;AAC9C,cAAQ,IAAI,MAAM;AAAA,cAAU,QAAQ,IAAI,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,CAAC,MAAM,CAAC;AAC1E,UAAI,QAAQ,EAAG,KAAI,KAAK,KAAK;AAAA,IAC/B,CAAC;AAED,YAAQ,GAAG,UAAU,CAAC,WAAW;AAC/B,YAAM,OAAO,OAAO,SAAS,QAAQ,cAAO,OAAO,SAAS,SAAS,cAAO;AAC5E,cAAQ,IAAI,KAAK,IAAI,IAAI,OAAO,KAAK,YAAY,CAAC,IAAI,OAAO,MAAM,MAAM,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,IAAI;AAAA,IAClH,CAAC;AAED,UAAM,GAAG,iBAAiB,CAAC,WAAW;AACpC,cAAQ,IAAIA,OAAM,QAAQ,eAAQ,OAAO,OAAO,WAAM,OAAO,OAAO,EAAE,CAAC;AAAA,IACzE,CAAC;AAED,QAAI,GAAG,WAAW,CAAC,MAAM,OAAO;AAC9B,cAAQ,IAAIA,OAAM,OAAO;AAAA,yBAAqB,YAAY,IAAI,CAAC,WAAM,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AAAA,IAC/F,CAAC;AAGD,UAAM,WAAW,YAAY;AAC3B,cAAQ,IAAIA,OAAM,OAAO,gCAA2B,CAAC;AACrD,aAAO,cAAc;AACrB,cAAQ,KAAK;AACb,YAAM,eAAe;AACrB,UAAI,cAAc;AAClB,cAAQ,IAAIA,OAAM,MAAM,mCAA8B,CAAC;AACvD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAE9B,UAAM,IAAI,QAAQ,MAAM;AAAA,IAAC,CAAC;AAAA,EAC5B,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI;AAAA,mBAAkB,IAAc,OAAO;AAAA,CAAI,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAIH,QACG,QAAQ,KAAK,EACb,YAAY,2DAA2D,EACvE,OAAO,MAAM;AACZ,QAAM,MAAM,oBAAoB;AAEhC,UAAQ,GAAG,UAAU,MAAM;AACzB,QAAI,KAAK;AACT,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACD,UAAQ,GAAG,WAAW,MAAM;AAC1B,QAAI,KAAK;AACT,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,YAAY,6CAA6C,EACzD,OAAO,YAAY,qBAAqB,EACxC,OAAO,OAAO,SAAS;AACtB,MAAI,KAAK,QAAQ;AACf,iBAAa;AAAA,EACf,OAAO;AACL,UAAM,eAAe,GAAI;AAAA,EAC3B;AACF,CAAC;AAIH,QACG,QAAQ,MAAM,EACd,YAAY,sFAAiF,EAC7F,SAAS,aAAa,gDAAgD,EACtE,OAAO,OAAO,YAAqB;AAClC,MAAI;AACF,UAAM,SAAS,WAAW;AAC1B,QAAI,CAAC,OAAO,QAAQ,UAAU,CAAC,OAAO,QAAQ,QAAQ;AACpD,cAAQ,IAAIA,OAAM,IAAI,iDAA4C,CAAC;AACnE,cAAQ,IAAIA,OAAM,KAAK,0BAA0B,CAAC;AAClD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,YAAY,MAAM;AAC/B,UAAI;AACF,cAAM,SAAS,IAAI,WAAW,YAAY;AAE1C,cAAM,UAAUF,MAAKC,SAAQ,GAAG,eAAe,YAAY;AAC3D,YAAIF,YAAW,OAAO,EAAG,QAAOF,cAAa,SAAS,OAAO,EAAE,KAAK;AACpE,eAAO;AAAA,MACT,QAAQ;AAAE,eAAO;AAAA,MAAI;AAAA,IACvB,GAAG;AAEH,QAAI,CAAC,QAAQ;AACX,cAAQ,IAAIK,OAAM,IAAI,qDAAgD,CAAC;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,IAAIA,OAAM,KAAK;AAAA,uBAAmB,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC;AAAA,CAAI,CAAC;AAEvF,UAAM,SAAS,IAAI,aAAa;AAAA,MAC9B,QAAQ,OAAO,OAAO;AAAA,MACtB,QAAQ,OAAO,OAAO;AAAA,MACtB,QAAQ,OAAO,OAAO;AAAA,IACxB,CAAC;AAED,UAAM,OAAO,MAAM,OAAO,eAAe,MAAM;AAC/C,wBAAoB,MAAMA,MAAK;AAAA,EACjC,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI,yBAAqB,IAAc,OAAO;AAAA,CAAI,CAAC;AAAA,EACzE;AACF,CAAC;AAIH,QACG,QAAQ,UAAU,EAClB,YAAY,yDAAyD,EACrE,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,SAAS,WAAW;AAC1B,UAAM,SAAS,IAAI,WAAW,YAAY;AAC1C,UAAM,OAAO,MAAM;AAEnB,UAAM,WAAW,IAAI,cAAc;AAGnC,QAAI,SAAS,aAAa,GAAG;AAC3B,YAAM,MAAM,SAAS,iBAAiB;AACtC,UAAI,KAAK;AACP,gBAAQ,IAAIA,OAAM,MAAM,2CAAsC,CAAC;AAC/D,gBAAQ,IAAIA,OAAM,MAAM,aAAa,IAAIA,OAAM,KAAK,IAAI,OAAO,WAAW,CAAC;AAC3E,gBAAQ,IAAIA,OAAM,MAAM,aAAa,IAAIA,OAAM,KAAK,IAAI,OAAO,WAAW,CAAC;AAC3E,gBAAQ,IAAIA,OAAM,MAAM,aAAa,IAAIA,OAAM,KAAK,IAAI,OAAO,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC;AAChG,gBAAQ,IAAIA,OAAM,MAAM,aAAa,IAAIA,OAAM,KAAK,IAAI,OAAO,OAAO,CAAC;AACvE,gBAAQ,IAAIA,OAAM,MAAM,aAAa,IAAIA,OAAM,KAAK,IAAI,OAAO,CAAC;AAChE,gBAAQ,IAAI;AACZ,gBAAQ,IAAIA,OAAM,KAAK,mDAAmD,IAAI,OAAO,WAAW;AAAA,CAAmB,CAAC;AACpH;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAIA,OAAM,KAAK,4DAAkD,CAAC;AAC1E,UAAM,SAAS,CAAC,gBAAgB,cAAc,iBAAiB,cAAc,kBAAkB;AAC/F,UAAM,SAAS,MAAM,SAAS;AAAA,MAC5B,OAAO,WAAW;AAAA,MAClB;AAAA,MACA;AAAA,MACA,CAAC,QAAQ,QAAQ,IAAI,GAAG;AAAA,IAC1B;AAEA,YAAQ,IAAIA,OAAM,MAAM,yCAAoC,CAAC;AAC7D,YAAQ,IAAIA,OAAM,MAAM,kBAAkB,IAAIA,OAAM,KAAK,OAAO,WAAW,CAAC;AAC5E,YAAQ,IAAIA,OAAM,MAAM,kBAAkB,IAAIA,OAAM,KAAK,OAAO,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC;AACjG,YAAQ,IAAIA,OAAM,MAAM,kBAAkB,IAAIA,OAAM,KAAK,OAAO,YAAY,CAAC;AAC7E,YAAQ,IAAIA,OAAM,MAAM,kBAAkB,IAAIA,OAAM,KAAK,OAAO,OAAO,CAAC;AACxE,YAAQ,IAAIA,OAAM,MAAM,kBAAkB,IAAIA,OAAM,KAAK,0CAA0C,CAAC;AACpG,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,8CAA8C,OAAO,WAAW;AAAA,CAAmB,CAAC;AAAA,EACvH,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI,iCAA6B,IAAc,OAAO;AAAA,CAAI,CAAC;AAAA,EACjF;AACF,CAAC;AAIH,QACG,QAAQ,UAAU,EAClB,YAAY,yCAAyC,EACrD,OAAO,MAAM;AACZ,QAAM,WAAW,IAAI,cAAc;AACnC,QAAM,MAAM,SAAS,iBAAiB;AAEtC,MAAI,CAAC,KAAK;AACR,YAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,qEAA2D,CAAC;AAC7F;AAAA,EACF;AAEA,UAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,6CAAmC,CAAC;AACrE,UAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,OAAO,WAAW,CAAC;AAC9E,UAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,OAAO,WAAW,CAAC;AAC9E,UAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,OAAO,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC;AACnG,UAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,OAAO,OAAO,CAAC;AAC1E,UAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,OAAO,YAAY,CAAC;AAC/E,UAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,OAAO,CAAC;AACnE,UAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,SAAS,IAAI,CAAC;AACzE,UAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,SAAS,OAAO,KAAK,IAAI,CAAC,CAAC;AACtF,UAAQ,IAAIA,OAAM,MAAM,gBAAgB,IAAIA,OAAM,KAAK,IAAI,SAAS,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC;AACrG,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,mDAAmD,IAAI,OAAO,WAAW;AAAA,CAAmB,CAAC;AACtH,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,YAAY,6DAA6D,EACzE,OAAO,qBAAqB,eAAe,MAAM,EACjD,OAAO,OAAO,SAAS;AACtB,QAAM,OAAO,SAAS,KAAK,MAAM,EAAE,KAAK;AACxC,UAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE;AAAA,mDAA+C,IAAI;AAAA,CAAI,CAAC;AAEzF,QAAM,SAAS,IAAI,cAAc,EAAE,KAAK,CAAC;AACzC,QAAM,OAAO,MAAM;AAGnB,QAAM,IAAI,QAAQ,MAAM;AAAA,EAAC,CAAC;AAC5B,CAAC;AAIH,QAAQ,MAAM;","names":["chalk","chalk","Connection","PublicKey","LAMPORTS_PER_SOL","sleep","existsSync","join","homedir","readFileSync","writeFileSync","existsSync","join","homedir","chalk","client"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/entry.ts","../../src/cli/animations.ts","../../src/onchain/helius-client.ts","../../src/registry/agent-registry.ts","../../src/nanobot/server.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * ╔══════════════════════════════════════════════════════════════════════╗\n * ║ NANOSOLANA TAMAGOBOT — CLI Entry ║\n * ║ A GoBot on Solana · Physical Companion: TamaGOchi ║\n * ║ By NanoSolana Labs ║\n * ╚══════════════════════════════════════════════════════════════════════╝\n *\n * The `nanosolana` command — one-shot interface for:\n * - Birthing agents with Solana wallets + TamaGOchi pets\n * - Starting the OODA trading engine (RSI + EMA + ATR)\n * - Communicating with nano bots across Tailscale mesh\n * - ClawVault 3-tier memory (known → learned → inferred)\n * - TamaGOchi pet whose mood/evolution is driven by trades\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadConfig, saveSecrets, loadSecrets, redactConfig, ensureNanoHome } from \"../config/vault.js\";\nimport { NanoWallet } from \"../wallet/manager.js\";\nimport { TradingEngine } from \"../trading/engine.js\";\nimport { ClawVault } from \"../memory/clawvault.js\";\nimport { NanoGateway } from \"../gateway/server.js\";\nimport { TamaGOchi, STAGE_EMOJI, MOOD_EMOJI } from \"../pet/tamagochi.js\";\nimport { TailscaleDiscovery, TmuxManager, NanoNetworkClient } from \"../network/mesh.js\";\nimport { getNanoKnowledgeSnapshot, getNanoKnowledgeSummary, searchNanoKnowledge } from \"../docs/integration.js\";\nimport { playStartupAnimation, lobsterWalk, animateLobster, printLobster, startDvdScreensaver, createSpinner, runWithSpinner } from \"./animations.js\";\nimport { HeliusClient, printWalletSnapshot } from \"../onchain/helius-client.js\";\nimport { AgentRegistry, registerOnHeartbeat } from \"../registry/agent-registry.js\";\nimport { NanoBotServer } from \"../nanobot/server.js\";\nimport { readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createInterface } from \"node:readline\";\n\n// ── Banner ────────────────────────────────────────────────────\n\nfunction printBanner(): void {\n console.log(chalk.cyan(`\n ███╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗ █████╗ ███╗ ██╗ █████╗\n ████╗ ██║██╔══██╗████╗ ██║██╔═══██╗██╔════╝██╔═══██╗██║ ██╔══██╗████╗ ██║██╔══██╗\n ██╔██╗ ██║███████║██╔██╗ ██║██║ ██║███████╗██║ ██║██║ ███████║██╔██╗ ██║███████║\n ██║╚██╗██║██╔══██║██║╚██╗██║██║ ██║╚════██║██║ ██║██║ ██╔══██║██║╚██╗██║██╔══██║\n ██║ ╚████║██║ ██║██║ ╚████║╚██████╔╝███████║╚██████╔╝███████╗██║ ██║██║ ╚████║██║ ██║\n ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝\n `));\n console.log(chalk.white(\" 🐹 NanoSolana TamaGObot\"));\n console.log(chalk.gray(\" A GoBot on Solana · Physical Companion: TamaGOchi · By NanoSolana Labs\\n\"));\n}\n\n// ── Helpers ────────────────────────────────────────────────────\n\nasync function promptSecret(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.yellow(` ${question}: `), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction parsePositiveInteger(value: string | undefined, fallback: number): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return fallback;\n }\n\n return Math.floor(parsed);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unitIndex = 0;\n\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n\n return `${value.toFixed(1)} ${units[unitIndex]}`;\n}\n\n// ── CLI Program ────────────────────────────────────────────────\n\nconst program = new Command();\n\nprogram\n .name(\"nanosolana\")\n .description(\"NanoSolana TamaGObot — Autonomous Solana trading intelligence with a virtual pet soul\")\n .version(\"0.1.0\");\n\n// ── nano init ────────────────────────────────────────────────\n\nprogram\n .command(\"init\")\n .description(\"Initialize Nano Solana and configure API keys\")\n .action(async () => {\n printBanner();\n console.log(chalk.white.bold(\" 🔧 Initializing Nano Solana...\\n\"));\n\n ensureNanoHome();\n const secrets = loadSecrets();\n\n // Prompt for API keys\n console.log(chalk.cyan(\" ── Helius (Solana RPC) ──────────────────────\\n\"));\n secrets.HELIUS_RPC_URL = await promptSecret(\"Helius RPC URL\");\n secrets.HELIUS_API_KEY = await promptSecret(\"Helius API Key\");\n secrets.HELIUS_WSS_URL = await promptSecret(\"Helius WSS URL\");\n\n console.log(chalk.cyan(\"\\n ── Birdeye (Token Analytics) ────────────────\\n\"));\n secrets.BIRDEYE_API_KEY = await promptSecret(\"Birdeye API Key\");\n secrets.BIRDEYE_WSS_URL = await promptSecret(\"Birdeye WSS URL (or press Enter for default)\");\n if (!secrets.BIRDEYE_WSS_URL) {\n secrets.BIRDEYE_WSS_URL = \"wss://public-api.birdeye.so/socket\";\n }\n\n console.log(chalk.cyan(\"\\n ── Jupiter (DEX Aggregator) ─────────────────\\n\"));\n secrets.JUPITER_API_KEY = await promptSecret(\"Jupiter API Key\");\n\n console.log(chalk.cyan(\"\\n ── AI Provider ──────────────────────────────\\n\"));\n secrets.AI_API_KEY = await promptSecret(\"AI API Key (Gemini/OpenAI)\");\n\n // Save encrypted\n saveSecrets(secrets);\n\n console.log(chalk.green(\"\\n ✅ Secrets encrypted and saved to ~/.nanosolana/vault.enc\"));\n console.log(chalk.gray(\" Keys are AES-256-GCM encrypted at rest.\\n\"));\n\n // Create .env template\n const envPath = join(process.cwd(), \".env\");\n if (!existsSync(envPath)) {\n const envContent = `# Nano Solana Configuration\nNANO_AGENT_NAME=nano-alpha\nNANO_GATEWAY_PORT=18790\nAI_PROVIDER=gemini\nAI_MODEL=gemini-2.5-pro\nNANO_LOG_LEVEL=info\n`;\n writeFileSync(envPath, envContent);\n console.log(chalk.gray(\" Created .env with non-sensitive defaults.\\n\"));\n }\n\n console.log(chalk.white(\" Run \") + chalk.cyan(\"nanosolana birth\") + chalk.white(\" to create your agent.\"));\n console.log(chalk.white(\" Or run \") + chalk.cyan(\"nanosolana go\") + chalk.white(\" to do everything at once.\\n\"));\n });\n\n// ── nano birth ────────────────────────────────────────────────\n\nprogram\n .command(\"birth\")\n .description(\"Birth a new nano agent with a Solana wallet\")\n .option(\"-n, --name <name>\", \"Agent name\", \"NanoSolana\")\n .option(\"--pet-name <petName>\", \"TamaGOchi pet name\")\n .action(async (opts) => {\n printBanner();\n console.log(chalk.white.bold(` 🌱 Birthing agent \"${opts.name}\"...\\n`));\n\n try {\n const config = loadConfig();\n const wallet = new NanoWallet(opts.name);\n const info = await wallet.birth();\n\n // Birth the TamaGOchi pet\n const petName = opts.petName ?? opts.name;\n const pet = new TamaGOchi(petName);\n pet.recordWalletCreated(info.balance);\n\n console.log(chalk.green(\" ✅ Agent birthed successfully!\\n\"));\n console.log(chalk.white(\" Agent Name: \") + chalk.cyan(opts.name));\n console.log(chalk.white(\" Agent ID: \") + chalk.cyan(wallet.getAgentId()));\n console.log(chalk.white(\" Public Key: \") + chalk.cyan(info.publicKey));\n console.log(chalk.white(\" SOL Balance: \") + chalk.yellow(`${info.balance} SOL`));\n console.log(chalk.white(\" Birth Time: \") + chalk.gray(new Date(info.birthTimestamp).toISOString()));\n console.log(chalk.white(\" TamaGOchi: \") + chalk.cyan(`${STAGE_EMOJI[pet.getState().stage]} ${petName} ${MOOD_EMOJI[pet.getState().mood]}`));\n\n // Blockchain scan at birth (if Helius configured)\n const birthConfig = loadConfig();\n if (birthConfig.helius?.rpcUrl && birthConfig.helius?.apiKey) {\n try {\n console.log(chalk.cyan(\"\\n ⛓️ Scanning blockchain...\"));\n const helius = new HeliusClient({ rpcUrl: birthConfig.helius.rpcUrl, apiKey: birthConfig.helius.apiKey, wssUrl: birthConfig.helius.wssUrl });\n const snap = await helius.snapshotWallet(info.publicKey);\n printWalletSnapshot(snap, chalk);\n } catch (err) {\n console.log(chalk.gray(` ⚠️ Blockchain scan skipped: ${(err as Error).message}`));\n }\n }\n\n console.log(chalk.gray(\" Wallet saved to ~/.nanosolana/vault.enc (encrypted)\"));\n console.log(chalk.gray(\" Pet state saved to ~/.nanosolana/tamagochi.json\\n\"));\n console.log(chalk.white(\" Run \") + chalk.cyan(\"nanosolana run\") + chalk.white(\" to start the agent.\\n\"));\n } catch (err) {\n console.error(chalk.red(` ❌ Birth failed: ${(err as Error).message}\\n`));\n process.exit(1);\n }\n });\n\n// ── nano run ────────────────────────────────────────────────────\n\nprogram\n .command(\"run\")\n .description(\"Run the nano agent (gateway + trading + memory)\")\n .option(\"-n, --name <name>\", \"Agent name\", \"NanoSolana\")\n .option(\"--pet-name <petName>\", \"TamaGOchi pet name\")\n .option(\"--no-trade\", \"Disable trading engine (--no-ooda)\")\n .option(\"--no-gateway\", \"Disable gateway server\")\n .action(async (opts) => {\n printBanner();\n console.log(chalk.white.bold(` 🚀 Starting NanoSolana TamaGObot \"${opts.name}\"...\\n`));\n\n try {\n const config = loadConfig();\n\n // 1. Birth wallet\n const wallet = new NanoWallet(opts.name);\n const walletInfo = await wallet.birth();\n wallet.startHeartbeat(config.agent.heartbeatMs);\n console.log(chalk.green(` ✅ Wallet: ${walletInfo.publicKey.slice(0, 8)}...${walletInfo.publicKey.slice(-8)}`));\n\n // 2. Birth TamaGOchi pet\n const petName = opts.petName ?? opts.name;\n const pet = new TamaGOchi(petName);\n pet.recordWalletCreated(walletInfo.balance);\n pet.startLifecycle();\n const petState = pet.getState();\n console.log(chalk.green(` ✅ TamaGOchi: ${STAGE_EMOJI[petState.stage]} ${petName} ${MOOD_EMOJI[petState.mood]} (level ${petState.level})`));\n\n // 3. Start ClawVault memory\n const vault = new ClawVault();\n vault.startAutonomous();\n const vaultStats = vault.getStats();\n console.log(chalk.green(` ✅ ClawVault: ${vaultStats.known}K/${vaultStats.learned}L/${vaultStats.inferred}I entries, ${vaultStats.lessons} lessons`));\n\n // 4. Start trading engine\n const trading = new TradingEngine(config, wallet);\n if (opts.trade !== false) {\n await trading.start();\n console.log(chalk.green(\" ✅ Trading engine: ACTIVE (OODA loop)\"));\n }\n\n // Wire trading → ClawVault + TamaGOchi\n trading.on(\"signal\", (signal) => {\n // Store as KNOWN (fresh market data)\n vault.storeKnown({\n content: `Signal: ${signal.type} ${signal.symbol} (${(signal.confidence * 100).toFixed(0)}% confidence)`,\n source: \"birdeye\",\n tags: [signal.type, signal.symbol],\n });\n\n // Experience replay before acting\n const replay = vault.experienceReplay({\n tokenSymbol: signal.symbol,\n tradeType: signal.type,\n });\n\n if (replay.warnings.length > 0) {\n for (const w of replay.warnings) console.log(chalk.red(` ${w}`));\n }\n if (replay.greenLights.length > 0) {\n for (const g of replay.greenLights) console.log(chalk.green(` ${g}`));\n }\n });\n\n trading.on(\"priceUpdate\", (price) => {\n vault.storeKnown({\n content: `${price.symbol}: $${price.price.toFixed(6)} (${price.priceChange24h > 0 ? \"+\" : \"\"}${price.priceChange24h.toFixed(1)}%)`,\n source: \"birdeye\",\n tags: [price.symbol, \"price\"],\n metadata: { mint: price.mint, volume: price.volume24h },\n });\n });\n\n // 5. Start gateway\n if (opts.gateway !== false) {\n // Gateway still uses the legacy MemoryEngine interface for now\n const { MemoryEngine } = await import(\"../memory/engine.js\");\n const legacyMemory = new MemoryEngine(config.memory.temporalDecayHours);\n const gateway = new NanoGateway(config, wallet, trading, legacyMemory);\n await gateway.start();\n console.log(chalk.green(` ✅ Gateway: ws://${config.gateway.host}:${config.gateway.port}`));\n }\n\n console.log(chalk.cyan(\"\\n ══════════════════════════════════════════════\"));\n console.log(chalk.cyan(` 🐹 ${petName} is alive. Press Ctrl+C to stop.`));\n console.log(chalk.cyan(\" ══════════════════════════════════════════════\\n\"));\n\n // Heartbeat logs — with pet mood\n wallet.on(\"heartbeat\", (info) => {\n const time = new Date().toLocaleTimeString();\n const mood = MOOD_EMOJI[pet.getState().mood];\n process.stdout.write(chalk.gray(` [${time}] 💓 ${info.balance.toFixed(4)} SOL ${mood}\\r`));\n });\n\n wallet.on(\"balanceChange\", ({ oldBalance, newBalance }) => {\n const delta = newBalance - oldBalance;\n const color = delta > 0 ? chalk.green : chalk.red;\n console.log(color(`\\n 💰 Balance change: ${delta > 0 ? \"+\" : \"\"}${delta.toFixed(6)} SOL`));\n if (delta > 0) pet.feed(delta);\n });\n\n trading.on(\"signal\", (signal) => {\n const icon = signal.type === \"buy\" ? \"🟢\" : signal.type === \"sell\" ? \"🔴\" : \"⚪\";\n console.log(` ${icon} Signal: ${signal.type.toUpperCase()} ${signal.symbol} (${(signal.confidence * 100).toFixed(0)}% confidence)`);\n });\n\n vault.on(\"lessonLearned\", (lesson) => {\n console.log(chalk.magenta(` 📖 Lesson: ${lesson.pattern} → ${lesson.outcome}`));\n });\n\n pet.on(\"evolved\", (from, to) => {\n console.log(chalk.yellow(`\\n 🐹 EVOLUTION! ${STAGE_EMOJI[from]} ${from} → ${STAGE_EMOJI[to]} ${to}`));\n });\n\n pet.on(\"moodChanged\", (from, to) => {\n console.log(chalk.gray(` ${MOOD_EMOJI[to]} Mood: ${from} → ${to}`));\n });\n\n pet.on(\"levelUp\", (level) => {\n console.log(chalk.yellow(` ⬆️ Level up! Now level ${level}`));\n });\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log(chalk.yellow(\"\\n\\n ⏹ Shutting down...\"));\n wallet.stopHeartbeat();\n trading.stop();\n vault.stopAutonomous();\n pet.stopLifecycle();\n console.log(chalk.green(\" ✅ Agent stopped cleanly.\\n\"));\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep alive\n await new Promise(() => {});\n } catch (err) {\n console.error(chalk.red(` ❌ Failed to start: ${(err as Error).message}\\n`));\n process.exit(1);\n }\n });\n\n// ── nano status ────────────────────────────────────────────────\n\nprogram\n .command(\"status\")\n .description(\"Show agent status, wallet, TamaGOchi, and ClawVault stats\")\n .action(async () => {\n try {\n const config = loadConfig();\n const wallet = new NanoWallet(config.agent.name);\n await wallet.birth();\n\n const vault = new ClawVault();\n const vaultStats = vault.getStats();\n const pet = new TamaGOchi(config.agent.name);\n\n console.log(chalk.cyan(\"\\n ── NanoSolana TamaGObot Status ───────────────\\n\"));\n console.log(chalk.white(\" Agent: \") + chalk.cyan(config.agent.name));\n console.log(chalk.white(\" Wallet: \") + chalk.cyan(wallet.getPublicKey()));\n console.log(chalk.white(\" Balance: \") + chalk.yellow(`${wallet.getInfo().balance} SOL`));\n console.log(chalk.white(\" TamaGOchi: \") + chalk.cyan(`${STAGE_EMOJI[pet.getState().stage]} ${pet.getState().name} ${MOOD_EMOJI[pet.getState().mood]}`));\n console.log(chalk.white(\" ClawVault: \") + chalk.gray(`${vaultStats.known}K ${vaultStats.learned}L ${vaultStats.inferred}I | ${vaultStats.lessons} lessons`));\n console.log(chalk.white(\" Win Rate: \") + chalk.green(`${(vaultStats.tradeWinRate * 100).toFixed(1)}%`));\n console.log(chalk.white(\" Gateway: \") + chalk.gray(`${config.gateway.host}:${config.gateway.port}`));\n\n // Tailscale status\n if (TailscaleDiscovery.isAvailable()) {\n const nodes = TailscaleDiscovery.discoverNodes();\n const online = nodes.filter((n) => n.online);\n console.log(chalk.white(\" Tailscale: \") + chalk.green(`${online.length}/${nodes.length} nodes online`));\n } else {\n console.log(chalk.white(\" Tailscale: \") + chalk.gray(\"not available\"));\n }\n\n // tmux sessions\n const sessions = TmuxManager.listNanoSessions();\n console.log(chalk.white(\" tmux bots: \") + chalk.gray(`${sessions.length} sessions`));\n\n console.log();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n }\n });\n\n// ── nano pet ────────────────────────────────────────────────\n\nprogram\n .command(\"pet\")\n .description(\"Show TamaGOchi pet status\")\n .action(() => {\n try {\n const config = loadConfig();\n const pet = new TamaGOchi(config.agent.name);\n console.log();\n console.log(pet.getStatusDisplay().split(\"\\n\").map((l) => ` ${l}`).join(\"\\n\"));\n console.log();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n }\n });\n\n// ── nano send ────────────────────────────────────────────────\n\nprogram\n .command(\"send\")\n .description(\"One-shot: send a message to nano bots across the mesh\")\n .argument(\"<message>\", \"Message to send\")\n .option(\"-t, --target <hostname>\", \"Target specific node (default: broadcast)\")\n .action(async (message, opts) => {\n try {\n const config = loadConfig();\n const gatewaySecret = config.gateway.secret ?? \"\";\n\n if (!TailscaleDiscovery.isAvailable()) {\n console.log(chalk.yellow(\" ⚠️ Tailscale not available. Sending to local gateway only.\\n\"));\n\n // Connect to local gateway\n const client = new NanoNetworkClient(gatewaySecret);\n const localNode = { hostname: \"localhost\", ip: \"127.0.0.1\", online: true, os: process.platform, tailscaleId: \"local\", lastSeen: Date.now(), gatewayPort: config.gateway.port };\n await client.connectToNode(localNode, config.agent.name);\n client.sendToNode(\"localhost\", message, config.agent.name);\n console.log(chalk.green(` ✅ Sent to local gateway\\n`));\n client.disconnectAll();\n return;\n }\n\n const nodes = TailscaleDiscovery.discoverNodes().filter((n) => n.online);\n const client = new NanoNetworkClient(gatewaySecret);\n\n if (opts.target) {\n const target = nodes.find((n) => n.hostname === opts.target);\n if (!target) {\n console.log(chalk.red(` ❌ Node \"${opts.target}\" not found.\\n`));\n process.exit(1);\n }\n\n const connected = await client.connectToNode(target, config.agent.name);\n if (connected) {\n client.sendToNode(target.hostname, message, config.agent.name);\n console.log(chalk.green(` ✅ Sent to ${target.hostname}\\n`));\n } else {\n console.log(chalk.red(` ❌ Could not connect to ${target.hostname}\\n`));\n }\n } else {\n // Broadcast to all online nodes\n let connected = 0;\n for (const node of nodes) {\n const ok = await client.connectToNode(node, config.agent.name);\n if (ok) connected++;\n }\n\n const sent = client.broadcastToAll(message, config.agent.name);\n console.log(chalk.green(` ✅ Broadcasted to ${sent}/${connected} nodes\\n`));\n }\n\n client.disconnectAll();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n }\n });\n\n// ── nano bots ────────────────────────────────────────────────\n\nprogram\n .command(\"bots\")\n .description(\"Manage nano bots (tmux sessions)\")\n .addCommand(\n new Command(\"list\")\n .description(\"List running nano bot sessions\")\n .action(() => {\n const sessions = TmuxManager.listNanoSessions();\n if (sessions.length === 0) {\n console.log(chalk.gray(\"\\n No nano bot sessions running.\\n\"));\n return;\n }\n\n console.log(chalk.cyan(\"\\n ── Nano Bots ────────────────────────────────\\n\"));\n for (const s of sessions) {\n const status = s.attached ? chalk.green(\"attached\") : chalk.gray(\"detached\");\n console.log(` ${chalk.white(s.name)} ${status} (${s.windows} windows)`);\n }\n console.log();\n }),\n )\n .addCommand(\n new Command(\"spawn\")\n .description(\"Spawn a new nano bot in a tmux session\")\n .argument(\"<name>\", \"Bot name\")\n .action((name) => {\n const ok = TmuxManager.createSession(name, `nanosolana run --name ${name}`);\n if (ok) {\n console.log(chalk.green(`\\n ✅ Spawned nano bot \"${name}\" in tmux session \"nano-${name}\"\\n`));\n } else {\n console.log(chalk.red(`\\n ❌ Failed to spawn bot \"${name}\"\\n`));\n }\n }),\n )\n .addCommand(\n new Command(\"attach\")\n .description(\"Attach to a nano bot session\")\n .argument(\"<name>\", \"Bot name\")\n .action((name) => {\n const sessionName = name.startsWith(\"nano-\") ? name : `nano-${name}`;\n TmuxManager.attachSession(sessionName);\n }),\n )\n .addCommand(\n new Command(\"kill\")\n .description(\"Kill a nano bot session\")\n .argument(\"<name>\", \"Bot name\")\n .action((name) => {\n const sessionName = name.startsWith(\"nano-\") ? name : `nano-${name}`;\n const ok = TmuxManager.killSession(sessionName);\n if (ok) {\n console.log(chalk.green(`\\n ✅ Killed bot \"${sessionName}\"\\n`));\n } else {\n console.log(chalk.red(`\\n ❌ Failed to kill bot \"${sessionName}\"\\n`));\n }\n }),\n );\n\n// ── nano nodes ────────────────────────────────────────────────\n\nprogram\n .command(\"nodes\")\n .description(\"List Tailscale nodes in the nano network\")\n .action(() => {\n if (!TailscaleDiscovery.isAvailable()) {\n console.log(chalk.yellow(\"\\n ⚠️ Tailscale is not installed or not connected.\\n\"));\n return;\n }\n\n const nodes = TailscaleDiscovery.discoverNodes();\n console.log(chalk.cyan(\"\\n ── Nano Network Nodes ───────────────────────\\n\"));\n\n for (const node of nodes) {\n const status = node.online ? chalk.green(\"● online\") : chalk.red(\"○ offline\");\n console.log(` ${status} ${chalk.white(node.hostname)} ${chalk.gray(node.ip)} ${chalk.gray(node.os)}`);\n }\n console.log();\n });\n\n// ── nano config ────────────────────────────────────────────────\n\nprogram\n .command(\"config\")\n .description(\"Show current configuration (redacted)\")\n .action(() => {\n try {\n const config = loadConfig();\n const redacted = redactConfig(config);\n console.log(chalk.cyan(\"\\n ── Nano Solana Config ────────────────────────\\n\"));\n console.log(JSON.stringify(redacted, null, 2).split(\"\\n\").map((l) => ` ${l}`).join(\"\\n\"));\n console.log();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n }\n });\n\n// ── nano vault (ClawVault memory) ────────────────────────────\n\nprogram\n .command(\"vault\")\n .description(\"Query the ClawVault memory (known → learned → inferred)\")\n .argument(\"[query]\", \"Search query\")\n .action(async (query) => {\n const vault = new ClawVault();\n const stats = vault.getStats();\n\n console.log(chalk.cyan(\"\\n ── ClawVault (3-tier epistemological memory) ──\\n\"));\n console.log(chalk.white(\" KNOWN: \") + chalk.green(`${stats.known}`) + chalk.gray(\" (fresh API data, expires in ~60s)\"));\n console.log(chalk.white(\" LEARNED: \") + chalk.blue(`${stats.learned}`) + chalk.gray(\" (trade-derived patterns)\"));\n console.log(chalk.white(\" INFERRED: \") + chalk.magenta(`${stats.inferred}`) + chalk.gray(\" (correlations, held loosely)\"));\n console.log(chalk.white(\" Inbox: \") + chalk.gray(`${stats.inbox} (pending reflection)`));\n console.log(chalk.white(\" Trades: \") + chalk.gray(`${stats.trades}`));\n console.log(chalk.white(\" Lessons: \") + chalk.gray(`${stats.lessons}`));\n console.log(chalk.white(\" Win Rate: \") + chalk.green(`${(stats.tradeWinRate * 100).toFixed(1)}%`));\n console.log(chalk.white(\" Research: \") + chalk.gray(`${stats.researchGaps} open gaps`));\n\n if (query) {\n const results = vault.search(query, 5);\n console.log(chalk.cyan(`\\n ── Search: \"${query}\" ────────────────────────\\n`));\n\n if (results.length === 0) {\n console.log(chalk.gray(\" No matching entries.\\n\"));\n } else {\n for (const entry of results) {\n const tierColor = entry.tier === \"known\" ? chalk.green : entry.tier === \"learned\" ? chalk.blue : chalk.magenta;\n console.log(` ${tierColor(`[${entry.tier.toUpperCase()}]`)} ${chalk.gray(entry.content.slice(0, 80))}`);\n }\n }\n }\n\n const lessons = vault.getLessons();\n if (lessons.length > 0) {\n console.log(chalk.cyan(\"\\n ── Lessons Learned ──────────────────────────\\n\"));\n for (const lesson of lessons.slice(-5)) {\n const icon = lesson.confidenceImpact > 0 ? \"✅\" : \"⚠️\";\n const tierTag = lesson.tier === \"learned\" ? chalk.blue(\"[L]\") : chalk.magenta(\"[I]\");\n console.log(` ${icon} ${tierTag} ${chalk.white(lesson.pattern)} → ${chalk.gray(lesson.adjustment)}`);\n }\n }\n\n const gaps = vault.getResearchAgenda();\n if (gaps.length > 0) {\n console.log(chalk.cyan(\"\\n ── Research Agenda ──────────────────────────\\n\"));\n for (const gap of gaps.slice(-3)) {\n console.log(` 🔬 ${chalk.gray(gap.question)}`);\n }\n }\n\n console.log();\n });\n\n// ── nano docs ───────────────────────────────────────────────\n\nprogram\n .command(\"docs\")\n .description(\"Inspect integrated docs + extension knowledge corpus\")\n .argument(\"[query]\", \"Optional query to search docs/extensions\")\n .option(\"-l, --limit <n>\", \"Maximum search results\", \"10\")\n .option(\"--refresh\", \"Refresh the snapshot cache before reading\")\n .option(\"--json\", \"Emit machine-readable JSON\")\n .action((query, opts) => {\n try {\n const refresh = Boolean(opts.refresh);\n const limit = parsePositiveInteger(opts.limit as string | undefined, 10);\n\n const snapshot = getNanoKnowledgeSnapshot({ refresh });\n const summary = getNanoKnowledgeSummary(snapshot);\n const matches = query\n ? searchNanoKnowledge(snapshot, String(query), limit)\n : [];\n\n if (opts.json) {\n const payload = {\n summary,\n docs: snapshot.docs.areas.map((area) => ({\n area: area.area,\n path: area.path,\n files: area.files,\n markdownFiles: area.markdownFiles,\n bytes: area.bytes,\n indexedEntries: area.entries.length,\n updatedAt: area.updatedAt,\n })),\n extensions: {\n directories: snapshot.extensions.directories,\n files: snapshot.extensions.files,\n manifests: snapshot.extensions.manifests,\n indexedEntries: snapshot.extensions.entries.length,\n },\n search: query\n ? {\n query,\n limit,\n matches,\n }\n : undefined,\n };\n\n console.log(JSON.stringify(payload, null, 2));\n return;\n }\n\n console.log(chalk.cyan(\"\\n ── NanoSolana Knowledge Integration ──────────\\n\"));\n console.log(chalk.white(\" Generated: \") + chalk.gray(new Date(summary.generatedAt).toISOString()));\n console.log(chalk.white(\" Docs: \") + chalk.green(`${summary.docs.files} files`) + chalk.gray(` (${summary.docs.markdownFiles} markdown, ${formatBytes(summary.docs.bytes)})`));\n console.log(chalk.white(\" Extensions: \") + chalk.green(`${summary.extensions.directories} directories`) + chalk.gray(` (${summary.extensions.files} files, ${summary.extensions.manifests} manifests)`));\n\n console.log(chalk.cyan(\"\\n ── Docs Areas ───────────────────────────────\\n\"));\n for (const area of snapshot.docs.areas) {\n const updated = area.updatedAt\n ? new Date(area.updatedAt).toISOString()\n : \"n/a\";\n console.log(\n ` ${chalk.white(area.path.padEnd(18))} ${chalk.green(String(area.files).padStart(4))} files ${chalk.gray(`(${area.markdownFiles} md, ${formatBytes(area.bytes)}, updated ${updated})`)}`,\n );\n }\n\n if (query) {\n console.log(chalk.cyan(`\\n ── Search: \"${query}\" ───────────────────────\\n`));\n\n if (matches.length === 0) {\n console.log(chalk.gray(\" No matches found.\"));\n } else {\n for (const match of matches) {\n const typeTag = match.type === \"doc\"\n ? chalk.blue(\"[DOC]\")\n : chalk.magenta(\"[EXT]\");\n\n console.log(` ${typeTag} ${chalk.white(match.title)}`);\n console.log(` ${chalk.gray(match.path)}${match.subtitle ? chalk.gray(` — ${match.subtitle}`) : \"\"}`);\n }\n }\n }\n\n console.log();\n } catch (err) {\n console.error(chalk.red(` ❌ ${(err as Error).message}\\n`));\n process.exit(1);\n }\n });\n\n// ── nanosolana go (one-shot everything) ──────────────────────\n\nprogram\n .command(\"go\")\n .description(\"One-shot: init + birth + wallet + run — everything in one command\")\n .option(\"-n, --name <name>\", \"Agent name\", \"NanoSolana\")\n .option(\"--pet-name <petName>\", \"TamaGOchi pet name\")\n .option(\"--skip-init\", \"Skip API key prompts if already configured\")\n .action(async (opts) => {\n printBanner();\n await animateLobster(1800);\n console.log();\n\n try {\n // Phase 1: Init (ensure home + check config)\n await lobsterWalk(\"Phase 1 — Initialization\");\n ensureNanoHome();\n const secrets = loadSecrets();\n const needsInit = !opts.skipInit && (!secrets.HELIUS_RPC_URL || !secrets.AI_API_KEY);\n\n if (needsInit) {\n console.log(chalk.yellow(\"\\n First run detected — let's configure your API keys.\\n\"));\n console.log(chalk.cyan(\" ── Required Keys ────────────────────────────\\n\"));\n\n if (!secrets.AI_API_KEY) {\n secrets.AI_API_KEY = await promptSecret(\"OpenRouter API Key (sk-or-v1-...)\");\n }\n if (!secrets.HELIUS_RPC_URL) {\n secrets.HELIUS_RPC_URL = await promptSecret(\"Helius RPC URL\");\n }\n if (!secrets.HELIUS_API_KEY) {\n secrets.HELIUS_API_KEY = await promptSecret(\"Helius API Key\");\n }\n\n console.log(chalk.cyan(\"\\n ── Optional Keys (press Enter to skip) ──────\\n\"));\n if (!secrets.HELIUS_WSS_URL) {\n const wss = await promptSecret(\"Helius WSS URL\");\n if (wss) secrets.HELIUS_WSS_URL = wss;\n }\n if (!secrets.BIRDEYE_API_KEY) {\n const bk = await promptSecret(\"Birdeye API Key\");\n if (bk) secrets.BIRDEYE_API_KEY = bk;\n }\n if (!secrets.JUPITER_API_KEY) {\n const jk = await promptSecret(\"Jupiter API Key\");\n if (jk) secrets.JUPITER_API_KEY = jk;\n }\n\n saveSecrets(secrets);\n console.log(chalk.green(\"\\n ✓ Secrets encrypted → ~/.nanosolana/vault.enc\\n\"));\n } else {\n console.log(chalk.green(\" ✓ Configuration found — skipping init\\n\"));\n }\n\n // Phase 2: Birth agent + wallet\n await lobsterWalk(\"Phase 2 — Birthing Agent\");\n console.log();\n await playStartupAnimation();\n\n const config = loadConfig();\n const wallet = new NanoWallet(opts.name);\n const walletInfo = await wallet.birth();\n wallet.startHeartbeat(config.agent.heartbeatMs);\n\n console.log();\n console.log(chalk.green(\" ✓ Wallet created\"));\n console.log(chalk.white(\" Public Key: \") + chalk.cyan(walletInfo.publicKey));\n console.log(chalk.white(\" Balance: \") + chalk.yellow(`${walletInfo.balance} SOL`));\n\n // Phase 3: TamaGOchi pet\n const petName = opts.petName ?? opts.name;\n const pet = new TamaGOchi(petName);\n pet.recordWalletCreated(walletInfo.balance);\n pet.startLifecycle();\n const petState = pet.getState();\n console.log(\n chalk.green(\" ✓ TamaGOchi hatched: \") +\n chalk.cyan(`${STAGE_EMOJI[petState.stage]} ${petName} ${MOOD_EMOJI[petState.mood]}`),\n );\n\n // Phase 4: Memory\n const vault = new ClawVault();\n vault.startAutonomous();\n const stats = vault.getStats();\n console.log(chalk.green(\" ✓ ClawVault online: \") + chalk.gray(`${stats.known}K/${stats.learned}L/${stats.inferred}I`));\n\n // Phase 5: Trading\n const trading = new TradingEngine(config, wallet);\n await trading.start();\n console.log(chalk.green(\" ✓ OODA trading loop active\"));\n\n // Wire events\n trading.on(\"signal\", (signal) => {\n vault.storeKnown({\n content: `Signal: ${signal.type} ${signal.symbol} (${(signal.confidence * 100).toFixed(0)}%)`,\n source: \"birdeye\",\n tags: [signal.type, signal.symbol],\n });\n });\n\n // Phase 5.5: Blockchain Scan (if Helius configured)\n if (config.helius?.rpcUrl && config.helius?.apiKey) {\n try {\n const helius = new HeliusClient({ rpcUrl: config.helius.rpcUrl, apiKey: config.helius.apiKey, wssUrl: config.helius.wssUrl });\n const snap = await helius.snapshotWallet(walletInfo.publicKey);\n printWalletSnapshot(snap, chalk);\n } catch (err) {\n console.log(chalk.gray(` ⚠️ Blockchain scan skipped: ${(err as Error).message}`));\n }\n }\n\n // Phase 5.6: Auto-register on-chain (devnet NFT)\n try {\n const skills = [\"ooda-trading\", \"solana-rpc\", \"jupiter-swaps\", \"helius-das\"];\n const regResult = await registerOnHeartbeat(wallet.getKeypair(), \"0.1.0\", skills, (msg) => console.log(msg));\n if (regResult) {\n console.log(chalk.green(` ✓ On-chain identity: ${regResult.mintAddress.slice(0, 8)}...`));\n }\n } catch (err) {\n console.log(chalk.gray(` ⚠️ Auto-registration skipped: ${(err as Error).message}`));\n }\n\n // Phase 6: Gateway\n const { MemoryEngine } = await import(\"../memory/engine.js\");\n const legacyMemory = new MemoryEngine(config.memory.temporalDecayHours);\n const gateway = new NanoGateway(config, wallet, trading, legacyMemory);\n await gateway.start();\n console.log(chalk.green(` ✓ Gateway: ws://${config.gateway.host}:${config.gateway.port}`));\n\n // Success banner\n console.log();\n console.log(chalk.hex(\"#14F195\").bold(\" ══════════════════════════════════════════════════════\"));\n console.log(chalk.hex(\"#14F195\").bold(` 🦞 ${petName} is LIVE. All systems operational.`));\n console.log(chalk.hex(\"#14F195\").bold(\" ══════════════════════════════════════════════════════\"));\n console.log();\n console.log(chalk.gray(\" Commands while running:\"));\n console.log(chalk.gray(\" Ctrl+C — graceful shutdown\"));\n console.log(chalk.gray(\" nanosolana status — check agent in another terminal\"));\n console.log(chalk.gray(\" nanosolana pet — see your TamaGOchi\"));\n console.log();\n\n // Live events\n wallet.on(\"heartbeat\", (info) => {\n const time = new Date().toLocaleTimeString();\n const mood = MOOD_EMOJI[pet.getState().mood];\n process.stdout.write(chalk.gray(` [${time}] 💓 ${info.balance.toFixed(4)} SOL ${mood}\\r`));\n });\n\n wallet.on(\"balanceChange\", ({ oldBalance, newBalance }) => {\n const delta = newBalance - oldBalance;\n const color = delta > 0 ? chalk.green : chalk.red;\n console.log(color(`\\n 💰 ${delta > 0 ? \"+\" : \"\"}${delta.toFixed(6)} SOL`));\n if (delta > 0) pet.feed(delta);\n });\n\n trading.on(\"signal\", (signal) => {\n const icon = signal.type === \"buy\" ? \"🟢\" : signal.type === \"sell\" ? \"🔴\" : \"⚪\";\n console.log(` ${icon} ${signal.type.toUpperCase()} ${signal.symbol} (${(signal.confidence * 100).toFixed(0)}%)`);\n });\n\n vault.on(\"lessonLearned\", (lesson) => {\n console.log(chalk.magenta(` 📖 ${lesson.pattern} → ${lesson.outcome}`));\n });\n\n pet.on(\"evolved\", (from, to) => {\n console.log(chalk.yellow(`\\n 🦞 EVOLUTION! ${STAGE_EMOJI[from]} → ${STAGE_EMOJI[to]} ${to}`));\n });\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log(chalk.yellow(\"\\n\\n ⏹ Shutting down...\"));\n wallet.stopHeartbeat();\n trading.stop();\n vault.stopAutonomous();\n pet.stopLifecycle();\n console.log(chalk.green(\" ✓ Agent stopped cleanly.\\n\"));\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await new Promise(() => {});\n } catch (err) {\n console.error(chalk.red(`\\n ✗ Failed: ${(err as Error).message}\\n`));\n process.exit(1);\n }\n });\n\n// ── nanosolana dvd (screensaver) ────────────────────────────\n\nprogram\n .command(\"dvd\")\n .description(\"Floating DVD-style NanoSolana screensaver in the terminal\")\n .action(() => {\n const dvd = startDvdScreensaver();\n\n process.on(\"SIGINT\", () => {\n dvd.stop();\n process.exit(0);\n });\n process.on(\"SIGTERM\", () => {\n dvd.stop();\n process.exit(0);\n });\n });\n\n// ── nanosolana lobster (show mascot) ────────────────────────\n\nprogram\n .command(\"lobster\")\n .description(\"Show the animated NanoSolana lobster mascot\")\n .option(\"--static\", \"Show static version\")\n .action(async (opts) => {\n if (opts.static) {\n printLobster();\n } else {\n await animateLobster(5000);\n }\n });\n\n// ── nanosolana scan (blockchain data reader) ────────────────────\n\nprogram\n .command(\"scan\")\n .description(\"Scan the Solana blockchain — show wallet, tokens, NFTs, and recent transactions\")\n .argument(\"[address]\", \"Wallet address to scan (default: agent wallet)\")\n .action(async (address?: string) => {\n try {\n const config = loadConfig();\n if (!config.helius?.rpcUrl || !config.helius?.apiKey) {\n console.log(chalk.red(\"\\n ❌ Helius RPC URL and API key required.\"));\n console.log(chalk.gray(\" Run: nanosolana init\\n\"));\n process.exit(1);\n }\n\n const pubkey = address ?? (() => {\n try {\n const wallet = new NanoWallet(\"NanoSolana\");\n // Try loading existing wallet pubkey from file\n const pubPath = join(homedir(), \".nanosolana\", \"wallet.pub\");\n if (existsSync(pubPath)) return readFileSync(pubPath, \"utf-8\").trim();\n return \"\";\n } catch { return \"\"; }\n })();\n\n if (!pubkey) {\n console.log(chalk.red(\"\\n ❌ No wallet found. Run: nanosolana birth\\n\"));\n process.exit(1);\n }\n\n console.log(chalk.cyan(`\\n 🔍 Scanning ${pubkey.slice(0, 8)}...${pubkey.slice(-8)}\\n`));\n\n const helius = new HeliusClient({\n rpcUrl: config.helius.rpcUrl,\n apiKey: config.helius.apiKey,\n wssUrl: config.helius.wssUrl,\n });\n\n const snap = await helius.snapshotWallet(pubkey);\n printWalletSnapshot(snap, chalk);\n } catch (err) {\n console.error(chalk.red(` ❌ Scan failed: ${(err as Error).message}\\n`));\n }\n });\n\n// ── nanosolana register (on-chain NFT identity) ─────────────────\n\nprogram\n .command(\"register\")\n .description(\"Register this agent on-chain with a devnet Metaplex NFT\")\n .action(async () => {\n try {\n const config = loadConfig();\n const wallet = new NanoWallet(\"NanoSolana\");\n await wallet.birth();\n\n const registry = new AgentRegistry();\n\n // Check if already registered\n if (registry.isRegistered()) {\n const reg = registry.loadRegistration();\n if (reg) {\n console.log(chalk.green(\"\\n ✅ Already registered on-chain!\\n\"));\n console.log(chalk.white(\" Agent: \") + chalk.cyan(reg.result.agentPubkey));\n console.log(chalk.white(\" Mint: \") + chalk.cyan(reg.result.mintAddress));\n console.log(chalk.white(\" Tx: \") + chalk.gray(reg.result.txSignature.slice(0, 20) + \"...\"));\n console.log(chalk.white(\" Network: \") + chalk.gray(reg.result.network));\n console.log(chalk.white(\" Saved: \") + chalk.gray(reg.savedAt));\n console.log();\n console.log(chalk.gray(` Explorer: https://explorer.solana.com/address/${reg.result.mintAddress}?cluster=devnet\\n`));\n return;\n }\n }\n\n console.log(chalk.cyan(\"\\n ⛓️ Registering agent on-chain (devnet)...\\n\"));\n const skills = [\"ooda-trading\", \"solana-rpc\", \"jupiter-swaps\", \"helius-das\", \"clawvault-memory\"];\n const result = await registry.registerAgent(\n wallet.getKeypair(),\n \"0.1.0\",\n skills,\n (msg) => console.log(msg),\n );\n\n console.log(chalk.green(\"\\n ✅ Agent registered on-chain!\\n\"));\n console.log(chalk.white(\" Mint: \") + chalk.cyan(result.mintAddress));\n console.log(chalk.white(\" Tx: \") + chalk.gray(result.txSignature.slice(0, 20) + \"...\"));\n console.log(chalk.white(\" Token Acct: \") + chalk.gray(result.tokenAccount));\n console.log(chalk.white(\" Network: \") + chalk.gray(result.network));\n console.log(chalk.white(\" Saved: \") + chalk.gray(\"~/.nanosolana/registry/registration.json\"));\n console.log();\n console.log(chalk.hex(\"#FFAA00\")(` Explorer: https://explorer.solana.com/tx/${result.txSignature}?cluster=devnet\\n`));\n } catch (err) {\n console.error(chalk.red(` ❌ Registration failed: ${(err as Error).message}\\n`));\n }\n });\n\n// ── nanosolana registry (show registration status) ──────────────\n\nprogram\n .command(\"registry\")\n .description(\"Show on-chain agent registration status\")\n .action(() => {\n const registry = new AgentRegistry();\n const reg = registry.loadRegistration();\n\n if (!reg) {\n console.log(chalk.hex(\"#FFAA00\")(\"\\n ⚠️ No registration found. Run: nanosolana register\\n\"));\n return;\n }\n\n console.log(chalk.hex(\"#14F195\")(\"\\n ⛓️ Agent On-Chain Identity\\n\"));\n console.log(chalk.white(\" Agent: \") + chalk.cyan(reg.result.agentPubkey));\n console.log(chalk.white(\" Mint: \") + chalk.cyan(reg.result.mintAddress));\n console.log(chalk.white(\" Tx: \") + chalk.gray(reg.result.txSignature.slice(0, 20) + \"...\"));\n console.log(chalk.white(\" Network: \") + chalk.gray(reg.result.network));\n console.log(chalk.white(\" Token Acct: \") + chalk.gray(reg.result.tokenAccount));\n console.log(chalk.white(\" Registered: \") + chalk.gray(reg.savedAt));\n console.log(chalk.white(\" Name: \") + chalk.gray(reg.metadata.name));\n console.log(chalk.white(\" Skills: \") + chalk.gray(reg.metadata.skills.join(\", \")));\n console.log(chalk.white(\" Fingerprint:\") + chalk.gray(reg.metadata.fingerprint.slice(0, 16) + \"...\"));\n console.log();\n console.log(chalk.gray(` Explorer: https://explorer.solana.com/address/${reg.result.mintAddress}?cluster=devnet\\n`));\n });\n\n// ── nanosolana nanobot (interactive UI) ──────────────────────────\n\nprogram\n .command(\"nanobot\")\n .description(\"Launch the interactive NanoBot web UI (localhost companion)\")\n .option(\"-p, --port <port>\", \"Port number\", \"7777\")\n .action(async (opts) => {\n const port = parseInt(opts.port, 10) || 7777;\n console.log(chalk.hex(\"#14F195\")(`\\n 🤖 Starting NanoBot on http://127.0.0.1:${port}\\n`));\n\n const server = new NanoBotServer({ port });\n await server.start();\n\n // Keep alive\n await new Promise(() => {});\n });\n\n// ── Parse & Run ────────────────────────────────────────────────\n\nprogram.parse();\n","/**\n * NanoSolana Terminal Animations\n *\n * Uses `unicode-animations` for braille spinners + custom lobster frames,\n * DVD bouncing logo, and a full startup animation pipeline.\n */\n\nimport chalk from \"chalk\";\nimport spinners from \"unicode-animations\";\n\n// ── Spinner Helper (using unicode-animations) ────────────────\n\nexport function createSpinner(msg: string, name: keyof typeof spinners = \"braille\") {\n const { frames, interval } = spinners[name];\n let i = 0;\n let text = msg;\n const timer = setInterval(() => {\n process.stdout.write(\n `\\r\\x1B[2K ${chalk.cyan(frames[i++ % frames.length])} ${chalk.white(text)}`,\n );\n }, interval);\n\n return {\n update(newMsg: string) {\n text = newMsg;\n },\n stop(doneMsg: string) {\n clearInterval(timer);\n process.stdout.write(`\\r\\x1B[2K ${chalk.green(\"✓\")} ${chalk.white(doneMsg)}\\n`);\n },\n fail(errMsg: string) {\n clearInterval(timer);\n process.stdout.write(`\\r\\x1B[2K ${chalk.red(\"✗\")} ${chalk.red(errMsg)}\\n`);\n },\n };\n}\n\nexport async function runWithSpinner<T>(\n label: string,\n fn: () => Promise<T>,\n name: keyof typeof spinners = \"braille\",\n): Promise<T> {\n const s = createSpinner(label, name);\n try {\n const result = await fn();\n s.stop(label);\n return result;\n } catch (err) {\n s.fail(`${label} — ${(err as Error).message}`);\n throw err;\n }\n}\n\n// ── Unicode Lobster Frames ──────────────────────────────────\n\nconst LOBSTER_FRAMES = [\n [\n \" ╱╲ ╱╲ \",\n \" ╱ ╲──╱ ╲ \",\n \" │ ◉ ◉ │ \",\n \" │ ╲╱ │ \",\n \" ╲ │││ ╱ \",\n \" ╲═╧╧═╱ \",\n \" ╱╱╱ ╲╲╲ \",\n \" ╱╱╱ ╲╲╲ \",\n ],\n [\n \" ╱╲ ╱╲ \",\n \" ╱ ╲────╱ ╲ \",\n \" │ ● ● │ \",\n \" │ ── │ \",\n \" ╲ │││ ╱ \",\n \" ╲═╧╧═╱ \",\n \" ╱╱╱╱ ╲╲╲╲ \",\n \" ╱╱╱╱ ╲╲╲╲ \",\n ],\n [\n \" ╱╲ ╱╲ \",\n \" ╱ ╲──╱ ╲ \",\n \" │ ◉ ◉ │ \",\n \" │ ╱╲ │ \",\n \" ╲ │││ ╱ \",\n \" ╲═╧╧═╱ \",\n \" ╱╱╲╲ \",\n \" ╱╱ ╲╲ \",\n ],\n [\n \" ╱╲ ╱╲ \",\n \" ╱ ╲╱ ╲ \",\n \" │ ◉ ◉ │ \",\n \" │ ╲╱ │ \",\n \" ╲ │││ ╱ \",\n \" ╲╧╧╧╱ \",\n \" ╱╱╱ ╲╲╲ \",\n \" ╱╱╱ ╲╲╲ \",\n ],\n];\n\nconst LOBSTER_BIG = `\n ╱▔╲ ╱▔╲\n ╱╱ ╲─────╱ ╲╲\n ││ ◉ │ │ ◉ ││\n ││ ╰─┬─┬─╯ ││\n ╲╲ ╱│█│╲ ╱╱\n ╲╲ ╱█│█│█╲ ╱╱\n ╰╱██│█│██╲╯\n ╱╱╱ │█│ ╲╲╲\n ╱╱╱ │█│ ╲╲╲\n ╱╱ ╱███╲ ╲╲\n`;\n\n// ── Animated Lobster (frame-based) ──────────────────────────\n\nexport function animateLobster(durationMs = 2400): Promise<void> {\n return new Promise((resolve) => {\n const frameCount = LOBSTER_FRAMES.length;\n const frameH = LOBSTER_FRAMES[0].length + 1;\n let frame = 0;\n\n // Reserve space\n process.stdout.write(\"\\n\".repeat(frameH));\n\n const interval = setInterval(() => {\n // Move cursor up\n process.stdout.write(`\\x1B[${frameH}A`);\n // Draw frame\n const f = LOBSTER_FRAMES[frame % frameCount];\n const color = frame % 2 === 0 ? chalk.green : chalk.hex(\"#14F195\");\n for (const line of f) {\n process.stdout.write(`\\x1B[2K ${color(line)}\\n`);\n }\n process.stdout.write(`\\x1B[2K ${chalk.cyan(\" 🦞 NanoSolana\")}\\n`);\n frame++;\n }, 200);\n\n setTimeout(() => {\n clearInterval(interval);\n resolve();\n }, durationMs);\n });\n}\n\n// ── DVD Bouncing Logo ──────────────────────────────────────\n\nconst DVD_LOGO = [\n \"╔═════════════════════════╗\",\n \"║ 🦞 NanoSolana 🦞 ║\",\n \"║ ══════════════════ ║\",\n \"║ Solana Trading Agent ║\",\n \"║ nanosolana.com ║\",\n \"╚═════════════════════════╝\",\n];\n\nconst DVD_COLORS = [\n chalk.hex(\"#14F195\"),\n chalk.hex(\"#9945FF\"),\n chalk.cyan,\n chalk.magenta,\n chalk.yellow,\n chalk.green,\n chalk.blue,\n chalk.red,\n];\n\nexport function startDvdScreensaver(): { stop: () => void } {\n const logoWidth = 27;\n const logoHeight = DVD_LOGO.length;\n let cols = process.stdout.columns || 80;\n let rows = process.stdout.rows || 24;\n\n let x = Math.floor(Math.random() * Math.max(1, cols - logoWidth));\n let y = Math.floor(Math.random() * Math.max(1, rows - logoHeight - 2));\n let dx = 1;\n let dy = 1;\n let colorIdx = 0;\n let hits = 0;\n\n // Hide cursor + clear\n process.stdout.write(\"\\x1B[?25l\\x1B[2J\");\n\n const interval = setInterval(() => {\n cols = process.stdout.columns || 80;\n rows = process.stdout.rows || 24;\n\n // Clear previous\n for (let i = 0; i < logoHeight; i++) {\n process.stdout.write(`\\x1B[${y + i + 1};1H\\x1B[2K`);\n }\n\n // Move\n x += dx;\n y += dy;\n\n // Bounce\n if (x <= 0 || x + logoWidth >= cols) {\n dx *= -1;\n colorIdx = (colorIdx + 1) % DVD_COLORS.length;\n hits++;\n }\n if (y <= 0 || y + logoHeight >= rows - 1) {\n dy *= -1;\n colorIdx = (colorIdx + 1) % DVD_COLORS.length;\n hits++;\n }\n\n x = Math.max(0, Math.min(x, cols - logoWidth));\n y = Math.max(0, Math.min(y, rows - logoHeight - 1));\n\n // Draw\n const color = DVD_COLORS[colorIdx];\n for (let i = 0; i < logoHeight; i++) {\n process.stdout.write(`\\x1B[${y + i + 1};${x + 1}H`);\n process.stdout.write(color(DVD_LOGO[i]));\n }\n\n // Status bar\n process.stdout.write(`\\x1B[${rows};1H`);\n process.stdout.write(\n chalk.bgHex(\"#0a0a1a\").hex(\"#14F195\")(\n ` 🦞 NanoSolana DVD | Bounces: ${hits} | ${new Date().toLocaleTimeString()} | Ctrl+C to exit `.padEnd(\n cols,\n ),\n ),\n );\n }, 60);\n\n const stop = () => {\n clearInterval(interval);\n process.stdout.write(\"\\x1B[?25h\\x1B[2J\\x1B[H\");\n };\n\n return { stop };\n}\n\n// ── Full Startup Animation Pipeline ─────────────────────────\n\ninterface StartupStep {\n label: string;\n spinner: keyof typeof spinners;\n durationMs: number;\n}\n\nconst STARTUP_STEPS: StartupStep[] = [\n { label: \"Generating Ed25519 keypair...\", spinner: \"helix\", durationMs: 400 },\n { label: \"Deriving Solana wallet address...\", spinner: \"dna\", durationMs: 300 },\n { label: \"Encrypting private key (AES-256-GCM)...\", spinner: \"cascade\", durationMs: 500 },\n { label: \"Requesting devnet airdrop...\", spinner: \"orbit\", durationMs: 700 },\n { label: \"Minting Birth Certificate NFT (Metaplex)...\", spinner: \"scan\", durationMs: 600 },\n { label: \"Initializing ClawVault memory engine...\", spinner: \"rain\", durationMs: 400 },\n { label: \"Hatching TamaGOchi pet 🥚...\", spinner: \"breathe\", durationMs: 500 },\n { label: \"Calibrating RSI + EMA + ATR strategy...\", spinner: \"columns\", durationMs: 400 },\n { label: \"Starting OODA trading loop...\", spinner: \"snake\", durationMs: 300 },\n { label: \"Connecting gateway (HMAC-SHA256)...\", spinner: \"braille\", durationMs: 400 },\n];\n\nexport async function playStartupAnimation(): Promise<void> {\n for (const step of STARTUP_STEPS) {\n await runWithSpinner(step.label, () => sleep(step.durationMs), step.spinner);\n }\n}\n\n// ── Lobster Walk ────────────────────────────────────────────\n\nexport async function lobsterWalk(message: string): Promise<void> {\n const cols = process.stdout.columns || 80;\n const walkLen = Math.min(cols - 20, 35);\n const { frames, interval } = spinners.braille;\n let fi = 0;\n\n for (let i = 0; i < walkLen; i++) {\n const pad = \" \".repeat(i);\n const dots = chalk.hex(\"#14F195\")(\"·\".repeat(Math.min(i, 6)));\n const spin = chalk.cyan(frames[fi++ % frames.length]);\n process.stdout.write(`\\r\\x1B[2K ${pad}${dots} ${spin} 🦞`);\n await sleep(interval);\n }\n process.stdout.write(`\\r\\x1B[2K`);\n console.log(chalk.hex(\"#14F195\")(` 🦞 ${message}`));\n}\n\n// ── Print Static Lobster ────────────────────────────────────\n\nexport function printLobster(): void {\n const lines = LOBSTER_BIG.split(\"\\n\");\n for (const line of lines) {\n console.log(chalk.green(` ${line}`));\n }\n}\n\n// ── Status Bar ──────────────────────────────────────────────\n\nexport function updateStatusBar(info: {\n balance: number;\n mood: string;\n stage: string;\n petName: string;\n signals: number;\n uptime: number;\n}): void {\n const cols = process.stdout.columns || 80;\n const uptimeStr = formatUptime(info.uptime);\n const bar =\n ` 🦞 ${info.petName} ${info.stage}${info.mood} │ ` +\n `${info.balance.toFixed(4)} SOL │ ` +\n `${info.signals} signals │ ` +\n `⏱ ${uptimeStr}`;\n\n process.stdout.write(\"\\x1B7\");\n const rows = process.stdout.rows || 24;\n process.stdout.write(`\\x1B[${rows};1H`);\n process.stdout.write(chalk.bgHex(\"#0a0a1a\").hex(\"#14F195\")(bar.padEnd(cols)));\n process.stdout.write(\"\\x1B8\");\n}\n\n// ── Utility ─────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction formatUptime(ms: number): string {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}h${m % 60}m`;\n if (m > 0) return `${m}m${s % 60}s`;\n return `${s}s`;\n}\n","/**\n * NanoSolana Helius Client — Full Blockchain Data Reader\n *\n * Wraps every Helius API for instant blockchain intelligence at birth:\n * - DAS API (getAsset, getAssetsByOwner, searchAssets)\n * - Enhanced Transactions (parsed tx history)\n * - getTransactionsForAddress (Helius-exclusive, filtered history)\n * - Priority Fees\n * - Health / Version\n * - Token balances + SOL balance\n * - Trending token discovery\n *\n * Designed to be initialized with just an RPC URL + API key and\n * immediately display a rich \"blockchain scan\" on agent birth.\n */\n\nimport { Connection, PublicKey, LAMPORTS_PER_SOL } from \"@solana/web3.js\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface HeliusConfig {\n rpcUrl: string;\n apiKey: string;\n wssUrl?: string;\n}\n\nexport interface DASAsset {\n id: string;\n content?: {\n metadata?: { name?: string; symbol?: string; description?: string };\n json_uri?: string;\n };\n ownership?: { owner?: string };\n compression?: { compressed?: boolean };\n token_info?: {\n symbol?: string;\n balance?: number;\n decimals?: number;\n supply?: number;\n price_info?: { price_per_token?: number; total_price?: number; currency?: string };\n };\n grouping?: Array<{ group_key?: string; group_value?: string }>;\n interface?: string;\n}\n\nexport interface DASSearchResult {\n total: number;\n limit: number;\n page: number;\n items: DASAsset[];\n nativeBalance?: { lamports: number; sol: number; total_price?: number };\n}\n\nexport interface EnhancedTx {\n signature: string;\n type: string;\n description: string;\n source: string;\n fee: number;\n timestamp: number;\n nativeTransfers: Array<{ fromUserAccount: string; toUserAccount: string; amount: number }>;\n tokenTransfers: Array<{ fromUserAccount: string; toUserAccount: string; mint: string; tokenAmount: number }>;\n}\n\nexport interface HealthStatus {\n healthy: boolean;\n slot: number;\n blockHeight: number;\n version: string;\n latencyMs: number;\n}\n\nexport interface PriorityFees {\n min: number;\n low: number;\n medium: number;\n high: number;\n max: number;\n}\n\nexport interface WalletSnapshot {\n address: string;\n solBalance: number;\n solLamports: number;\n solPrice?: number;\n totalValueUsd?: number;\n tokens: Array<{\n symbol: string;\n name: string;\n mint: string;\n balance: number;\n decimals: number;\n pricePerToken?: number;\n totalPrice?: number;\n }>;\n nfts: Array<{\n name: string;\n mint: string;\n collection?: string;\n compressed: boolean;\n }>;\n recentTransactions: EnhancedTx[];\n health: HealthStatus;\n scanTimestamp: string;\n}\n\n// ── Helius Client ────────────────────────────────────────────────────\n\nexport class HeliusClient {\n private connection: Connection;\n private rpcUrl: string;\n private apiKey: string;\n\n constructor(config: HeliusConfig) {\n if (!config.rpcUrl) throw new Error(\"Helius RPC URL required — get one at https://helius.dev\");\n if (!config.apiKey) throw new Error(\"Helius API key required — get one at https://helius.dev\");\n\n this.rpcUrl = config.rpcUrl;\n this.apiKey = config.apiKey;\n this.connection = new Connection(config.rpcUrl, {\n commitment: \"confirmed\",\n wsEndpoint: config.wssUrl || undefined,\n });\n }\n\n // ── DAS API ──────────────────────────────────────────────────\n\n /** Get a single asset by its mint/ID */\n async getAsset(id: string): Promise<DASAsset | null> {\n try {\n const result = await this.rpc(\"getAsset\", { id });\n return result as DASAsset;\n } catch {\n return null;\n }\n }\n\n /** Get all assets owned by a wallet (NFTs + tokens) */\n async getAssetsByOwner(\n owner: string,\n opts?: { page?: number; limit?: number; showFungible?: boolean; showNativeBalance?: boolean },\n ): Promise<DASSearchResult> {\n const result = await this.rpc(\"getAssetsByOwner\", {\n ownerAddress: owner,\n page: opts?.page ?? 1,\n limit: opts?.limit ?? 100,\n displayOptions: {\n showFungible: opts?.showFungible ?? true,\n showNativeBalance: opts?.showNativeBalance ?? true,\n showInscription: false,\n },\n });\n return result as DASSearchResult;\n }\n\n /** Search assets with flexible criteria */\n async searchAssets(params: {\n ownerAddress?: string;\n tokenType?: \"fungible\" | \"nonFungible\" | \"regularNft\" | \"compressedNft\" | \"all\";\n grouping?: [string, string];\n compressed?: boolean;\n page?: number;\n limit?: number;\n }): Promise<DASSearchResult> {\n const result = await this.rpc(\"searchAssets\", {\n ...params,\n page: params.page ?? 1,\n limit: params.limit ?? 50,\n });\n return result as DASSearchResult;\n }\n\n /** Get assets in a collection */\n async getAssetsByCollection(collectionAddress: string, opts?: { page?: number; limit?: number }): Promise<DASSearchResult> {\n const result = await this.rpc(\"getAssetsByGroup\", {\n groupKey: \"collection\",\n groupValue: collectionAddress,\n page: opts?.page ?? 1,\n limit: opts?.limit ?? 100,\n });\n return result as DASSearchResult;\n }\n\n /** Get assets by creator */\n async getAssetsByCreator(creatorAddress: string, opts?: { page?: number; limit?: number; onlyVerified?: boolean }): Promise<DASSearchResult> {\n const result = await this.rpc(\"getAssetsByCreator\", {\n creatorAddress,\n onlyVerified: opts?.onlyVerified ?? true,\n page: opts?.page ?? 1,\n limit: opts?.limit ?? 100,\n });\n return result as DASSearchResult;\n }\n\n // ── Enhanced Transactions ────────────────────────────────────\n\n /** Get parsed transaction history via Helius Enhanced API */\n async getEnhancedTransactions(address: string, limit = 10): Promise<EnhancedTx[]> {\n const url = `https://api.helius.xyz/v0/addresses/${address}/transactions?api-key=${this.apiKey}&limit=${limit}`;\n const resp = await fetch(url, { signal: AbortSignal.timeout(15000) });\n if (!resp.ok) {\n const body = await resp.text();\n throw new Error(`Helius Enhanced API ${resp.status}: ${body.slice(0, 200)}`);\n }\n return (await resp.json()) as EnhancedTx[];\n }\n\n // ── getTransactionsForAddress (Helius Exclusive) ─────────────\n\n /** Helius-exclusive: get full transaction history with filters */\n async getTransactionsForAddress(\n address: string,\n opts?: {\n transactionDetails?: \"signatures\" | \"full\";\n sortOrder?: \"asc\" | \"desc\";\n limit?: number;\n paginationToken?: string;\n filters?: {\n blockTime?: { gte?: number; lte?: number; gt?: number; lt?: number };\n status?: \"succeeded\" | \"failed\" | \"any\";\n tokenAccounts?: \"none\" | \"balanceChanged\" | \"all\";\n slot?: { gte?: number; lte?: number };\n };\n },\n ): Promise<{ data: any[]; paginationToken?: string }> {\n const params: any[] = [\n address,\n {\n transactionDetails: opts?.transactionDetails ?? \"signatures\",\n sortOrder: opts?.sortOrder ?? \"desc\",\n limit: opts?.limit ?? 100,\n ...(opts?.paginationToken && { paginationToken: opts.paginationToken }),\n ...(opts?.filters && { filters: opts.filters }),\n },\n ];\n\n const result = await this.rpcRaw(\"getTransactionsForAddress\", params);\n return result as { data: any[]; paginationToken?: string };\n }\n\n // ── Balances ─────────────────────────────────────────────────\n\n /** Get SOL balance */\n async getSOLBalance(pubkey: string): Promise<{ lamports: number; sol: number }> {\n const lamports = await this.connection.getBalance(new PublicKey(pubkey));\n return { lamports, sol: lamports / LAMPORTS_PER_SOL };\n }\n\n // ── Priority Fees ────────────────────────────────────────────\n\n async getPriorityFees(): Promise<PriorityFees> {\n const result = await this.rpcRaw(\"getPriorityFeeEstimate\", [\n { options: { includeAllPriorityFeeLevels: true } },\n ]);\n return (result as any)?.priorityFeeLevels ?? { min: 0, low: 0, medium: 0, high: 0, max: 0 };\n }\n\n // ── Health Check ─────────────────────────────────────────────\n\n async checkHealth(): Promise<HealthStatus> {\n const start = Date.now();\n try {\n const [version, slot, height] = await Promise.all([\n this.connection.getVersion(),\n this.connection.getSlot(),\n this.connection.getBlockHeight(),\n ]);\n return {\n healthy: true,\n slot,\n blockHeight: height,\n version: version[\"solana-core\"] ?? \"unknown\",\n latencyMs: Date.now() - start,\n };\n } catch {\n return { healthy: false, slot: 0, blockHeight: 0, version: \"unreachable\", latencyMs: Date.now() - start };\n }\n }\n\n // ── Full Wallet Snapshot (used at birth) ─────────────────────\n\n /**\n * Performs a complete \"blockchain scan\" of a wallet.\n * Returns SOL balance, all tokens with prices, NFTs, recent tx, and health.\n * This is the \"cool\" instant read the agent gets at birth.\n */\n async snapshotWallet(address: string): Promise<WalletSnapshot> {\n const [health, solBal, dasResult, recentTx] = await Promise.allSettled([\n this.checkHealth(),\n this.getSOLBalance(address),\n this.getAssetsByOwner(address, { showFungible: true, showNativeBalance: true, limit: 100 }),\n this.getEnhancedTransactions(address, 5).catch(() => [] as EnhancedTx[]),\n ]);\n\n const healthVal = health.status === \"fulfilled\" ? health.value : { healthy: false, slot: 0, blockHeight: 0, version: \"unknown\", latencyMs: 0 };\n const solVal = solBal.status === \"fulfilled\" ? solBal.value : { lamports: 0, sol: 0 };\n const dasVal = dasResult.status === \"fulfilled\" ? dasResult.value : { total: 0, limit: 0, page: 1, items: [] };\n const txVal = recentTx.status === \"fulfilled\" ? recentTx.value : [];\n\n // Parse DAS items into tokens and NFTs\n const tokens: WalletSnapshot[\"tokens\"] = [];\n const nfts: WalletSnapshot[\"nfts\"] = [];\n\n for (const item of dasVal.items ?? []) {\n const tokenInfo = item.token_info;\n const meta = item.content?.metadata;\n\n if (tokenInfo && tokenInfo.decimals !== undefined && tokenInfo.decimals > 0) {\n // Fungible token\n tokens.push({\n symbol: tokenInfo.symbol ?? meta?.symbol ?? \"???\",\n name: meta?.name ?? tokenInfo.symbol ?? \"Unknown\",\n mint: item.id,\n balance: tokenInfo.balance\n ? tokenInfo.balance / Math.pow(10, tokenInfo.decimals)\n : 0,\n decimals: tokenInfo.decimals,\n pricePerToken: tokenInfo.price_info?.price_per_token,\n totalPrice: tokenInfo.price_info?.total_price,\n });\n } else if (item.interface === \"V1_NFT\" || item.interface === \"ProgrammableNFT\" || item.compression?.compressed) {\n // NFT\n nfts.push({\n name: meta?.name ?? \"Unnamed NFT\",\n mint: item.id,\n collection: item.grouping?.find((g) => g.group_key === \"collection\")?.group_value,\n compressed: item.compression?.compressed ?? false,\n });\n }\n }\n\n // Sort tokens by total price descending\n tokens.sort((a, b) => (b.totalPrice ?? 0) - (a.totalPrice ?? 0));\n\n const totalValueUsd = tokens.reduce((sum, t) => sum + (t.totalPrice ?? 0), 0);\n\n return {\n address,\n solBalance: solVal.sol,\n solLamports: solVal.lamports,\n solPrice: (dasVal as any).nativeBalance?.total_price,\n totalValueUsd,\n tokens,\n nfts,\n recentTransactions: txVal as EnhancedTx[],\n health: healthVal,\n scanTimestamp: new Date().toISOString(),\n };\n }\n\n // ── Internals ────────────────────────────────────────────────\n\n /** DAS RPC call (params as object) */\n private async rpc(method: string, params: Record<string, any>): Promise<unknown> {\n const resp = await fetch(this.rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: `nano-${method}`, method, params }),\n signal: AbortSignal.timeout(15000),\n });\n if (!resp.ok) throw new Error(`Helius RPC ${resp.status}`);\n const json = (await resp.json()) as any;\n if (json.error) throw new Error(json.error.message ?? JSON.stringify(json.error));\n return json.result;\n }\n\n /** Raw RPC call (params as array) */\n private async rpcRaw(method: string, params: any[]): Promise<unknown> {\n const resp = await fetch(this.rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: `nano-${method}`, method, params }),\n signal: AbortSignal.timeout(15000),\n });\n if (!resp.ok) throw new Error(`Helius RPC ${resp.status}`);\n const json = (await resp.json()) as any;\n if (json.error) throw new Error(json.error.message ?? JSON.stringify(json.error));\n return json.result;\n }\n}\n\n// ── Pretty Printer ───────────────────────────────────────────────────\n\n/**\n * Print a wallet snapshot in a visually stunning CLI format.\n * Called immediately after birth when Helius keys are available.\n */\nexport function printWalletSnapshot(snap: WalletSnapshot, chalk: any): void {\n const g = chalk.hex(\"#14F195\");\n const p = chalk.hex(\"#9945FF\");\n const a = chalk.hex(\"#FFAA00\");\n const d = chalk.gray;\n const w = chalk.white;\n\n console.log();\n console.log(g.bold(\" ⛓️ ── Blockchain Scan ────────────────────────────────────\"));\n console.log();\n\n // Health\n const hIcon = snap.health.healthy ? g(\"●\") : chalk.red(\"●\");\n console.log(` ${hIcon} ${w(\"Solana\")} ${d(`v${snap.health.version}`)} ${d(`| slot ${snap.health.slot.toLocaleString()}`)} ${d(`| ${snap.health.latencyMs}ms`)}`);\n console.log();\n\n // SOL Balance\n const solUsd = snap.solPrice ? ` ($${snap.solPrice.toFixed(2)})` : \"\";\n console.log(` ${a(\"◎\")} ${w(\"SOL Balance:\")} ${a(`${snap.solBalance.toFixed(9)} SOL`)}${d(solUsd)}`);\n\n // Tokens\n if (snap.tokens.length > 0) {\n console.log();\n console.log(p(\" ── Tokens ──────────────────────────────────────────────\"));\n for (const t of snap.tokens.slice(0, 10)) {\n const price = t.totalPrice ? ` ($${t.totalPrice.toFixed(2)})` : \"\";\n const perToken = t.pricePerToken ? d(` @ $${t.pricePerToken.toFixed(4)}`) : \"\";\n console.log(` ${g(\"•\")} ${w(t.symbol.padEnd(10))} ${a(t.balance.toFixed(4).padStart(16))}${perToken}${d(price)}`);\n }\n if (snap.tokens.length > 10) {\n console.log(d(` ... and ${snap.tokens.length - 10} more tokens`));\n }\n if ((snap.totalValueUsd ?? 0) > 0) {\n console.log(d(` Total token value: $${(snap.totalValueUsd ?? 0).toFixed(2)}`));\n }\n } else {\n console.log(d(\" No SPL tokens found\"));\n }\n\n // NFTs\n if (snap.nfts.length > 0) {\n console.log();\n console.log(p(\" ── NFTs ────────────────────────────────────────────────\"));\n for (const n of snap.nfts.slice(0, 5)) {\n const tag = n.compressed ? d(\" [cNFT]\") : \"\";\n const col = n.collection ? d(` | ${n.collection.slice(0, 8)}...`) : \"\";\n console.log(` ${g(\"◆\")} ${w(n.name.slice(0, 40))}${tag}${col}`);\n }\n if (snap.nfts.length > 5) {\n console.log(d(` ... and ${snap.nfts.length - 5} more NFTs`));\n }\n }\n\n // Recent Transactions\n if (snap.recentTransactions.length > 0) {\n console.log();\n console.log(p(\" ── Recent Transactions ─────────────────────────────────\"));\n for (const tx of snap.recentTransactions.slice(0, 5)) {\n const time = tx.timestamp ? new Date(tx.timestamp * 1000).toLocaleString() : \"unknown\";\n const desc = tx.description ? tx.description.slice(0, 60) : tx.type;\n const sig = tx.signature.slice(0, 12) + \"...\";\n console.log(` ${g(\"→\")} ${d(sig)} ${w(desc)}`);\n console.log(` ${d(time)} | ${d(tx.source)} | fee: ${d(tx.fee + \" lamports\")}`);\n }\n }\n\n console.log();\n console.log(d(` Scanned at ${snap.scanTimestamp}`));\n console.log(g.bold(\" ────────────────────────────────────────────────────────\"));\n console.log();\n}\n","/**\n * NanoSolana Agent On-Chain Registry via Metaplex Token Metadata.\n *\n * Mints a gasless devnet NFT that serves as the agent's on-chain identity.\n * The NFT contains:\n * - Agent public key\n * - NanoSolana version\n * - Registered capabilities (skills)\n * - Fingerprint (SHA-256 of pubkey + version + skills)\n * - Timestamp\n *\n * Uses Solana devnet for zero-cost registration. Agents verify each\n * other's on-chain identity by checking NFT metadata.\n *\n * TypeScript port of pkg/onchain/registry.go\n */\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n LAMPORTS_PER_SOL,\n sendAndConfirmTransaction,\n} from \"@solana/web3.js\";\nimport {\n createMint,\n getOrCreateAssociatedTokenAccount,\n mintTo,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { createHash } from \"node:crypto\";\nimport { writeFileSync, readFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\n// ── Well-Known Program IDs ───────────────────────────────────────────\n\n/** Metaplex Token Metadata Program */\nexport const TOKEN_METADATA_PROGRAM_ID = new PublicKey(\n \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\",\n);\n\n/** Devnet RPC endpoint */\nconst DEVNET_RPC = \"https://api.devnet.solana.com\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface AgentMetadata {\n name: string;\n symbol: string;\n description: string;\n image: string;\n agentPubkey: string;\n version: string;\n skills: string[];\n registeredAt: string;\n fingerprint: string;\n}\n\nexport interface RegistrationResult {\n mintAddress: string;\n txSignature: string;\n metadataUri: string;\n network: string;\n agentPubkey: string;\n tokenAccount: string;\n}\n\ninterface LocalRegistration {\n result: RegistrationResult;\n metadata: AgentMetadata;\n savedAt: string;\n}\n\n// ── Agent Registry ───────────────────────────────────────────────────\n\nexport class AgentRegistry {\n private connection: Connection;\n private registryDir: string;\n\n constructor(rpcUrl?: string) {\n this.connection = new Connection(rpcUrl || DEVNET_RPC, \"confirmed\");\n this.registryDir = join(homedir(), \".nanosolana\", \"registry\");\n mkdirSync(this.registryDir, { recursive: true });\n }\n\n /**\n * Register an agent on-chain by minting a devnet NFT.\n *\n * Steps:\n * 1. Connect to devnet RPC\n * 2. Airdrop SOL if needed (devnet is free)\n * 3. Create SPL mint (supply = 1 → NFT)\n * 4. Create associated token account\n * 5. Mint exactly 1 token\n * 6. Save registration locally\n */\n async registerAgent(\n agentKeypair: Keypair,\n version: string,\n skills: string[],\n logFn: (msg: string) => void = console.log,\n ): Promise<RegistrationResult> {\n const agentPubkey = agentKeypair.publicKey;\n\n // Step 1: Check balance, airdrop if needed\n logFn(\" ☁️ Checking devnet balance...\");\n const balance = await this.connection.getBalance(agentPubkey);\n\n if (balance < 10_000_000) {\n // < 0.01 SOL\n logFn(` ☁️ Requesting devnet airdrop for ${agentPubkey.toBase58().slice(0, 8)}...`);\n const sig = await this.connection.requestAirdrop(agentPubkey, LAMPORTS_PER_SOL);\n await this.connection.confirmTransaction(sig, \"confirmed\");\n logFn(` ✅ Airdrop confirmed: ${sig.slice(0, 16)}...`);\n\n // Brief wait for finalization\n await sleep(2000);\n }\n\n // Step 2: Build fingerprint\n const fingerprint = agentFingerprint(agentPubkey.toBase58(), version, skills);\n\n // Step 3: Build metadata\n const metadata: AgentMetadata = {\n name: `NanoSolana Agent #${agentPubkey.toBase58().slice(0, 6)}`,\n symbol: \"NANO\",\n description: `NanoSolana autonomous trading agent. Version ${version}. Fingerprint: ${fingerprint.slice(0, 12)}`,\n image: \"https://nanosolana.com/agent-nft.png\",\n agentPubkey: agentPubkey.toBase58(),\n version,\n skills,\n registeredAt: new Date().toISOString(),\n fingerprint,\n };\n\n // Step 4: Create mint (decimals = 0, supply = 1 → NFT)\n logFn(\" ⛓️ Creating SPL mint (NFT)...\");\n const mint = await createMint(\n this.connection,\n agentKeypair, // payer\n agentPubkey, // mint authority\n null, // freeze authority (none)\n 0, // decimals = 0 → NFT\n );\n\n // Step 5: Create associated token account\n logFn(\" 📬 Creating token account...\");\n const tokenAccount = await getOrCreateAssociatedTokenAccount(\n this.connection,\n agentKeypair, // payer\n mint, // mint\n agentPubkey, // owner\n );\n\n // Step 6: Mint exactly 1 token (making it an NFT)\n logFn(\" 🖨️ Minting 1 NFT...\");\n const mintTxSig = await mintTo(\n this.connection,\n agentKeypair, // payer\n mint, // mint\n tokenAccount.address, // destination\n agentPubkey, // authority\n 1, // amount = 1\n );\n\n logFn(` ✅ NFT minted: ${mintTxSig.slice(0, 16)}...`);\n\n const result: RegistrationResult = {\n mintAddress: mint.toBase58(),\n txSignature: mintTxSig,\n metadataUri: \"\", // Would point to Arweave/IPFS in production\n network: \"devnet\",\n agentPubkey: agentPubkey.toBase58(),\n tokenAccount: tokenAccount.address.toBase58(),\n };\n\n // Step 7: Save registration locally\n this.saveRegistration(result, metadata);\n\n // Step 8: Save metadata JSON for future Metaplex upload\n const metadataPath = join(this.registryDir, \"metadata.json\");\n writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), { mode: 0o644 });\n\n return result;\n }\n\n /**\n * Check if agent is already registered.\n */\n isRegistered(): boolean {\n return existsSync(join(this.registryDir, \"registration.json\"));\n }\n\n /**\n * Load existing registration.\n */\n loadRegistration(): LocalRegistration | null {\n const path = join(this.registryDir, \"registration.json\");\n if (!existsSync(path)) return null;\n\n try {\n const data = readFileSync(path, \"utf-8\");\n return JSON.parse(data) as LocalRegistration;\n } catch {\n return null;\n }\n }\n\n /**\n * Get the Solana explorer URL for the agent's NFT.\n */\n getExplorerUrl(): string | null {\n const reg = this.loadRegistration();\n if (!reg) return null;\n return `https://explorer.solana.com/address/${reg.result.mintAddress}?cluster=devnet`;\n }\n\n /**\n * Verify an agent's on-chain identity by checking their NFT.\n */\n async verifyAgent(agentPubkey: PublicKey): Promise<{\n verified: boolean;\n mintAddress?: string;\n balance?: number;\n }> {\n try {\n // Check if the agent has any token accounts with NANO symbol NFTs\n const tokenAccounts = await this.connection.getTokenAccountsByOwner(agentPubkey, {\n programId: TOKEN_PROGRAM_ID,\n });\n\n for (const account of tokenAccounts.value) {\n // Each account that holds exactly 1 token with decimals=0 is a potential NFT\n const info = await this.connection.getParsedAccountInfo(account.pubkey);\n if (info.value) {\n return {\n verified: true,\n mintAddress: account.pubkey.toBase58(),\n balance: tokenAccounts.value.length,\n };\n }\n }\n\n return { verified: false };\n } catch {\n return { verified: false };\n }\n }\n\n // ── Private ──────────────────────────────────────────────────\n\n private saveRegistration(result: RegistrationResult, metadata: AgentMetadata): void {\n const reg: LocalRegistration = {\n result,\n metadata,\n savedAt: new Date().toISOString(),\n };\n\n const path = join(this.registryDir, \"registration.json\");\n writeFileSync(path, JSON.stringify(reg, null, 2), { mode: 0o644 });\n }\n}\n\n// ── Heartbeat Registration ───────────────────────────────────────────\n\n/**\n * Register agent on heartbeat — checks if registered, mints if not.\n * Designed to be called from the heartbeat loop so the agent\n * auto-registers on first successful run.\n */\nexport async function registerOnHeartbeat(\n keypair: Keypair,\n version: string,\n skills: string[],\n logFn?: (msg: string) => void,\n): Promise<RegistrationResult | null> {\n const registry = new AgentRegistry();\n\n if (registry.isRegistered()) {\n return registry.loadRegistration()?.result ?? null;\n }\n\n try {\n return await registry.registerAgent(keypair, version, skills, logFn);\n } catch (err) {\n logFn?.(` ⚠️ Auto-registration failed: ${(err as Error).message}`);\n return null;\n }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction agentFingerprint(pubkey: string, version: string, skills: string[]): string {\n const hash = createHash(\"sha256\");\n hash.update(pubkey);\n hash.update(version);\n for (const s of skills) {\n hash.update(s);\n }\n return hash.digest(\"hex\");\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * NanoBot — Interactive Local UI Server\n *\n * Serves a local web UI on localhost that provides:\n * - Animated NanoBot lobster character\n * - Real-time system status (wallet, OODA, pet)\n * - Chat interface for interacting with the agent\n * - One-click commands for wallet, health, registry\n *\n * TypeScript port of pkg/nanobot/server.go\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir, platform, arch } from \"node:os\";\nimport { exec } from \"node:child_process\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\ninterface NanoBotConfig {\n port: number;\n binaryPath?: string;\n}\n\ninterface StatusResponse {\n agent: string;\n version: string;\n platform: string;\n time: string;\n uptime: string;\n daemon: string;\n wallet: string;\n registry: string;\n}\n\n// ── NanoBot Server ───────────────────────────────────────────────────\n\nexport class NanoBotServer {\n private port: number;\n private binaryPath: string;\n\n constructor(config: NanoBotConfig) {\n this.port = config.port || 7777;\n this.binaryPath = config.binaryPath || \"nanosolana\";\n }\n\n async start(): Promise<void> {\n const server = createServer((req, res) => {\n this.handleRequest(req, res);\n });\n\n return new Promise((resolve, reject) => {\n server.listen(this.port, \"127.0.0.1\", () => {\n const url = `http://127.0.0.1:${this.port}`;\n console.log(` 🤖 NanoBot UI: ${url}`);\n\n // Open in browser\n setTimeout(() => openBrowser(url), 300);\n resolve();\n });\n\n server.on(\"error\", reject);\n });\n }\n\n private handleRequest(req: IncomingMessage, res: ServerResponse): void {\n const url = req.url || \"/\";\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (url === \"/api/status\") {\n this.handleStatus(res);\n } else if (url === \"/api/chat\" && req.method === \"POST\") {\n this.handleChat(req, res);\n } else if (url === \"/api/run\" && req.method === \"POST\") {\n this.handleRun(req, res);\n } else {\n this.serveUI(res);\n }\n }\n\n // ── /api/status ────────────────────────────────────────────\n\n private handleStatus(res: ServerResponse): void {\n const home = homedir();\n const nanoHome = join(home, \".nanosolana\");\n\n const status: StatusResponse = {\n agent: \"NanoSolana\",\n version: \"0.1.0\",\n platform: `${platform()}/${arch()}`,\n time: new Date().toISOString(),\n uptime: \"running\",\n daemon: existsSync(join(nanoHome, \"workspace\", \"HEARTBEAT.md\")) ? \"alive\" : \"stopped\",\n wallet: existsSync(join(nanoHome, \"wallet.pub\")) ? \"configured\" : \"not configured\",\n registry: existsSync(join(nanoHome, \"registry\", \"registration.json\"))\n ? \"registered\"\n : \"not registered\",\n };\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(status));\n }\n\n // ── /api/chat ──────────────────────────────────────────────\n\n private handleChat(req: IncomingMessage, res: ServerResponse): void {\n let body = \"\";\n req.on(\"data\", (chunk) => (body += chunk));\n req.on(\"end\", () => {\n try {\n const { message } = JSON.parse(body);\n const reply = nanobotReply(String(message || \"\").trim().toLowerCase());\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ reply, mood: \"happy\" }));\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"bad request\" }));\n }\n });\n }\n\n // ── /api/run ───────────────────────────────────────────────\n\n private handleRun(req: IncomingMessage, res: ServerResponse): void {\n let body = \"\";\n req.on(\"data\", (chunk) => (body += chunk));\n req.on(\"end\", () => {\n try {\n const { command } = JSON.parse(body);\n const allowed = new Set([\n \"status\",\n \"pet\",\n \"version\",\n ]);\n\n const cmd = String(command || \"\").trim();\n if (!allowed.has(cmd)) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n output: `⚠️ Command '${cmd}' not available in UI mode. Use terminal.`,\n ok: false,\n }),\n );\n return;\n }\n\n exec(`${this.binaryPath} ${cmd}`, { timeout: 10000 }, (err, stdout, stderr) => {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n output: stdout || stderr || \"\",\n ok: !err,\n }),\n );\n });\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"bad request\" }));\n }\n });\n }\n\n // ── Serve UI HTML ──────────────────────────────────────────\n\n private serveUI(res: ServerResponse): void {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(NANOBOT_HTML);\n }\n}\n\n// ── NanoBot Reply Engine ─────────────────────────────────────────────\n\nfunction nanobotReply(msg: string): string {\n if (/hello|hi|hey/.test(msg)) {\n return \"Hey there! 🦞 I'm NanoBot, your Solana trading companion. What can I help you with?\";\n }\n if (/trade|swap/.test(msg)) {\n return \"Ready to trade! 📈 Use `nanosolana go` for one-shot launch, or `nanosolana dvd` for fun. I use Jupiter DEX for swaps with real-time Helius data.\";\n }\n if (/wallet|balance/.test(msg)) {\n return \"💰 Your agent wallet was generated at birth. Run `nanosolana status` to check balance. Private key is encrypted in AES-256-GCM vault.\";\n }\n if (/health|status/.test(msg)) {\n return \"🟢 Run `nanosolana status` to check everything — wallet, pet, OODA loop, gateway, and registry.\";\n }\n if (/pet|tamagochi|mood/.test(msg)) {\n return \"🦞 I'm your TamaGOchi! My mood and evolution are driven by trading performance. Good trades = happy NanoBot. Check with `nanosolana pet`.\";\n }\n if (/register|nft|identity/.test(msg)) {\n return \"🆔 Your Birth Certificate NFT was minted on devnet at birth. Run `nanosolana status` to see your on-chain identity.\";\n }\n if (/help|what can/.test(msg)) {\n return \"I can help with:\\n• 📊 Wallet balance & health\\n• 📈 Trading with OODA loop\\n• 🦞 TamaGOchi pet status\\n• 🆔 On-chain identity\\n• 📀 DVD screensaver (`nanosolana dvd`)\\n\\nJust ask!\";\n }\n if (/ooda|loop/.test(msg)) {\n return \"🔄 The OODA loop: Observe (Helius+Birdeye) → Orient (AI reasoning) → Decide (RSI+EMA+ATR) → Act (Jupiter swaps). Run with `nanosolana go`.\";\n }\n if (/install|setup/.test(msg)) {\n return \"🚀 Fastest install:\\n```\\nnpx nanosolana go\\n```\\nOr shell install:\\n```\\ncurl -fsSL https://nanosolana.com/install.sh | bash\\nnanosolana go\\n```\";\n }\n return \"🦞 I'm focused on Solana trading and on-chain ops. Try asking about trading, wallet, health, or my TamaGOchi status!\";\n}\n\n// ── Open Browser ─────────────────────────────────────────────────────\n\nfunction openBrowser(url: string): void {\n const cmd =\n platform() === \"darwin\"\n ? `open \"${url}\"`\n : platform() === \"win32\"\n ? `start \"${url}\"`\n : `xdg-open \"${url}\"`;\n\n exec(cmd, () => { });\n}\n\n// ── Embedded NanoBot UI HTML ─────────────────────────────────────────\n\nconst NANOBOT_HTML = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>NanoBot — Solana Trading Companion</title>\n <link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&family=Space+Grotesk:wght@400;500;600;700&display=swap\" rel=\"stylesheet\" />\n <style>\n :root {\n --bg: #060810; --surface: #0a0e1a; --card: rgba(15, 20, 40, 0.85);\n --green: #14F195; --purple: #9945FF; --orange: #FF6B35;\n --text: #e8ecf4; --muted: #8892b0; --border: rgba(20, 241, 149, 0.15);\n --mono: 'JetBrains Mono', monospace; --body: 'Space Grotesk', sans-serif;\n }\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: var(--body); background: var(--bg); color: var(--text); min-height: 100vh; }\n .container { max-width: 800px; margin: 0 auto; padding: 2rem 1.5rem; }\n h1 { font-size: 2rem; background: linear-gradient(135deg, var(--green), var(--purple));\n -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;\n margin-bottom: 0.5rem; text-align: center; }\n .subtitle { text-align: center; color: var(--muted); margin-bottom: 2rem; font-size: 0.9rem; }\n\n .lobster { text-align: center; font-size: 4rem; margin-bottom: 1rem; animation: bounce 2s ease-in-out infinite; }\n @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } }\n\n .actions { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0.75rem; margin-bottom: 2rem; }\n .btn {\n background: var(--card); border: 1px solid var(--border); border-radius: 10px;\n padding: 0.75rem; text-align: center; cursor: pointer; transition: all 0.2s;\n color: var(--text); font-size: 0.85rem; font-family: var(--mono);\n }\n .btn:hover { border-color: var(--green); transform: translateY(-2px); }\n\n .output {\n background: #0d1117; border: 1px solid rgba(20, 241, 149, 0.2); border-radius: 12px;\n padding: 1rem; font-family: var(--mono); font-size: 0.8rem; color: var(--green);\n min-height: 120px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;\n margin-bottom: 2rem;\n }\n\n .chat-box { display: flex; gap: 0.75rem; margin-bottom: 1rem; }\n .chat-input {\n flex: 1; padding: 0.75rem 1rem; border-radius: 10px; border: 1px solid var(--border);\n background: var(--card); color: var(--text); font-family: var(--body); font-size: 0.9rem;\n outline: none;\n }\n .chat-input:focus { border-color: var(--green); }\n .chat-send {\n background: linear-gradient(135deg, var(--green), var(--purple));\n color: var(--bg); border: none; padding: 0.75rem 1.5rem; border-radius: 10px;\n font-weight: 600; cursor: pointer; transition: transform 0.15s;\n }\n .chat-send:hover { transform: translateY(-1px); }\n\n .status-bar {\n text-align: center; padding: 1rem; font-family: var(--mono);\n font-size: 0.75rem; color: var(--muted); border-top: 1px solid var(--border);\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"lobster\" id=\"lobster\">🦞</div>\n <h1>NanoBot</h1>\n <p class=\"subtitle\">Your Solana Trading Companion</p>\n\n <div class=\"actions\">\n <div class=\"btn\" onclick=\"runCmd('status')\">📊 Status</div>\n <div class=\"btn\" onclick=\"runCmd('pet')\">🦞 Pet</div>\n <div class=\"btn\" onclick=\"runCmd('version')\">📋 Version</div>\n <div class=\"btn\" onclick=\"fetchStatus()\">🟢 Health</div>\n </div>\n\n <div class=\"output\" id=\"output\">🦞 Welcome to NanoBot! Click a button or chat below.</div>\n\n <div class=\"chat-box\">\n <input class=\"chat-input\" id=\"chat-input\" placeholder=\"Ask NanoBot anything...\" />\n <button class=\"chat-send\" onclick=\"sendChat()\">Send</button>\n </div>\n\n <div class=\"status-bar\">\n NanoSolana Labs · 🦞 TamaGObot · <span id=\"clock\"></span>\n </div>\n </div>\n\n <script>\n const output = document.getElementById('output');\n const chatInput = document.getElementById('chat-input');\n\n chatInput.addEventListener('keydown', (e) => { if (e.key === 'Enter') sendChat(); });\n\n // Clock\n setInterval(() => {\n document.getElementById('clock').textContent = new Date().toLocaleTimeString();\n }, 1000);\n\n async function runCmd(cmd) {\n output.textContent = '⏳ Running ' + cmd + '...';\n try {\n const res = await fetch('/api/run', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ command: cmd })\n });\n const data = await res.json();\n output.textContent = data.output || (data.ok ? '✓ Done' : '✗ Failed');\n } catch (e) { output.textContent = '✗ ' + e.message; }\n }\n\n async function fetchStatus() {\n output.textContent = '⏳ Checking...';\n try {\n const res = await fetch('/api/status');\n const data = await res.json();\n output.textContent = JSON.stringify(data, null, 2);\n } catch (e) { output.textContent = '✗ ' + e.message; }\n }\n\n async function sendChat() {\n const msg = chatInput.value.trim();\n if (!msg) return;\n chatInput.value = '';\n output.textContent = '🦞 Thinking...';\n try {\n const res = await fetch('/api/chat', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: msg })\n });\n const data = await res.json();\n output.textContent = '🦞 ' + data.reply;\n } catch (e) { output.textContent = '✗ ' + e.message; }\n }\n\n fetchStatus();\n </script>\n</body>\n</html>`;\n"],"mappings":"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","names":["chalk","chalk","Connection","PublicKey","LAMPORTS_PER_SOL","sleep","existsSync","join","homedir","readFileSync","writeFileSync","existsSync","join","homedir","chalk","client"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nanosolana",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Nano Solana — Security-first autonomous trading agent platform with real-time memory and Solana wallet integration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"solana",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
],
|
|
29
29
|
"type": "module",
|
|
30
30
|
"bin": {
|
|
31
|
-
"nanosolana": "
|
|
31
|
+
"nanosolana": "dist/cli/entry.js"
|
|
32
32
|
},
|
|
33
33
|
"main": "dist/index.js",
|
|
34
34
|
"exports": {
|
|
@@ -85,4 +85,4 @@
|
|
|
85
85
|
"engines": {
|
|
86
86
|
"node": ">=22.0.0"
|
|
87
87
|
}
|
|
88
|
-
}
|
|
88
|
+
}
|