{"version":3,"file":"hummingbot.mjs","names":[],"sources":["../../../src/tools/hummingbot.ts"],"sourcesContent":["/**\n * Hummingbot Tool — market-making bot control via HummingbotClient\n *\n * Wraps the @clawnch/clawncher-sdk HummingbotClient (76 methods) behind a single\n * OpenClaw tool with action-based dispatch. Requires a running Hummingbot instance.\n *\n * Env vars: HUMMINGBOT_API_URL, HUMMINGBOT_USERNAME, HUMMINGBOT_PASSWORD\n */\n\nimport { Type } from '@sinclair/typebox';\nimport { stringEnum, jsonResult, errorResult, readStringParam, readNumberParam } from '../lib/tool-helpers.js';\nimport { checkToolConfig } from '../services/tool-config-service.js';\nimport { getCredentialVault } from '../services/credential-vault.js';\n\nconst ACTIONS = [\n  'status', 'portfolio', 'order', 'cancel_order', 'active_orders',\n  'executor', 'stop_executor', 'executors', 'executor_types',\n  'market_data', 'candles', 'orderbook', 'funding_rate',\n  'bot_deploy', 'bot_status', 'bot_stop', 'bot_logs', 'bot_history',\n  'controllers', 'controller_configs',\n  'gateway_status', 'gateway_start', 'gateway_stop',\n  'leverage', 'history', 'templates', 'backtest',\n  'connectors', 'accounts', 'scripts',\n  // Condor-specific actions (Hummingbot Condor upgrade)\n  'pnl', 'clmm_positions', 'routines', 'routine_start', 'routine_stop', 'dashboard',\n] as const;\n\nconst HummingbotSchema = Type.Object({\n  action: stringEnum(ACTIONS, {\n    description:\n      'status: health check. portfolio: balances/positions. order: place order. ' +\n      'cancel_order: cancel. active_orders: list open. executor: create executor. ' +\n      'bot_deploy/bot_status/bot_stop/bot_logs/bot_history: manage bots. ' +\n      'market_data/candles/orderbook: prices & data. templates: strategy templates. ' +\n      'gateway_status/start/stop: DEX gateway. leverage: set leverage. ' +\n      'history: search trade history. backtest: run backtest. ' +\n      'pnl: PnL tracking. clmm_positions: CLMM LP positions. ' +\n      'routines: list auto-discoverable routines. routine_start/stop: manage routines. ' +\n      'dashboard: Condor portfolio dashboard.',\n  }),\n  connector: Type.Optional(Type.String({ description: 'Connector name (e.g. \"binance\", \"uniswap\")' })),\n  trading_pair: Type.Optional(Type.String({ description: 'Trading pair (e.g. \"ETH-USDT\")' })),\n  account: Type.Optional(Type.String({ description: 'Account name' })),\n  trade_type: Type.Optional(Type.String({ description: '\"BUY\" or \"SELL\"' })),\n  amount: Type.Optional(Type.String({ description: 'Order/trade amount' })),\n  price: Type.Optional(Type.String({ description: 'Limit price' })),\n  order_type: Type.Optional(Type.String({ description: '\"MARKET\", \"LIMIT\", or \"LIMIT_MAKER\"' })),\n  order_id: Type.Optional(Type.String({ description: 'Client order ID for cancel' })),\n  executor_type: Type.Optional(Type.String({\n    description: '\"position_executor\", \"dca_executor\", \"grid_executor\", \"order_executor\", \"arbitrage_executor\"',\n  })),\n  executor_id: Type.Optional(Type.String({ description: 'Executor ID' })),\n  executor_config: Type.Optional(Type.String({ description: 'JSON executor config' })),\n  bot_name: Type.Optional(Type.String({ description: 'Bot name' })),\n  controllers_config: Type.Optional(Type.String({ description: 'JSON array of controller config names' })),\n  template: Type.Optional(Type.String({ description: 'Strategy template name' })),\n  template_overrides: Type.Optional(Type.String({ description: 'JSON overrides for template' })),\n  interval: Type.Optional(Type.String({ description: 'Candle interval: 1m, 5m, 15m, 30m, 1h, 4h, 1d' })),\n  days: Type.Optional(Type.Number({ description: 'Number of days for candle/history lookback' })),\n  leverage: Type.Optional(Type.Number({ description: 'Leverage multiplier' })),\n  position_mode: Type.Optional(Type.String({ description: '\"HEDGE\" or \"ONE-WAY\"' })),\n  limit: Type.Optional(Type.Number({ description: 'Result limit' })),\n  backtest_config: Type.Optional(Type.String({ description: 'JSON backtest config or controller config name' })),\n  start_time: Type.Optional(Type.Number({ description: 'Start timestamp (seconds)' })),\n  end_time: Type.Optional(Type.Number({ description: 'End timestamp (seconds)' })),\n  log_type: Type.Optional(Type.String({ description: '\"error\", \"general\", or \"all\"' })),\n  passphrase: Type.Optional(Type.String({ description: 'Gateway passphrase' })),\n  image: Type.Optional(Type.String({ description: 'Docker image for gateway/bot' })),\n});\n\n// Lazy singleton\nlet _client: any = null;\n\nasync function getClient(): Promise<any> {\n  if (_client) return _client;\n  const { HummingbotClient } = await import('@clawnch/clawncher-sdk');\n  // H3 FIX: Require explicit credentials — no default admin/admin\n  const apiUrl = process.env.HUMMINGBOT_API_URL;\n  const username = getCredentialVault().getSecret('bot.hummingbot.username', 'hummingbot');\n  const password = getCredentialVault().getSecret('bot.hummingbot.password', 'hummingbot');\n  if (!apiUrl || !username || !password) {\n    throw new Error(\n      'Hummingbot not configured. Set HUMMINGBOT_API_URL, HUMMINGBOT_USERNAME, and HUMMINGBOT_PASSWORD.'\n    );\n  }\n  _client = new HummingbotClient({ apiUrl, username, password });\n  return _client;\n}\n\nexport function createHummingbotTool() {\n  return {\n    name: 'hummingbot',\n    label: 'Hummingbot',\n    ownerOnly: true,\n    description:\n      'Control Hummingbot/Condor market-making bots. Place orders, manage executors, ' +\n      'deploy bots with strategies, check portfolio + PnL, CLMM LP positions, auto-routines, ' +\n      'get market data, run backtests. Requires a running Hummingbot/Condor instance (set HUMMINGBOT_API_URL).',\n    parameters: HummingbotSchema,\n    execute: async (_toolCallId: string, args: unknown) => {\n      // Early check: is the tool configured?\n      const notReady = checkToolConfig('hummingbot');\n      if (notReady) return notReady;\n\n      const p = args as Record<string, unknown>;\n      const action = readStringParam(p, 'action', { required: true })!;\n\n      try {\n        const client = await getClient();\n\n        switch (action) {\n          // ── Health & Status ─────────────────────────────────────────\n          case 'status': {\n            const health = await client.checkHealth();\n            return jsonResult(health);\n          }\n\n          // ── Portfolio ───────────────────────────────────────────────\n          case 'portfolio': {\n            const result = await client.getPortfolioOverview({\n              accountNames: p.account ? [p.account as string] : undefined,\n              connectorNames: p.connector ? [p.connector as string] : undefined,\n              includeBalances: true,\n              includePerpPositions: true,\n              includeActiveOrders: true,\n            });\n            return jsonResult(result);\n          }\n\n          // ── Orders ──────────────────────────────────────────────────\n          case 'order': {\n            const connector = readStringParam(p, 'connector', { required: true })!;\n            const tradingPair = readStringParam(p, 'trading_pair', { required: true })!;\n            const tradeType = readStringParam(p, 'trade_type', { required: true })!;\n            const amount = readStringParam(p, 'amount', { required: true })!;\n            const result = await client.placeOrder({\n              connectorName: connector,\n              tradingPair,\n              tradeType: tradeType.toUpperCase(),\n              amount,\n              orderType: (readStringParam(p, 'order_type') || 'LIMIT').toUpperCase(),\n              price: readStringParam(p, 'price'),\n              accountName: readStringParam(p, 'account'),\n            });\n            return jsonResult(result);\n          }\n\n          case 'cancel_order': {\n            const connector = readStringParam(p, 'connector', { required: true })!;\n            const orderId = readStringParam(p, 'order_id', { required: true })!;\n            const account = readStringParam(p, 'account') || 'master_account';\n            const result = await client.cancelOrder(account, connector, orderId);\n            return jsonResult(result);\n          }\n\n          case 'active_orders': {\n            const result = await client.getActiveOrders({\n              connectorNames: p.connector ? [p.connector as string] : undefined,\n              tradingPairs: p.trading_pair ? [p.trading_pair as string] : undefined,\n              limit: readNumberParam(p, 'limit') ?? 50,\n            });\n            return jsonResult(result);\n          }\n\n          // ── Executors ───────────────────────────────────────────────\n          case 'executor': {\n            const configStr = readStringParam(p, 'executor_config', { required: true })!;\n            const config = JSON.parse(configStr);\n            const result = await client.createExecutor(config);\n            return jsonResult(result);\n          }\n\n          case 'stop_executor': {\n            const eid = readStringParam(p, 'executor_id', { required: true })!;\n            const result = await client.stopExecutor(eid);\n            return jsonResult(result);\n          }\n\n          case 'executors': {\n            const result = await client.searchExecutors({\n              executorTypes: p.executor_type ? [p.executor_type as string] : undefined,\n              connectorNames: p.connector ? [p.connector as string] : undefined,\n              tradingPairs: p.trading_pair ? [p.trading_pair as string] : undefined,\n              limit: readNumberParam(p, 'limit') ?? 20,\n            });\n            return jsonResult(result);\n          }\n\n          case 'executor_types': {\n            const result = await client.getExecutorTypes();\n            return jsonResult(result);\n          }\n\n          // ── Market Data ─────────────────────────────────────────────\n          case 'market_data': {\n            const connector = readStringParam(p, 'connector', { required: true })!;\n            const pairs = readStringParam(p, 'trading_pair', { required: true })!;\n            const result = await client.getPrices(connector, pairs.split(',').map(s => s.trim()));\n            return jsonResult(result);\n          }\n\n          case 'candles': {\n            const connector = readStringParam(p, 'connector', { required: true })!;\n            const pair = readStringParam(p, 'trading_pair', { required: true })!;\n            const result = await client.getCandles(\n              connector, pair,\n              readStringParam(p, 'interval') as any ?? '1h',\n              readNumberParam(p, 'days') ?? 1,\n            );\n            return jsonResult(result);\n          }\n\n          case 'orderbook': {\n            const connector = readStringParam(p, 'connector', { required: true })!;\n            const pair = readStringParam(p, 'trading_pair', { required: true })!;\n            const result = await client.getOrderBook(connector, pair);\n            return jsonResult(result);\n          }\n\n          case 'funding_rate': {\n            const connector = readStringParam(p, 'connector', { required: true })!;\n            const pair = readStringParam(p, 'trading_pair', { required: true })!;\n            const result = await client.getFundingRate(connector, pair);\n            return jsonResult(result);\n          }\n\n          // ── Bot Management ──────────────────────────────────────────\n          case 'bot_deploy': {\n            const botName = readStringParam(p, 'bot_name', { required: true })!;\n            const configStr = readStringParam(p, 'controllers_config', { required: true })!;\n            const result = await client.deployBot({\n              botName,\n              controllersConfig: JSON.parse(configStr),\n              accountName: readStringParam(p, 'account'),\n              image: readStringParam(p, 'image'),\n            });\n            return jsonResult(result);\n          }\n\n          case 'bot_status': {\n            const result = await client.getBotsStatus();\n            return jsonResult(result);\n          }\n\n          case 'bot_stop': {\n            const botName = readStringParam(p, 'bot_name', { required: true })!;\n            const result = await client.stopBot(botName);\n            return jsonResult(result);\n          }\n\n          case 'bot_logs': {\n            const botName = readStringParam(p, 'bot_name', { required: true })!;\n            const result = await client.getBotLogs({\n              botName,\n              logType: (readStringParam(p, 'log_type') as any) ?? 'all',\n              limit: readNumberParam(p, 'limit') ?? 50,\n            });\n            return jsonResult(result);\n          }\n\n          case 'bot_history': {\n            const botName = readStringParam(p, 'bot_name', { required: true })!;\n            const result = await client.getBotHistory(\n              botName,\n              readNumberParam(p, 'days') ?? 7,\n            );\n            return jsonResult(result);\n          }\n\n          // ── Controllers ─────────────────────────────────────────────\n          case 'controllers': {\n            const result = await client.listControllers();\n            return jsonResult(result);\n          }\n\n          case 'controller_configs': {\n            const result = await client.listControllerConfigs();\n            return jsonResult(result);\n          }\n\n          // ── Gateway ─────────────────────────────────────────────────\n          case 'gateway_status': {\n            const result = await client.getGatewayStatus();\n            return jsonResult(result);\n          }\n\n          case 'gateway_start': {\n            const passphrase = readStringParam(p, 'passphrase', { required: true })!;\n            const img = readStringParam(p, 'image', { required: true })!;\n            const result = await client.startGateway({ passphrase, image: img });\n            return jsonResult(result);\n          }\n\n          case 'gateway_stop': {\n            const result = await client.stopGateway();\n            return jsonResult(result);\n          }\n\n          // ── Leverage ────────────────────────────────────────────────\n          case 'leverage': {\n            const account = readStringParam(p, 'account', { required: true })!;\n            const connector = readStringParam(p, 'connector', { required: true })!;\n            const result = await client.setPositionModeAndLeverage({\n              accountName: account,\n              connectorName: connector,\n              tradingPair: readStringParam(p, 'trading_pair'),\n              positionMode: readStringParam(p, 'position_mode') as any,\n              leverage: readNumberParam(p, 'leverage'),\n            });\n            return jsonResult(result);\n          }\n\n          // ── History ─────────────────────────────────────────────────\n          case 'history': {\n            const result = await client.searchHistory({\n              dataType: 'orders' as any,\n              connectorNames: p.connector ? [p.connector as string] : undefined,\n              tradingPairs: p.trading_pair ? [p.trading_pair as string] : undefined,\n              limit: readNumberParam(p, 'limit') ?? 50,\n              startTime: readNumberParam(p, 'start_time'),\n              endTime: readNumberParam(p, 'end_time'),\n            });\n            return jsonResult(result);\n          }\n\n          // ── Templates ───────────────────────────────────────────────\n          case 'templates': {\n            const name = readStringParam(p, 'template');\n            if (name) {\n              const overridesStr = readStringParam(p, 'template_overrides');\n              if (overridesStr) {\n                const config = client.buildFromTemplate(name, JSON.parse(overridesStr));\n                return jsonResult({ template: name, config });\n              }\n              const tmpl = client.getStrategyTemplate(name);\n              return jsonResult(tmpl ?? { error: `Template \"${name}\" not found` });\n            }\n            return jsonResult(client.getStrategyTemplates());\n          }\n\n          // ── Backtest ────────────────────────────────────────────────\n          case 'backtest': {\n            const configStr = readStringParam(p, 'backtest_config', { required: true })!;\n            const startTime = readNumberParam(p, 'start_time', { required: true })!;\n            const endTime = readNumberParam(p, 'end_time', { required: true })!;\n            let config: string | Record<string, unknown>;\n            try { config = JSON.parse(configStr); } catch { config = configStr; }\n            const result = await client.runBacktest({ config, startTime, endTime });\n            return jsonResult(result);\n          }\n\n          // ── Connectors & Accounts ───────────────────────────────────\n          case 'connectors': {\n            const result = await client.listConnectors();\n            return jsonResult(result);\n          }\n\n          case 'accounts': {\n            const result = await client.listAccounts();\n            return jsonResult(result);\n          }\n\n          case 'scripts': {\n            const result = await client.listScripts();\n            return jsonResult(result);\n          }\n\n          // ── Condor-specific Actions ─────────────────────────────────\n          // These target Condor's extended API surface. If the backend is\n          // plain Hummingbot (not Condor), these will return a helpful error.\n\n          case 'pnl': {\n            if (typeof client.getPnL !== 'function') {\n              return errorResult('PnL tracking requires Condor backend. Upgrade from Hummingbot to Condor: https://github.com/hummingbot/condor');\n            }\n            const result = await client.getPnL({\n              connectorNames: p.connector ? [p.connector as string] : undefined,\n              tradingPairs: p.trading_pair ? [p.trading_pair as string] : undefined,\n              days: readNumberParam(p, 'days') ?? 7,\n            });\n            return jsonResult(result);\n          }\n\n          case 'clmm_positions': {\n            if (typeof client.getCLMMPositions !== 'function') {\n              return errorResult('CLMM LP positions require Condor backend. Upgrade from Hummingbot to Condor: https://github.com/hummingbot/condor');\n            }\n            const result = await client.getCLMMPositions({\n              connectorNames: p.connector ? [p.connector as string] : undefined,\n              accountNames: p.account ? [p.account as string] : undefined,\n            });\n            return jsonResult(result);\n          }\n\n          case 'routines': {\n            if (typeof client.listRoutines !== 'function') {\n              return errorResult('Auto-discoverable routines require Condor backend. Upgrade from Hummingbot to Condor: https://github.com/hummingbot/condor');\n            }\n            const result = await client.listRoutines();\n            return jsonResult(result);\n          }\n\n          case 'routine_start': {\n            if (typeof client.startRoutine !== 'function') {\n              return errorResult('Routines require Condor backend.');\n            }\n            const name = readStringParam(p, 'bot_name', { required: true })!;\n            const result = await client.startRoutine(name);\n            return jsonResult(result);\n          }\n\n          case 'routine_stop': {\n            if (typeof client.stopRoutine !== 'function') {\n              return errorResult('Routines require Condor backend.');\n            }\n            const name = readStringParam(p, 'bot_name', { required: true })!;\n            const result = await client.stopRoutine(name);\n            return jsonResult(result);\n          }\n\n          case 'dashboard': {\n            if (typeof client.getDashboard !== 'function') {\n              return errorResult('Portfolio dashboard requires Condor backend. Upgrade from Hummingbot to Condor: https://github.com/hummingbot/condor');\n            }\n            const result = await client.getDashboard({\n              includeBalances: true,\n              includePnL: true,\n              includeCLMM: true,\n              includeRoutines: true,\n            });\n            return jsonResult(result);\n          }\n\n          default:\n            return errorResult(`Unknown hummingbot action: ${action}`);\n        }\n      } catch (err) {\n        return errorResult(`Hummingbot error: ${err instanceof Error ? err.message : String(err)}`);\n      }\n    },\n  };\n}\n"],"mappings":"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"}