{"version":3,"file":"tool-config-service.mjs","names":[],"sources":["../../../src/services/tool-config-service.ts"],"sourcesContent":["/**\n * Tool Configuration Service — Centralized registry of what each tool needs.\n *\n * Maps tool names to their requirements (env vars, wallet, services).\n * Used by:\n *   - Tools themselves (early return with clean guidance when not configured)\n *   - /setup command (shows what's configured vs missing)\n *   - System prompt injection (tells the LLM what's available)\n */\n\n// ─── Types ───────────────────────────────────────────────────────────────\n\nexport interface ToolRequirement {\n  /** Tool name (matches the tool's `name` field) */\n  tool: string;\n  /** Human-readable label */\n  label: string;\n  /** Short description of what the tool does */\n  description: string;\n  /** Env vars required (ALL must be set for tool to work) */\n  requiredKeys: string[];\n  /** Env vars that add optional functionality */\n  optionalKeys?: string[];\n  /** Whether a connected wallet is required */\n  walletRequired?: boolean;\n  /** Whether the tool works without any keys (public APIs) */\n  worksWithoutKeys?: boolean;\n  /** Where to get the key(s) */\n  keySource?: string;\n  /** flykeys set example */\n  setupHint?: string;\n}\n\n// ─── Registry ────────────────────────────────────────────────────────────\n\nexport const TOOL_REQUIREMENTS: ToolRequirement[] = [\n  // ── Always works (public APIs) ─────────────────────────────────────\n  {\n    tool: 'defi_price',\n    label: 'Price Lookup',\n    description: 'Token prices via DexScreener (free)',\n    requiredKeys: [],\n    optionalKeys: ['COINGECKO_API_KEY', 'CMC_API_KEY'],\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'analytics',\n    label: 'Technical Analysis',\n    description: 'RSI, MACD, Bollinger Bands via DexScreener (free)',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'market_intel',\n    label: 'Market Intelligence',\n    description: 'Buys/sells, timeframe changes via DexScreener (free)',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'clawnch_info',\n    label: 'Clawnch Platform',\n    description: 'Platform stats, top tokens (free)',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'clawnch_fees',\n    label: 'Clawnch Fees',\n    description: 'Fee estimates and claim info (free)',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'cost_basis',\n    label: 'Cost Basis',\n    description: 'Token cost basis tracking (free)',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'crypto_workflow',\n    label: 'Workflow Planner',\n    description: 'Multi-step DeFi operation planner (free)',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n\n  // ── Wallet required ────────────────────────────────────────────────\n  {\n    tool: 'defi_swap',\n    label: 'DEX Swap',\n    description: 'Swap tokens via DEX aggregators',\n    requiredKeys: [],\n    optionalKeys: ['ZEROX_API_KEY', 'ONEINCH_API_KEY'],\n    walletRequired: true,\n    worksWithoutKeys: false,\n  },\n  {\n    tool: 'defi_balance',\n    label: 'Balance Check',\n    description: 'Check wallet token balances',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: false,\n  },\n  {\n    tool: 'transfer',\n    label: 'Token Transfer',\n    description: 'Send tokens to another address',\n    requiredKeys: [],\n    walletRequired: true,\n  },\n  {\n    tool: 'permit2',\n    label: 'Permit2 Approvals',\n    description: 'Gasless token approvals via Permit2',\n    requiredKeys: [],\n    walletRequired: true,\n  },\n  {\n    tool: 'clawnch_launch',\n    label: 'Token Launch',\n    description: 'Launch tokens on Clawnch',\n    requiredKeys: [],\n    walletRequired: true,\n  },\n  {\n    tool: 'liquidity',\n    label: 'Liquidity Management',\n    description: 'Add/remove liquidity positions',\n    requiredKeys: [],\n    walletRequired: true,\n  },\n  {\n    tool: 'manage_orders',\n    label: 'Order Management',\n    description: 'Limit orders and DCA',\n    requiredKeys: [],\n    walletRequired: true,\n  },\n  {\n    tool: 'clawnchconnect',\n    label: 'Wallet Connect',\n    description: 'Connect wallet (WalletConnect, private key, or Bankr)',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n\n  // ── Bridge (works without key but better with) ─────────────────────\n  {\n    tool: 'bridge',\n    label: 'Cross-chain Bridge',\n    description: 'Bridge tokens via LI.FI aggregator',\n    requiredKeys: [],\n    optionalKeys: ['LIFI_API_KEY'],\n    walletRequired: true,\n    worksWithoutKeys: true,\n    keySource: 'https://li.fi',\n    setupHint: '`/flykeys set LIFI_API_KEY your_key`',\n  },\n\n  // ── Requires specific API keys ─────────────────────────────────────\n  {\n    tool: 'herd_intelligence',\n    label: 'Herd Intelligence',\n    description: 'On-chain investigation, token safety audits, contract analysis',\n    requiredKeys: ['HERD_ACCESS_TOKEN'],\n    keySource: 'https://herdintelligence.com',\n    setupHint: '`/flykeys set HERD_ACCESS_TOKEN your_token`',\n  },\n  {\n    tool: 'block_explorer',\n    label: 'Block Explorer',\n    description: 'Etherscan/Basescan lookups (tx, contract source, holders)',\n    requiredKeys: ['BASESCAN_API_KEY'],\n    optionalKeys: ['ETHERSCAN_API_KEY'],\n    keySource: 'https://basescan.org/apis (free tier available)',\n    setupHint: '`/flykeys set BASESCAN_API_KEY your_key`',\n  },\n  {\n    tool: 'watch_activity',\n    label: 'On-chain Monitor',\n    description: 'Monitor swaps, transfers, deployments on Base',\n    requiredKeys: [],\n    walletRequired: false,\n    worksWithoutKeys: false,\n    // Needs RPC client initialized — this happens via wallet service init\n    setupHint: 'Connect a wallet first (/connect) or set a custom RPC (`/flykeys set CLAWNCHER_RPC_URL your_rpc_url`)',\n  },\n  {\n    tool: 'clawnx',\n    label: 'X/Twitter (ClawnX)',\n    description: 'Post tweets, engage, manage followers, DMs, lists',\n    requiredKeys: ['X_API_KEY', 'X_API_SECRET', 'X_ACCESS_TOKEN', 'X_ACCESS_TOKEN_SECRET'],\n    optionalKeys: ['X_BEARER_TOKEN'],\n    keySource: 'https://developer.x.com',\n    setupHint: '`/flykeys set X_API_KEY your_key` (+ 3 more keys)',\n  },\n  {\n    tool: 'hummingbot',\n    label: 'Hummingbot',\n    description: 'Market-making bot control',\n    requiredKeys: ['HUMMINGBOT_API_URL'],\n    optionalKeys: ['HUMMINGBOT_USERNAME', 'HUMMINGBOT_PASSWORD'],\n    keySource: 'Self-hosted Hummingbot instance',\n    setupHint: '`/flykeys set HUMMINGBOT_API_URL http://your-hummingbot:15888`',\n  },\n  {\n    tool: 'molten',\n    label: 'Molten (Agent Matching)',\n    description: 'Agent-to-agent intent matching on molten.gg',\n    requiredKeys: ['MOLTEN_API_KEY'],\n    keySource: 'Use the tool\\'s \"register\" action to get a key',\n    setupHint: '`/flykeys set MOLTEN_API_KEY your_key`',\n  },\n  {\n    tool: 'wayfinder',\n    label: 'Wayfinder',\n    description: 'Cross-chain routing and pathfinding',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n\n  // ── Bankr tools ────────────────────────────────────────────────────\n  {\n    tool: 'bankr_launch',\n    label: 'Bankr Token Launch',\n    description: 'Launch tokens via Bankr Agent API',\n    requiredKeys: ['BANKR_API_KEY'],\n    keySource: 'https://bankr.bot',\n    setupHint: '`/flykeys set BANKR_API_KEY bk_your_key`',\n  },\n  {\n    tool: 'bankr_automate',\n    label: 'Bankr Automations',\n    description: 'DCA, limit orders, portfolio rebalancing via Bankr',\n    requiredKeys: ['BANKR_API_KEY'],\n    keySource: 'https://bankr.bot',\n    setupHint: '`/flykeys set BANKR_API_KEY bk_your_key`',\n  },\n  {\n    tool: 'bankr_polymarket',\n    label: 'Bankr Polymarket',\n    description: 'Prediction market trading via Bankr',\n    requiredKeys: ['BANKR_API_KEY'],\n    keySource: 'https://bankr.bot',\n    setupHint: '`/flykeys set BANKR_API_KEY bk_your_key`',\n  },\n  {\n    tool: 'bankr_leverage',\n    label: 'Bankr Leverage',\n    description: 'Leveraged trading via Bankr',\n    requiredKeys: ['BANKR_API_KEY'],\n    keySource: 'https://bankr.bot',\n    setupHint: '`/flykeys set BANKR_API_KEY bk_your_key`',\n  },\n\n  // ── Phase 7: Compound operations ───────────────────────────────────\n  {\n    tool: 'compound_action',\n    label: 'Compound Actions',\n    description: 'Multi-step DeFi operations with scheduling, conditions, and sequencing',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: true,\n  },\n\n  // ── Phase 10: NFTs ────────────────────────────────────────────────\n  {\n    tool: 'nft',\n    label: 'NFT',\n    description: 'View, transfer, buy, list, and manage NFTs via Reservoir API',\n    requiredKeys: ['RESERVOIR_API_KEY'],\n    optionalKeys: [],\n    keySource: 'https://reservoir.tools (free tier available)',\n    setupHint: '`/flykeys set RESERVOIR_API_KEY your_key`',\n    walletRequired: true,\n  },\n\n  // ── Phase 11: Privacy ─────────────────────────────────────────────\n  {\n    tool: 'privacy',\n    label: 'Privacy',\n    description: 'Private transactions via Veil.cash ZK privacy pools on Base',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: true,\n  },\n\n  // ── Phase 10: Yield Aggregation ─────────────────────────────────\n  {\n    tool: 'yield',\n    label: 'Yield',\n    description: 'Find and execute yield opportunities across DeFi via DeFiLlama + Yearn V3 vaults',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: true,\n  },\n\n  // ── Phase 11: Browser Automation ──────────────────────────────────\n  {\n    tool: 'browser',\n    label: 'Browser',\n    description: 'Browser automation via PinchTab for dApp interaction, airdrop claims, and web scraping',\n    requiredKeys: [],\n    optionalKeys: ['PINCHTAB_URL'],\n    walletRequired: false,\n    worksWithoutKeys: true,\n    setupHint: 'Install PinchTab: https://pinchtab.com — then run `pinchtab serve`',\n  },\n\n  // ── Phase 10: Governance ──────────────────────────────────────────────\n  {\n    tool: 'governance',\n    label: 'Governance',\n    description: 'DAO governance: proposals, voting (Snapshot + on-chain), delegation',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: true,\n  },\n\n  // ── Phase 10: Farcaster ───────────────────────────────────────────────\n  {\n    tool: 'farcaster',\n    label: 'Farcaster',\n    description: 'Social actions on Farcaster: post, feed, search, channels, trending',\n    requiredKeys: ['NEYNAR_API_KEY'],\n    optionalKeys: ['NEYNAR_SIGNER_UUID', 'NEYNAR_FID'],\n    keySource: 'https://neynar.com (free tier available)',\n    setupHint: '`/flykeys set NEYNAR_API_KEY your_key`',\n    walletRequired: false,\n  },\n\n  // ── Phase 10: Safe Multisig ─────────────────────────────────────────\n  {\n    tool: 'safe',\n    label: 'Safe Multisig',\n    description: 'Manage Safe{Wallet} multisig: info, balances, pending txs, propose, confirm',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: true,\n  },\n\n  // ── Phase 10: Airdrop Tracking ────────────────────────────────────────\n  {\n    tool: 'airdrop',\n    label: 'Airdrop Tracker',\n    description: 'Check airdrop eligibility and generate claim transactions',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: true,\n  },\n\n  // ── V5: Multi-Agent Orchestration ──────────────────────────────────────\n  {\n    tool: 'agent_delegate',\n    label: 'Agent Delegate',\n    description: 'Delegate tasks to specialized sub-agents (strategist, analyst, accountant, risk_manager)',\n    requiredKeys: [],\n    optionalKeys: ['ANTHROPIC_API_KEY', 'OPENROUTER_API_KEY', 'OPENAI_API_KEY', 'BANKR_LLM_KEY'],\n    worksWithoutKeys: false,\n    keySource: 'Any LLM provider: Anthropic, OpenRouter, OpenAI, or Bankr',\n    setupHint: '`/flykeys set ANTHROPIC_API_KEY your_key` (or OPENROUTER_API_KEY, OPENAI_API_KEY, BANKR_LLM_KEY)',\n  },\n\n  // ── V3: Fiat & Traditional Finance Rails ─────────────────────────────\n  {\n    tool: 'fiat_payment',\n    label: 'Fiat Payment',\n    description: 'Off-ramp (sell crypto for fiat) and on-ramp (buy crypto with fiat) via Bridge.xyz or MoonPay',\n    requiredKeys: ['BRIDGE_API_KEY'],\n    optionalKeys: ['MOONPAY_API_KEY', 'FIAT_CURRENCY'],\n    walletRequired: true,\n    keySource: 'https://bridge.xyz (Bridge.xyz) or https://moonpay.com (MoonPay)',\n    setupHint: '`/flykeys set BRIDGE_API_KEY your_key` or `/flykeys set MOONPAY_API_KEY your_key`',\n  },\n\n  // ── V6: Policy Engine ─────────────────────────────────────────────────\n  {\n    tool: 'policy_manage',\n    label: 'Policy Manager',\n    description: 'Create and manage spending policies — limits, approval thresholds, allowlists, rate limits, time windows',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n    keySource: 'No API keys required',\n    setupHint: 'Just say what you want: \"don\\'t let me spend more than $500 a day on DeFi\"',\n  },\n\n  // ── DeFi Protocols (wallet required) ──────────────────────────────────\n  {\n    tool: 'defi_lend',\n    label: 'DeFi Lending',\n    description: 'Aave V3: supply, borrow, repay, withdraw, health factor, positions, live APYs',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'defi_stake',\n    label: 'DeFi Staking',\n    description: 'Liquid staking via Lido (stETH) and Rocket Pool (rETH)',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'approvals',\n    label: 'Approvals',\n    description: 'View, revoke, and manage ERC-20 token approvals and Permit2 allowances',\n    requiredKeys: [],\n    walletRequired: true,\n    worksWithoutKeys: true,\n  },\n\n  // ── Agent Memory & Skills (always available) ──────────────────────────\n  {\n    tool: 'agent_memory',\n    label: 'Agent Memory',\n    description: 'Persistent memory: save/recall facts, preferences, and discoveries across sessions',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'skill_evolve',\n    label: 'Skill Evolution',\n    description: 'Self-improvement: learn new skills, refine existing ones, track evolution',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n  {\n    tool: 'session_recall',\n    label: 'Session Recall',\n    description: 'Search and recall context from past conversation sessions',\n    requiredKeys: [],\n    worksWithoutKeys: true,\n  },\n];\n\n// ─── Lookup Helpers ──────────────────────────────────────────────────────\n\nconst _byTool = new Map<string, ToolRequirement>();\nfor (const req of TOOL_REQUIREMENTS) {\n  _byTool.set(req.tool, req);\n}\n\n/** Get requirements for a specific tool */\nexport function getToolRequirement(toolName: string): ToolRequirement | undefined {\n  return _byTool.get(toolName);\n}\n\n/** Check if a tool has all its required keys configured */\nexport function isToolConfigured(toolName: string): boolean {\n  const req = _byTool.get(toolName);\n  if (!req) return true; // Unknown tool — assume configured\n  if (req.worksWithoutKeys) return true;\n  if (req.requiredKeys.length === 0 && !req.walletRequired) return true;\n  return req.requiredKeys.every(k => !!process.env[k]);\n}\n\n/** Get missing keys for a tool */\nexport function getMissingKeys(toolName: string): string[] {\n  const req = _byTool.get(toolName);\n  if (!req) return [];\n  return req.requiredKeys.filter(k => !process.env[k]);\n}\n\n/**\n * Check tool configuration and return a clean guidance message if not configured.\n * Returns null if the tool is ready to use.\n *\n * Usage in tools:\n * ```ts\n * const notReady = checkToolConfig('block_explorer');\n * if (notReady) return notReady;\n * ```\n */\nexport function checkToolConfig(toolName: string): {\n  content: Array<{ type: 'text'; text: string }>;\n  details: unknown;\n  isError: true;\n} | null {\n  const req = _byTool.get(toolName);\n  if (!req) return null;\n\n  // Check required keys\n  const missing = req.requiredKeys.filter(k => !process.env[k]);\n  if (missing.length > 0) {\n    const lines = [\n      `${req.label} is not configured.`,\n      '',\n      `Missing: ${missing.map(k => `\\`${k}\\``).join(', ')}`,\n    ];\n\n    if (req.keySource) {\n      lines.push(`Get keys at: ${req.keySource}`);\n    }\n\n    if (req.setupHint) {\n      lines.push('', `Setup: ${req.setupHint}`);\n    }\n\n    lines.push('', 'Use /setup to see all tool requirements.');\n\n    return {\n      content: [{ type: 'text' as const, text: lines.join('\\n') }],\n      details: {\n        configured: false,\n        tool: toolName,\n        missingKeys: missing,\n        setupHint: req.setupHint,\n      },\n      isError: true as const,\n    };\n  }\n\n  return null;\n}\n\n// ─── Setup Summary ───────────────────────────────────────────────────────\n\nexport interface ToolStatus {\n  tool: string;\n  label: string;\n  description: string;\n  configured: boolean;\n  missingKeys: string[];\n  setupHint?: string;\n  keySource?: string;\n  walletRequired?: boolean;\n}\n\n/** Get status of all tools */\nexport function getAllToolStatus(): ToolStatus[] {\n  return TOOL_REQUIREMENTS.map(req => {\n    const missing = req.requiredKeys.filter(k => !process.env[k]);\n    const configured = req.worksWithoutKeys\n      || (req.requiredKeys.length === 0 && !req.walletRequired)\n      || missing.length === 0;\n\n    return {\n      tool: req.tool,\n      label: req.label,\n      description: req.description,\n      configured,\n      missingKeys: missing,\n      setupHint: req.setupHint,\n      keySource: req.keySource,\n      walletRequired: req.walletRequired,\n    };\n  });\n}\n"],"mappings":";AAmCA,MAAa,oBAAuC;CAElD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,cAAc,CAAC,qBAAqB,cAAc;EAClD,kBAAkB;EACnB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,kBAAkB;EACnB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,kBAAkB;EACnB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,kBAAkB;EACnB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,kBAAkB;EACnB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,kBAAkB;EACnB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,kBAAkB;EACnB;CAGD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,cAAc,CAAC,iBAAiB,kBAAkB;EAClD,gBAAgB;EAChB,kBAAkB;EACnB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,gBAAgB;EAChB,kBAAkB;EACnB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,kBAAkB;EACnB;CAGD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc,EAAE;EAChB,cAAc,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"}