{"version":3,"file":"help-command.mjs","names":[],"sources":["../../../src/commands/help-command.ts"],"sourcesContent":["/**\n * /help — Show all available commands grouped by category.\n * /portfolio — Show wallet balances and token holdings.\n *\n * Both are referenced in onboarding messages and expected by users.\n */\n\nimport { getWalletState } from '../services/walletconnect-service.js';\n\n// ── /help ───────────────────────────────────────────────────────────────────\n\n// ── Category help pages ─────────────────────────────────────────────────────\n\nconst HELP_CATEGORIES: Record<string, string> = {\n  trading: `**Trading**\n  Swaps, orders, and leveraged positions.\n\n  **Tools:** defi_swap, manage_orders, crypto_workflow, bankr_leverage, bankr_polymarket\n  **Commands:** /plans, /plans_active, /plans_cancel\n\n  **Try:**\n  \"Swap 0.1 ETH for USDC\"\n  \"Set a limit buy for ETH at $3500\"\n  \"DCA $100 into ETH every Monday\"\n  \"Open 3x long on ETH\"\n  \"What are the top Polymarket predictions?\"`,\n\n  defi: `**DeFi**\n  Lending, staking, yield, liquidity, and bridging.\n\n  **Tools:** lending, staking, yield, liquidity, bridge, governance\n  **Commands:** /chain\n\n  **Try:**\n  \"Supply 1 ETH as collateral on Aave\"\n  \"What's my health factor?\"\n  \"Bridge 100 USDC from Ethereum to Base\"\n  \"Show yield opportunities for USDC\"\n  \"Stake 0.5 ETH\"`,\n\n  portfolio: `**Portfolio & Market Data**\n  Balances, tracking, prices, and market intelligence.\n\n  **Tools:** defi_balance, defi_price, cost_basis, analytics, market_intel, block_explorer, watch_activity\n  **Commands:** /wallet, /balance, /portfolio, /chain, /tx\n\n  **Try:**\n  \"Show my portfolio\"\n  \"What's the price of ETH?\"\n  \"What's trending on Base?\"\n  \"Show cost basis for my USDC\"\n  \"Track whale activity\"`,\n\n  tools: `**User-Defined Tools & Extensions**\n  Create custom tools at runtime — API connectors, composed chains, natural language definitions.\n\n  **Commands:** /tools\n\n  **Try:**\n  \"Create a tool that checks Hetzner server status\"\n  \"Create a rebalance tool that checks portfolio and swaps to target weights\"\n  \"List my custom tools\"`,\n\n  agents: `**Multi-Agent Orchestration**\n  Delegate tasks to specialized sub-agents with restricted tool access.\n\n  **Preset agents:** strategist, analyst, accountant, risk_manager\n  **Commands:** /agents, /agents info <name>, /agents enable/disable <name>\n\n  **Try:**\n  \"Ask the analyst to evaluate ETH price trends\"\n  \"Have the risk manager assess my portfolio exposure\"\n  \"List available sub-agents\"`,\n\n  automation: `**Automation & Triggers**\n  Scheduled plans, price triggers, cron jobs, and webhook ingestion.\n\n  **Tools:** compound_action\n  **Commands:** /plans, /triggers, /webhooks\n\n  **Try:**\n  \"Every Monday at 9am, buy $50 of ETH\"\n  \"If ETH drops below $3000, sell half my position\"\n  \"Set up a webhook for GitHub push events\"`,\n\n  wallet: `**Wallet & Security**\n  Connect wallets, manage keys, set spending policies.\n\n  **Commands:**\n  /connect — Mobile wallet (MetaMask, Rainbow, etc.)\n  /create_wallet — New local wallet (BIP-39)\n  /import_wallet — Import from seed phrase\n  /connect_bankr — Bankr custodial wallet\n  /disconnect — Disconnect\n  /mode — Safety mode (safe/danger/readonly)\n  /policy — Spending auto-approval rules\n  /autosign — Auto-sign with local key\n  /walletsign — Phone approval (default)`,\n\n  fiat: `**Fiat & Payments**\n  On-ramp, off-ramp, recurring payments, invoices.\n\n  **Tools:** fiat_payment\n  **Commands:** /fiat\n\n  **Try:**\n  \"Cash out $500 USDC to my bank\"\n  \"Buy $200 of ETH from my bank account\"\n  \"Set up a $50/month recurring payment to 0x...\"`,\n};\n\nconst HELP_OVERVIEW = `**OpenClawnch — Command Reference**\n\n  /help trading — Swaps, orders, DCA, leverage\n  /help defi — Lending, staking, yield, bridging\n  /help portfolio — Balances, prices, tracking\n  /help automation — Triggers, schedules, webhooks\n  /help wallet — Wallets, keys, security\n  /help fiat — On/off-ramp, payments\n  /help tools — Custom tools, API connectors\n  /help agents — Sub-agent delegation\n\n**Quick commands:**\n  /connect — Connect wallet\n  /wallet — Status\n  /portfolio — Holdings\n  /balance — ETH balance\n  /plans — Scheduled plans\n  /setup — Config check\n  /doctor — Diagnostics\n\nOr just talk to me — \"What's the price of ETH?\", \"Show my portfolio\", \"Swap 0.1 ETH for USDC\"`;\n\nexport const helpCommand = {\n  name: 'help',\n  description: 'Show commands — /help <category> for details (trading, defi, portfolio, tools, agents, etc.)',\n  acceptsArgs: true,\n  requireAuth: false,\n  handler: async (ctx?: any) => {\n    const arg = (ctx?.args ?? '').trim().toLowerCase();\n\n    if (!arg || arg === 'all') {\n      return { text: HELP_OVERVIEW };\n    }\n\n    const page = HELP_CATEGORIES[arg];\n    if (page) {\n      return { text: page };\n    }\n\n    // Fuzzy match — try partial match\n    const match = Object.keys(HELP_CATEGORIES).find(k => k.startsWith(arg));\n    if (match) {\n      return { text: HELP_CATEGORIES[match]! };\n    }\n\n    return {\n      text: `No help category \"${arg}\".\\n\\nAvailable: ${Object.keys(HELP_CATEGORIES).join(', ')}\\n\\nUse /help for the full overview.`,\n    };\n  },\n};\n\n// ── /balance ────────────────────────────────────────────────────────────────\n\nexport const balanceCommand = {\n  name: 'balance',\n  description: 'Show ETH balance and wallet address',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (_ctx: any) => {\n    const state = getWalletState();\n\n    if (!state.connected || !state.address) {\n      return {\n        text: 'No wallet connected.\\n\\nUse /connect to pair your mobile wallet, or /connect_bankr for Bankr (custodial).',\n      };\n    }\n\n    const addr = state.address;\n    const short = `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n    const mode = state.mode === 'bankr' ? 'Bankr (custodial)' : state.mode === 'private_key' ? 'Private key' : 'WalletConnect';\n    const chainName = state.chainId ? (CHAIN_NAMES[state.chainId] ?? `Chain ${state.chainId}`) : null;\n\n    return {\n      text: `**Wallet:** ${short}\\n**Mode:** ${mode}${chainName ? `\\n**Chain:** ${chainName}` : ''}\\n\\nFull balances require an on-chain lookup. Ask me: \"Show my balances\" for a detailed breakdown with USD values.`,\n    };\n  },\n};\n\n// ── Shared chain lookup ─────────────────────────────────────────────────────\n\nconst CHAIN_NAMES: Record<number, string> = {\n  1: 'Ethereum Mainnet',\n  8453: 'Base',\n  42161: 'Arbitrum One',\n  10: 'Optimism',\n  137: 'Polygon',\n  84532: 'Base Sepolia',\n  11155111: 'Ethereum Sepolia',\n};\n\n// ── /chain ──────────────────────────────────────────────────────────────────\n\nexport const chainCommand = {\n  name: 'chain',\n  description: 'Show current chain',\n  acceptsArgs: false,\n  requireAuth: false,\n  handler: async (_ctx: any) => {\n    const state = getWalletState();\n\n    if (!state.connected) {\n      return {\n        text: 'No wallet connected. Default chain: **Base (8453)**\\n\\nConnect a wallet to interact with a specific chain: /connect',\n      };\n    }\n\n    const chainId = state.chainId ?? 8453;\n    const name = CHAIN_NAMES[chainId] ?? `Chain ${chainId}`;\n\n    return {\n      text: `**Current chain:** ${name} (${chainId})\\n\\nTo switch chains, ask me: \"Switch to Arbitrum\"`,\n    };\n  },\n};\n\n// ── /portfolio ──────────────────────────────────────────────────────────────\n\nexport const portfolioCommand = {\n  name: 'portfolio',\n  description: 'Show wallet balances and token holdings',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (_ctx: any) => {\n    const state = getWalletState();\n\n    if (!state.connected || !state.address) {\n      return {\n        text: `No wallet connected.\\n\\nUse /connect to pair your mobile wallet, or /connect_bankr for Bankr (custodial).\\n\\nOnce connected, ask me \"Show my portfolio\" or \"What are my balances?\" for a detailed breakdown.`,\n      };\n    }\n\n    // We don't do RPC calls from commands (keep them fast/synchronous).\n    // Instead, tell the LLM to use the defi_balance tool for a full breakdown.\n    const addr = state.address;\n    const short = `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n    const mode = state.mode === 'bankr' ? 'Bankr (custodial)' : state.mode === 'private_key' ? 'Private key' : 'WalletConnect';\n\n    return {\n      text: `**Wallet:** ${short}\\n**Mode:** ${mode}${state.chainId ? `\\n**Chain:** ${CHAIN_NAMES[state.chainId] ?? `Chain ${state.chainId}`}` : ''}${state.bankrSolAddress ? `\\n**Solana:** ${state.bankrSolAddress.slice(0, 6)}...${state.bankrSolAddress.slice(-4)}` : ''}\\n\\nFor a full token breakdown with USD values, ask me: \"Show my portfolio\" or \"What are my balances on Base?\"`,\n    };\n  },\n};\n"],"mappings":";;;;;;;;AAaA,MAAM,kBAA0C;CAC9C,SAAS;;;;;;;;;;;;CAaT,MAAM;;;;;;;;;;;;CAaN,WAAW;;;;;;;;;;;;CAaX,OAAO;;;;;;;;;CAUP,QAAQ;;;;;;;;;;CAWR,YAAY;;;;;;;;;;CAWZ,QAAQ;;;;;;;;;;;;;CAcR,MAAM;;;;;;;;;;CAUP;AAED,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;AAsBtB,MAAa,cAAc;CACzB,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAc;EAC5B,MAAM,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa;AAElD,MAAI,CAAC,OAAO,QAAQ,MAClB,QAAO,EAAE,MAAM,eAAe;EAGhC,MAAM,OAAO,gBAAgB;AAC7B,MAAI,KACF,QAAO,EAAE,MAAM,MAAM;EAIvB,MAAM,QAAQ,OAAO,KAAK,gBAAgB,CAAC,MAAK,MAAK,EAAE,WAAW,IAAI,CAAC;AACvE,MAAI,MACF,QAAO,EAAE,MAAM,gBAAgB,QAAS;AAG1C,SAAO,EACL,MAAM,qBAAqB,IAAI,mBAAmB,OAAO,KAAK,gBAAgB,CAAC,KAAK,KAAK,CAAC,uCAC3F;;CAEJ;AAID,MAAa,iBAAiB;CAC5B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,SAAc;EAC5B,MAAM,QAAQ,gBAAgB;AAE9B,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,QAC7B,QAAO,EACL,MAAM,6GACP;EAGH,MAAM,OAAO,MAAM;EACnB,MAAM,QAAQ,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,MAAM,GAAG;EACrD,MAAM,OAAO,MAAM,SAAS,UAAU,sBAAsB,MAAM,SAAS,gBAAgB,gBAAgB;EAC3G,MAAM,YAAY,MAAM,UAAW,YAAY,MAAM,YAAY,SAAS,MAAM,YAAa;AAE7F,SAAO,EACL,MAAM,eAAe,MAAM,cAAc,OAAO,YAAY,gBAAgB,cAAc,GAAG,qHAC9F;;CAEJ;AAID,MAAM,cAAsC;CAC1C,GAAG;CACH,MAAM;CACN,OAAO;CACP,IAAI;CACJ,KAAK;CACL,OAAO;CACP,UAAU;CACX;AAID,MAAa,eAAe;CAC1B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,SAAc;EAC5B,MAAM,QAAQ,gBAAgB;AAE9B,MAAI,CAAC,MAAM,UACT,QAAO,EACL,MAAM,uHACP;EAGH,MAAM,UAAU,MAAM,WAAW;AAGjC,SAAO,EACL,MAAM,sBAHK,YAAY,YAAY,SAAS,UAGX,IAAI,QAAQ,sDAC9C;;CAEJ;AAID,MAAa,mBAAmB;CAC9B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,SAAc;EAC5B,MAAM,QAAQ,gBAAgB;AAE9B,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,QAC7B,QAAO,EACL,MAAM,gNACP;EAKH,MAAM,OAAO,MAAM;AAInB,SAAO,EACL,MAAM,eAJM,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,MAAM,GAAG,GAIxB,cAHhB,MAAM,SAAS,UAAU,sBAAsB,MAAM,SAAS,gBAAgB,gBAAgB,kBAGzD,MAAM,UAAU,gBAAgB,YAAY,MAAM,YAAY,SAAS,MAAM,cAAc,KAAK,MAAM,kBAAkB,iBAAiB,MAAM,gBAAgB,MAAM,GAAG,EAAE,CAAC,KAAK,MAAM,gBAAgB,MAAM,GAAG,KAAK,GAAG,iHACxQ;;CAEJ"}