@okx_ai/okx-trade-cli 1.2.7-beta.2 → 1.2.7

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../core/src/client/rest-client.ts","../../core/src/utils/signature.ts","../../core/src/utils/errors.ts","../../core/src/utils/rate-limiter.ts","../../core/src/tools/helpers.ts","../../core/src/tools/common.ts","../../core/src/tools/indicator.ts","../../core/src/constants.ts","../../core/src/tools/account.ts","../../core/src/tools/algo-trade.ts","../../core/src/tools/audit.ts","../../core/src/tools/bot/grid.ts","../../core/src/tools/bot/dca.ts","../../core/src/tools/bot/index.ts","../../core/src/tools/earn/savings.ts","../../core/src/tools/earn/onchain.ts","../../core/src/tools/earn/dcd.ts","../../core/src/tools/earn/autoearn.ts","../../core/src/tools/earn/index.ts","../../core/src/tools/contract-trade.ts","../../core/src/tools/futures-trade.ts","../../core/src/tools/market.ts","../../core/src/tools/option-algo-trade.ts","../../core/src/tools/option-trade.ts","../../core/src/tools/spot-trade.ts","../../core/src/tools/swap-trade.ts","../../core/src/tools/index.ts","../../core/src/tools/types.ts","../../core/src/config/toml.ts","../../core/src/config.ts","../../core/src/utils/update-check.ts","../../core/src/utils/logger.ts","../../core/src/setup.ts","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js","../src/commands/diagnose.ts","../src/commands/diagnose-utils.ts","../src/formatter.ts","../src/commands/diagnose-mcp.ts","../src/config/loader.ts","../src/help.ts","../src/commands/client-setup.ts","../src/parser.ts","../src/commands/market.ts","../src/commands/account.ts","../src/commands/spot.ts","../src/commands/swap.ts","../src/commands/futures.ts","../src/commands/option.ts","../src/config/toml.ts","../src/commands/config.ts","../src/commands/earn.ts","../src/commands/auto-earn.ts","../src/commands/bot.ts","../src/commands/onchain-earn.ts","../src/commands/dcd.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { OkxRestClient, toToolErrorPayload, checkForUpdates, createToolRunner, allToolSpecs } from \"@agent-tradekit/core\";\nimport type { ToolRunner } from \"@agent-tradekit/core\";\n\ndeclare const __GIT_HASH__: string;\n\nconst _require = createRequire(import.meta.url);\nconst CLI_VERSION = (_require(\"../package.json\") as { version: string }).version;\nconst GIT_HASH: string = typeof __GIT_HASH__ !== \"undefined\" ? __GIT_HASH__ : \"dev\";\nimport { cmdDiagnose } from \"./commands/diagnose.js\";\nimport { loadProfileConfig } from \"./config/loader.js\";\nimport { printHelp } from \"./help.js\";\nimport { parseCli } from \"./parser.js\";\nimport type { CliValues } from \"./parser.js\";\nimport {\n cmdMarketTicker,\n cmdMarketTickers,\n cmdMarketOrderbook,\n cmdMarketCandles,\n cmdMarketInstruments,\n cmdMarketFundingRate,\n cmdMarketMarkPrice,\n cmdMarketTrades,\n cmdMarketIndexTicker,\n cmdMarketIndexCandles,\n cmdMarketPriceLimit,\n cmdMarketOpenInterest,\n cmdMarketStockTokens,\n cmdMarketIndicator,\n} from \"./commands/market.js\";\nimport {\n cmdAccountBalance,\n cmdAccountAssetBalance,\n cmdAccountPositions,\n cmdAccountBills,\n cmdAccountFees,\n cmdAccountConfig,\n cmdAccountSetPositionMode,\n cmdAccountMaxSize,\n cmdAccountMaxAvailSize,\n cmdAccountMaxWithdrawal,\n cmdAccountPositionsHistory,\n cmdAccountTransfer,\n cmdAccountAudit,\n} from \"./commands/account.js\";\nimport {\n cmdSpotOrders,\n cmdSpotPlace,\n cmdSpotCancel,\n cmdSpotFills,\n cmdSpotGet,\n cmdSpotAmend,\n cmdSpotAlgoPlace,\n cmdSpotAlgoAmend,\n cmdSpotAlgoCancel,\n cmdSpotAlgoOrders,\n cmdSpotAlgoTrailPlace,\n cmdSpotBatch,\n} from \"./commands/spot.js\";\nimport {\n cmdSwapPositions,\n cmdSwapOrders,\n cmdSwapPlace,\n cmdSwapCancel,\n cmdSwapFills,\n cmdSwapGet,\n cmdSwapClose,\n cmdSwapGetLeverage,\n cmdSwapSetLeverage,\n cmdSwapAlgoPlace,\n cmdSwapAlgoAmend,\n cmdSwapAlgoCancel,\n cmdSwapAlgoOrders,\n cmdSwapAlgoTrailPlace,\n cmdSwapAmend,\n cmdSwapBatch,\n} from \"./commands/swap.js\";\nimport {\n cmdFuturesOrders,\n cmdFuturesPositions,\n cmdFuturesFills,\n cmdFuturesPlace,\n cmdFuturesCancel,\n cmdFuturesGet,\n cmdFuturesAmend,\n cmdFuturesAlgoPlace,\n cmdFuturesAlgoAmend,\n cmdFuturesAlgoCancel,\n cmdFuturesAlgoOrders,\n cmdFuturesAlgoTrailPlace,\n cmdFuturesBatch,\n cmdFuturesClose,\n cmdFuturesGetLeverage,\n cmdFuturesSetLeverage,\n} from \"./commands/futures.js\";\nimport {\n cmdOptionOrders,\n cmdOptionGet,\n cmdOptionPositions,\n cmdOptionFills,\n cmdOptionInstruments,\n cmdOptionGreeks,\n cmdOptionPlace,\n cmdOptionCancel,\n cmdOptionAmend,\n cmdOptionBatchCancel,\n cmdOptionAlgoPlace,\n cmdOptionAlgoAmend,\n cmdOptionAlgoCancel,\n cmdOptionAlgoOrders,\n} from \"./commands/option.js\";\nimport { cmdConfigShow, cmdConfigSet, cmdConfigInit, cmdConfigAddProfile, cmdConfigListProfile, cmdConfigUse } from \"./commands/config.js\";\nimport type { Lang } from \"./commands/config.js\";\nimport {\n cmdSetupClients,\n cmdSetupClient,\n printSetupUsage,\n SUPPORTED_CLIENTS,\n} from \"./commands/client-setup.js\";\nimport type { ClientId } from \"./commands/client-setup.js\";\nimport {\n cmdEarnSavingsBalance,\n cmdEarnSavingsPurchase,\n cmdEarnSavingsRedeem,\n cmdEarnSetLendingRate,\n cmdEarnLendingHistory,\n cmdEarnLendingRateHistory,\n} from \"./commands/earn.js\";\nimport {\n cmdAutoEarnStatus,\n cmdAutoEarnOn,\n cmdAutoEarnOff,\n} from \"./commands/auto-earn.js\";\nimport {\n cmdGridOrders,\n cmdGridDetails,\n cmdGridSubOrders,\n cmdGridCreate,\n cmdGridStop,\n cmdDcaCreate,\n cmdDcaStop,\n cmdDcaOrders,\n cmdDcaDetails,\n cmdDcaSubOrders,\n} from \"./commands/bot.js\";\nimport {\n cmdOnchainEarnOffers,\n cmdOnchainEarnPurchase,\n cmdOnchainEarnRedeem,\n cmdOnchainEarnCancel,\n cmdOnchainEarnActiveOrders,\n cmdOnchainEarnOrderHistory,\n} from \"./commands/onchain-earn.js\";\nimport {\n cmdDcdPairs,\n cmdDcdProducts,\n cmdDcdRedeemExecute,\n cmdDcdOrderState,\n cmdDcdOrders,\n cmdDcdQuoteAndBuy,\n} from \"./commands/dcd.js\";\nimport { markFailedIfSCodeError, output, outputLine, errorOutput, errorLine, setOutput } from \"./formatter.js\";\n\n// Re-export for tests and external consumers\nexport { printHelp } from \"./help.js\";\nexport type { CliValues } from \"./parser.js\";\n\n// ---------------------------------------------------------------------------\n// Command handlers\n// ---------------------------------------------------------------------------\n\nexport function handleConfigCommand(action: string, rest: string[], json: boolean, lang?: string, force?: boolean): Promise<void> | void {\n if (action === \"init\") return cmdConfigInit((lang === \"zh\" ? \"zh\" : \"en\") as Lang);\n if (action === \"show\") return cmdConfigShow(json);\n if (action === \"set\") return cmdConfigSet(rest[0], rest[1]);\n if (action === \"setup-clients\") return cmdSetupClients();\n if (action === \"add-profile\") return cmdConfigAddProfile(rest, force ?? false);\n if (action === \"list-profile\") return cmdConfigListProfile();\n if (action === \"use\") return cmdConfigUse(rest[0]);\n errorLine(`Unknown config command: ${action}`);\n process.exitCode = 1;\n}\n\nexport function handleSetupCommand(v: CliValues): void {\n if (!v.client) {\n printSetupUsage();\n return;\n }\n if (!SUPPORTED_CLIENTS.includes(v.client as ClientId)) {\n errorLine(`Unknown client: \"${v.client}\"`);\n errorLine(`Supported: ${SUPPORTED_CLIENTS.join(\", \")}`);\n process.exitCode = 1;\n return;\n }\n cmdSetupClient({\n client: v.client as ClientId,\n profile: v.profile,\n modules: v.modules,\n });\n}\n\nexport function handleMarketPublicCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"ticker\") return cmdMarketTicker(run, rest[0], json);\n if (action === \"tickers\") return cmdMarketTickers(run, rest[0], json);\n if (action === \"instruments\")\n return cmdMarketInstruments(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"mark-price\")\n return cmdMarketMarkPrice(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"index-ticker\")\n return cmdMarketIndexTicker(run, { instId: v.instId, quoteCcy: v.quoteCcy, json });\n if (action === \"price-limit\") return cmdMarketPriceLimit(run, rest[0], json);\n if (action === \"open-interest\")\n return cmdMarketOpenInterest(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"stock-tokens\")\n return cmdMarketStockTokens(run, { instType: v.instType, instId: v.instId, json });\n if (action === \"indicator\") {\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n const backtestTime = v[\"backtest-time\"] !== undefined ? Number(v[\"backtest-time\"]) : undefined;\n return cmdMarketIndicator(run, rest[0], rest[1], {\n bar: v.bar,\n params: v.params,\n list: v.list,\n limit,\n backtestTime,\n json,\n });\n }\n}\n\nexport function handleMarketDataCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"orderbook\")\n return cmdMarketOrderbook(run, rest[0], v.sz !== undefined ? Number(v.sz) : undefined, json);\n if (action === \"candles\")\n return cmdMarketCandles(run, rest[0], { bar: v.bar, limit, json });\n if (action === \"funding-rate\")\n return cmdMarketFundingRate(run, rest[0], { history: v.history ?? false, limit, json });\n if (action === \"trades\")\n return cmdMarketTrades(run, rest[0], { limit, json });\n if (action === \"index-candles\")\n return cmdMarketIndexCandles(run, rest[0], { bar: v.bar, limit, history: v.history ?? false, json });\n}\n\nexport function handleMarketCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n return (\n handleMarketPublicCommand(run, action, rest, v, json) ??\n handleMarketDataCommand(run, action, rest, v, json)\n );\n}\n\nexport function handleAccountWriteCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"set-position-mode\")\n return cmdAccountSetPositionMode(run, v.posMode!, json);\n if (action === \"max-size\")\n return cmdAccountMaxSize(run, { instId: v.instId!, tdMode: v.tdMode!, px: v.px, json });\n if (action === \"max-avail-size\")\n return cmdAccountMaxAvailSize(run, { instId: v.instId!, tdMode: v.tdMode!, json });\n if (action === \"max-withdrawal\") return cmdAccountMaxWithdrawal(run, v.ccy, json);\n if (action === \"transfer\")\n return cmdAccountTransfer(run, {\n ccy: v.ccy!,\n amt: v.amt!,\n from: v.from!,\n to: v.to!,\n transferType: v.transferType,\n subAcct: v.subAcct,\n json,\n });\n}\n\nfunction handleAccountCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"audit\")\n return cmdAccountAudit({ limit: v.limit, tool: v.tool, since: v.since, json });\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"balance\") return cmdAccountBalance(run, rest[0], json);\n if (action === \"asset-balance\") return cmdAccountAssetBalance(run, v.ccy, json);\n if (action === \"positions\")\n return cmdAccountPositions(run, { instType: v.instType, instId: v.instId, json });\n if (action === \"positions-history\")\n return cmdAccountPositionsHistory(run, {\n instType: v.instType,\n instId: v.instId,\n limit,\n json,\n });\n if (action === \"bills\")\n return cmdAccountBills(run, {\n archive: v.archive ?? false,\n instType: v.instType,\n ccy: v.ccy,\n limit,\n json,\n });\n if (action === \"fees\")\n return cmdAccountFees(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"config\") return cmdAccountConfig(run, json);\n return handleAccountWriteCommand(run, action, v, json);\n}\n\nexport function handleSpotAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"trail\")\n return cmdSpotAlgoTrailPlace(run, {\n instId: v.instId!,\n side: v.side!,\n sz: v.sz!,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n tdMode: v.tdMode,\n json,\n });\n if (subAction === \"place\")\n return cmdSpotAlgoPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n json,\n });\n if (subAction === \"amend\")\n return cmdSpotAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdSpotAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdSpotAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nexport function handleSpotCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\")\n return cmdSpotOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"open\",\n json,\n });\n if (action === \"get\")\n return cmdSpotGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"fills\")\n return cmdSpotFills(run, { instId: v.instId, ordId: v.ordId, json });\n if (action === \"amend\")\n return cmdSpotAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"place\")\n return cmdSpotPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n tgtCcy: v.tgtCcy,\n px: v.px,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdSpotCancel(run, { instId: (v.instId ?? rest[0])!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"algo\")\n return handleSpotAlgoCommand(run, rest[0], v, json);\n if (action === \"batch\")\n return cmdSpotBatch(run, { action: v.action!, orders: v.orders!, json });\n}\n\nexport function handleSwapAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"trail\")\n return cmdSwapAlgoTrailPlace(run, {\n instId: v.instId!,\n side: v.side!,\n sz: v.sz!,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n reduceOnly: v.reduceOnly,\n json,\n });\n if (subAction === \"place\")\n return cmdSwapAlgoPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n reduceOnly: v.reduceOnly,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n json,\n });\n if (subAction === \"amend\")\n return cmdSwapAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdSwapAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdSwapAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nfunction handleSwapQuery(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void | undefined {\n if (action === \"positions\")\n return cmdSwapPositions(run, v.instId ?? rest[0], json);\n if (action === \"orders\")\n return cmdSwapOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"open\",\n json,\n });\n if (action === \"get\")\n return cmdSwapGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"fills\")\n return cmdSwapFills(run, {\n instId: v.instId,\n ordId: v.ordId,\n archive: v.archive ?? false,\n json,\n });\n if (action === \"get-leverage\")\n return cmdSwapGetLeverage(run, { instId: v.instId!, mgnMode: v.mgnMode!, json });\n return undefined;\n}\n\nexport function handleSwapCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const queryResult = handleSwapQuery(run, action, rest, v, json);\n if (queryResult !== undefined) return queryResult;\n if (action === \"close\")\n return cmdSwapClose(run, {\n instId: v.instId!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n autoCxl: v.autoCxl,\n json,\n });\n if (action === \"place\")\n return cmdSwapPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n posSide: v.posSide,\n px: v.px,\n tdMode: v.tdMode ?? \"cross\",\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdSwapCancel(run, { instId: (v.instId ?? rest[0])!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"amend\")\n return cmdSwapAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"leverage\")\n return cmdSwapSetLeverage(run, {\n instId: v.instId!,\n lever: v.lever!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n json,\n });\n if (action === \"algo\")\n return handleSwapAlgoCommand(run, rest[0], v, json);\n if (action === \"batch\")\n return cmdSwapBatch(run, { action: v.action!, orders: v.orders!, json });\n}\n\nexport function handleOptionAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"place\")\n return cmdOptionAlgoPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode!,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n reduceOnly: v.reduceOnly,\n clOrdId: v.clOrdId,\n json,\n });\n if (subAction === \"amend\")\n return cmdOptionAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdOptionAlgoCancel(run, { instId: v.instId!, algoId: v.algoId!, json });\n if (subAction === \"orders\")\n return cmdOptionAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nexport function handleOptionCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\") {\n let status: \"live\" | \"history\" | \"archive\" = \"live\";\n if (v.archive) status = \"archive\";\n else if (v.history) status = \"history\";\n return cmdOptionOrders(run, { instId: v.instId, uly: v.uly, status, json });\n }\n if (action === \"get\")\n return cmdOptionGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"positions\")\n return cmdOptionPositions(run, { instId: v.instId, uly: v.uly, json });\n if (action === \"fills\")\n return cmdOptionFills(run, { instId: v.instId, ordId: v.ordId, archive: v.archive ?? false, json });\n if (action === \"instruments\")\n return cmdOptionInstruments(run, { uly: v.uly!, expTime: v.expTime, json });\n if (action === \"greeks\")\n return cmdOptionGreeks(run, { uly: v.uly!, expTime: v.expTime, json });\n if (action === \"place\")\n return cmdOptionPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n px: v.px,\n reduceOnly: v.reduceOnly,\n clOrdId: v.clOrdId,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdOptionCancel(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"amend\")\n return cmdOptionAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"batch-cancel\")\n return cmdOptionBatchCancel(run, { orders: v.orders!, json });\n if (action === \"algo\")\n return handleOptionAlgoCommand(run, rest[0], v, json);\n}\n\nexport function handleFuturesAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"trail\")\n return cmdFuturesAlgoTrailPlace(run, {\n instId: v.instId!,\n side: v.side!,\n sz: v.sz!,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n reduceOnly: v.reduceOnly,\n json,\n });\n if (subAction === \"place\")\n return cmdFuturesAlgoPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n reduceOnly: v.reduceOnly,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n json,\n });\n if (subAction === \"amend\")\n return cmdFuturesAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdFuturesAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdFuturesAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nfunction resolveFuturesOrdersStatus(v: CliValues): \"archive\" | \"history\" | \"open\" {\n if (v.archive) return \"archive\";\n if (v.history) return \"history\";\n return \"open\";\n}\n\nfunction handleFuturesQuery(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void | undefined {\n if (action === \"orders\")\n return cmdFuturesOrders(run, { instId: v.instId, status: resolveFuturesOrdersStatus(v), json });\n if (action === \"positions\") return cmdFuturesPositions(run, v.instId, json);\n if (action === \"fills\")\n return cmdFuturesFills(run, {\n instId: v.instId,\n ordId: v.ordId,\n archive: v.archive ?? false,\n json,\n });\n if (action === \"get\")\n return cmdFuturesGet(run, { instId: v.instId!, ordId: v.ordId, json });\n if (action === \"get-leverage\")\n return cmdFuturesGetLeverage(run, { instId: v.instId!, mgnMode: v.mgnMode!, json });\n return undefined;\n}\n\nexport function handleFuturesCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const queryResult = handleFuturesQuery(run, action, v, json);\n if (queryResult !== undefined) return queryResult;\n if (action === \"place\")\n return cmdFuturesPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n tdMode: v.tdMode ?? \"cross\",\n tgtCcy: v.tgtCcy,\n posSide: v.posSide,\n px: v.px,\n reduceOnly: v.reduceOnly,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdFuturesCancel(run, { instId: (v.instId ?? rest[0])!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"amend\")\n return cmdFuturesAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"close\")\n return cmdFuturesClose(run, {\n instId: v.instId!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n autoCxl: v.autoCxl,\n json,\n });\n if (action === \"leverage\")\n return cmdFuturesSetLeverage(run, {\n instId: v.instId!,\n lever: v.lever!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n json,\n });\n if (action === \"batch\")\n return cmdFuturesBatch(run, { action: v.action!, orders: v.orders!, json });\n if (action === \"algo\")\n return handleFuturesAlgoCommand(run, rest[0], v, json);\n}\n\nexport function handleBotGridCommand(\n run: ToolRunner,\n v: CliValues,\n rest: string[],\n json: boolean\n): Promise<void> | void {\n const subAction = rest[0];\n if (subAction === \"orders\")\n return cmdGridOrders(run, {\n algoOrdType: v.algoOrdType!,\n instId: v.instId,\n algoId: v.algoId,\n status: v.history ? \"history\" : \"active\",\n json,\n });\n if (subAction === \"details\")\n return cmdGridDetails(run, {\n algoOrdType: v.algoOrdType!,\n algoId: v.algoId!,\n json,\n });\n if (subAction === \"sub-orders\")\n return cmdGridSubOrders(run, {\n algoOrdType: v.algoOrdType!,\n algoId: v.algoId!,\n type: v.live ? \"live\" : \"filled\",\n json,\n });\n if (subAction === \"create\")\n return cmdGridCreate(run, {\n instId: v.instId!,\n algoOrdType: v.algoOrdType!,\n maxPx: v.maxPx!,\n minPx: v.minPx!,\n gridNum: v.gridNum!,\n runType: v.runType,\n quoteSz: v.quoteSz,\n baseSz: v.baseSz,\n direction: v.direction,\n lever: v.lever,\n sz: v.sz,\n basePos: v.basePos,\n tpTriggerPx: v.tpTriggerPx,\n slTriggerPx: v.slTriggerPx,\n tpRatio: v.tpRatio,\n slRatio: v.slRatio,\n algoClOrdId: v.algoClOrdId,\n json,\n });\n if (subAction === \"stop\")\n return cmdGridStop(run, {\n algoId: v.algoId!,\n algoOrdType: v.algoOrdType!,\n instId: v.instId!,\n stopType: v.stopType,\n json,\n });\n}\n\nexport function handleBotDcaCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n // CLI backward compatibility: default algoOrdType to contract_dca if not provided\n const algoOrdType = v.algoOrdType ?? \"contract_dca\";\n\n if (subAction === \"orders\")\n return cmdDcaOrders(run, { algoOrdType, algoId: v.algoId, instId: v.instId, history: v.history ?? false, json });\n if (subAction === \"details\")\n return cmdDcaDetails(run, { algoId: v.algoId!, algoOrdType, json });\n if (subAction === \"sub-orders\")\n return cmdDcaSubOrders(run, { algoId: v.algoId!, algoOrdType, cycleId: v.cycleId, json });\n if (subAction === \"create\")\n return cmdDcaCreate(run, {\n instId: v.instId!,\n algoOrdType,\n lever: v.lever,\n direction: v.direction!,\n initOrdAmt: v.initOrdAmt!,\n maxSafetyOrds: v.maxSafetyOrds!,\n tpPct: v.tpPct!,\n safetyOrdAmt: v.safetyOrdAmt,\n pxSteps: v.pxSteps,\n pxStepsMult: v.pxStepsMult,\n volMult: v.volMult,\n slPct: v.slPct,\n slMode: v.slMode,\n allowReinvest: v.allowReinvest,\n triggerStrategy: v.triggerStrategy,\n triggerPx: v.triggerPx,\n algoClOrdId: v.algoClOrdId,\n reserveFunds: v.reserveFunds,\n tradeQuoteCcy: v.tradeQuoteCcy,\n json,\n });\n if (subAction === \"stop\")\n return cmdDcaStop(run, { algoId: v.algoId!, algoOrdType, stopType: v.stopType, json });\n}\n\nexport function handleBotCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"grid\") return handleBotGridCommand(run, v, rest, json);\n if (action === \"dca\") return handleBotDcaCommand(run, rest[0], v, json);\n}\n\nexport function handleEarnCommand(\n run: ToolRunner,\n submodule: string,\n rest: string[],\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n const action = rest[0];\n const innerRest = rest.slice(1);\n if (submodule === \"savings\") return handleEarnSavingsCommand(run, action, innerRest, v, json);\n if (submodule === \"onchain\") return handleEarnOnchainCommand(run, action, v, json);\n if (submodule === \"dcd\") return handleEarnDcdCommand(run, action, v, json);\n if (submodule === \"auto-earn\") return handleEarnAutoEarnCommand(run, action, innerRest, v, json);\n errorLine(`Unknown earn sub-module: ${submodule}`);\n errorLine(\"Valid: savings, onchain, dcd, auto-earn\");\n process.exitCode = 1;\n}\n\nfunction handleEarnAutoEarnCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n const ccy = rest[0] ?? v.ccy;\n if (action === \"status\") return cmdAutoEarnStatus(run, ccy, json);\n if (action === \"on\") {\n if (!ccy) { errorLine(\"Currency required: okx earn auto-earn on <ccy>\"); process.exitCode = 1; return; }\n return cmdAutoEarnOn(run, ccy, json);\n }\n if (action === \"off\") {\n if (!ccy) { errorLine(\"Currency required: okx earn auto-earn off <ccy>\"); process.exitCode = 1; return; }\n return cmdAutoEarnOff(run, ccy, json);\n }\n errorLine(`Unknown auto-earn command: ${action}`);\n errorLine(\"Valid: status, on, off\");\n process.exitCode = 1;\n}\n\nfunction handleEarnSavingsCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"balance\") return cmdEarnSavingsBalance(run, rest[0] ?? v.ccy, json);\n if (action === \"purchase\") return cmdEarnSavingsPurchase(run, { ccy: v.ccy!, amt: v.amt!, rate: v.rate, json });\n if (action === \"redeem\") return cmdEarnSavingsRedeem(run, { ccy: v.ccy!, amt: v.amt!, json });\n if (action === \"set-rate\") return cmdEarnSetLendingRate(run, { ccy: v.ccy!, rate: v.rate!, json });\n if (action === \"lending-history\") return cmdEarnLendingHistory(run, { ccy: v.ccy, limit, json });\n if (action === \"rate-history\") return cmdEarnLendingRateHistory(run, { ccy: v.ccy, limit, json });\n errorLine(`Unknown earn savings command: ${action}`);\n process.exitCode = 1;\n}\n\nfunction handleEarnOnchainCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"offers\") return cmdOnchainEarnOffers(run, v).then((r) => outputResult(r, json));\n if (action === \"purchase\") return cmdOnchainEarnPurchase(run, v).then((r) => outputResult(r, json));\n if (action === \"redeem\") return cmdOnchainEarnRedeem(run, v).then((r) => outputResult(r, json));\n if (action === \"cancel\") return cmdOnchainEarnCancel(run, v).then((r) => outputResult(r, json));\n if (action === \"orders\") return cmdOnchainEarnActiveOrders(run, v).then((r) => outputResult(r, json));\n if (action === \"history\") return cmdOnchainEarnOrderHistory(run, v).then((r) => outputResult(r, json));\n errorLine(`Unknown earn onchain command: ${action}`);\n process.exitCode = 1;\n}\n\nfunction parseDcdOpts(v: CliValues) {\n return {\n limit: v.limit !== undefined ? Number(v.limit) : undefined,\n minYield: v.minYield !== undefined ? parseFloat(v.minYield) : undefined,\n strikeNear: v.strikeNear !== undefined ? parseFloat(v.strikeNear) : undefined,\n termDays: v.termDays !== undefined ? parseInt(v.termDays, 10) : undefined,\n minTermDays: v.minTermDays !== undefined ? parseInt(v.minTermDays, 10) : undefined,\n maxTermDays: v.maxTermDays !== undefined ? parseInt(v.maxTermDays, 10) : undefined,\n };\n}\n\nfunction handleEarnDcdCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n const { limit, minYield, strikeNear, termDays, minTermDays, maxTermDays } = parseDcdOpts(v);\n if (action === \"pairs\") return cmdDcdPairs(run, json);\n if (action === \"products\")\n return cmdDcdProducts(run, {\n baseCcy: v.baseCcy,\n quoteCcy: v.quoteCcy,\n optType: v.optType,\n minYield,\n strikeNear,\n termDays,\n minTermDays,\n maxTermDays,\n expDate: v.expDate,\n json,\n });\n if (action === \"quote-and-buy\")\n return cmdDcdQuoteAndBuy(run, {\n productId: v.productId!,\n notionalSz: v.sz!,\n notionalCcy: v.notionalCcy!,\n clOrdId: v.clOrdId,\n minAnnualizedYield: v.minAnnualizedYield !== undefined ? parseFloat(v.minAnnualizedYield) : undefined,\n json,\n });\n if (action === \"redeem-execute\")\n return cmdDcdRedeemExecute(run, { ordId: v.ordId!, json });\n if (action === \"order\")\n return cmdDcdOrderState(run, { ordId: v.ordId!, json });\n if (action === \"orders\")\n return cmdDcdOrders(run, {\n ordId: v.ordId,\n productId: v.productId,\n uly: v.uly,\n state: v.state,\n beginId: v.beginId,\n endId: v.endId,\n begin: v.begin,\n end: v.end,\n limit,\n json,\n });\n errorLine(`Unknown earn dcd command: ${action}`);\n errorLine(\"Valid: pairs, products, quote-and-buy, redeem-execute, order, orders\");\n process.exitCode = 1;\n}\n\nfunction outputResult(result: { endpoint: string; requestTime: string; data: unknown }, json: boolean): void {\n if (json) {\n outputLine(JSON.stringify(result, null, 2));\n } else {\n outputLine(JSON.stringify(result.data, null, 2));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main entry point\n// ---------------------------------------------------------------------------\n\nfunction printHelpForLevel(positionals: string[]): void {\n const [module, subgroup] = positionals;\n if (!module) printHelp();\n else if (!subgroup) printHelp(module);\n else printHelp(module, subgroup);\n}\n\nfunction printVerboseConfigSummary(config: import(\"@agent-tradekit/core\").OkxConfig, profile?: string): void {\n let authLabel = \"\\u2717\";\n if (config.hasAuth && config.apiKey) {\n authLabel = `\\u2713(${config.apiKey.slice(0, 3)}***${config.apiKey.slice(-3)})`;\n } else if (config.hasAuth) {\n authLabel = \"\\u2713\";\n }\n errorLine(`[verbose] config: profile=${profile ?? \"default\"} site=${config.site} base=${config.baseUrl} auth=${authLabel} demo=${config.demo ? \"on\" : \"off\"} modules=${config.modules.join(\",\")}`);\n}\n\nasync function main(): Promise<void> {\n setOutput({\n out: (m) => process.stdout.write(m),\n err: (m) => process.stderr.write(m),\n });\n\n checkForUpdates(\"@okx_ai/okx-trade-cli\", CLI_VERSION);\n\n const { values, positionals } = parseCli(process.argv.slice(2));\n\n if (values.version) {\n outputLine(`${CLI_VERSION} (${GIT_HASH})`);\n return;\n }\n\n if (values.help || positionals.length === 0) {\n printHelpForLevel(positionals);\n return;\n }\n\n const [module, action, ...rest] = positionals;\n const v = values;\n const json = v.json ?? false;\n\n if (module === \"config\") return handleConfigCommand(action, rest, json, v.lang, v.force);\n if (module === \"setup\") return handleSetupCommand(v);\n\n // diagnose runs before loadConfig — it must handle config parse errors itself\n if (module === \"diagnose\") {\n let config: ReturnType<typeof loadProfileConfig> | undefined;\n try {\n config = loadProfileConfig({ profile: v.profile, demo: v.demo, verbose: v.verbose, userAgent: `okx-trade-cli/${CLI_VERSION}`, sourceTag: \"CLI\" });\n } catch {\n // Config parse failed — diagnose will detect and report it\n }\n return cmdDiagnose(config, v.profile ?? \"default\", { mcp: v.mcp, cli: v.cli, all: v.all, output: v.output });\n }\n\n const config = loadProfileConfig({ profile: v.profile, demo: v.demo, verbose: v.verbose, userAgent: `okx-trade-cli/${CLI_VERSION}`, sourceTag: \"CLI\" });\n\n const client = new OkxRestClient(config);\n const baseRunner = createToolRunner(client, config);\n const writeToolNames = new Set(allToolSpecs().filter((t) => t.isWrite).map((t) => t.name));\n const run: ToolRunner = async (toolName, args) => {\n const result = await baseRunner(toolName, args);\n if (writeToolNames.has(toolName)) {\n markFailedIfSCodeError(result.data);\n }\n return result;\n };\n\n const moduleHandlers: Record<string, () => Promise<void> | void> = {\n market: () => handleMarketCommand(run, action, rest, v, json),\n account: () => handleAccountCommand(run, action, rest, v, json),\n spot: () => handleSpotCommand(run, action, rest, v, json),\n swap: () => handleSwapCommand(run, action, rest, v, json),\n futures: () => handleFuturesCommand(run, action, rest, v, json),\n option: () => handleOptionCommand(run, action, rest, v, json),\n bot: () => handleBotCommand(run, action, rest, v, json),\n earn: () => handleEarnCommand(run, action, rest, v, json),\n };\n const handler = moduleHandlers[module];\n if (handler) return handler();\n errorLine(`Unknown command: ${module} ${action ?? \"\"}`);\n process.exitCode = 1;\n}\n\nmain().catch((error: unknown) => {\n const payload = toToolErrorPayload(error);\n errorLine(`Error: ${payload.message}`);\n if (payload.traceId) errorLine(`TraceId: ${payload.traceId}`);\n if (payload.suggestion) errorLine(`Hint: ${payload.suggestion}`);\n errorLine(`Version: @okx_ai/okx-trade-cli@${CLI_VERSION}`);\n process.exitCode = 1;\n});\n","import { ProxyAgent } from \"undici\";\nimport { getNow, signOkxPayload } from \"../utils/signature.js\";\nimport {\n AuthenticationError,\n ConfigError,\n NetworkError,\n OkxApiError,\n RateLimitError,\n} from \"../utils/errors.js\";\n\ntype CodeBehavior =\n | { retry: true; suggestion: string }\n | { retry: false; suggestion: string };\n\nconst OKX_CODE_BEHAVIORS: Record<string, CodeBehavior> = {\n // Rate limit → throw RateLimitError\n \"50011\": { retry: true, suggestion: \"Rate limited. Back off and retry after a delay.\" },\n \"50061\": { retry: true, suggestion: \"Too many connections. Reduce request frequency and retry.\" },\n\n // Server temporarily unavailable → retryable\n \"50001\": { retry: true, suggestion: \"OKX system upgrade in progress. Retry in a few minutes.\" },\n \"50004\": { retry: true, suggestion: \"Endpoint temporarily unavailable. Retry later.\" },\n \"50013\": { retry: true, suggestion: \"System busy. Retry after 1-2 seconds.\" },\n \"50026\": { retry: true, suggestion: \"Order book system upgrading. Retry in a few minutes.\" },\n\n // Region / compliance restriction → do not retry\n \"51155\": { retry: false, suggestion: \"Feature unavailable in your region (site: {site}). Verify your site setting matches your account registration region. Available sites: global, eea, us. Do not retry.\" },\n \"51734\": { retry: false, suggestion: \"Feature not supported for your KYC country (site: {site}). Verify your site setting matches your account registration region. Available sites: global, eea, us. Do not retry.\" },\n\n // Account issues → do not retry\n \"50007\": { retry: false, suggestion: \"Account suspended. Contact OKX support. Do not retry.\" },\n \"50009\": { retry: false, suggestion: \"Account blocked by risk control. Contact OKX support. Do not retry.\" },\n \"51009\": { retry: false, suggestion: \"Account mode not supported for this operation. Check account settings.\" },\n\n // API key permission / expiry → do not retry\n \"50100\": { retry: false, suggestion: \"API key lacks required permissions. Update API key permissions.\" },\n \"50110\": { retry: false, suggestion: \"API key expired. Generate a new API key.\" },\n\n // Insufficient funds / margin → do not retry\n \"51008\": { retry: false, suggestion: \"Insufficient balance in trading account. Check funding account via account_get_asset_balance — funds may be there. Use account_transfer (from=18, to=6) to move funds to trading account, then retry.\" },\n \"51119\": { retry: false, suggestion: \"Insufficient margin. Add margin or check funding account (account_get_asset_balance). Transfer via account_transfer (from=18, to=6) if needed.\" },\n \"51127\": { retry: false, suggestion: \"Insufficient available margin. Reduce position, add margin, or transfer from funding account (account_transfer from=18 to=6).\" },\n\n // Instrument unavailable → do not retry\n \"51021\": { retry: false, suggestion: \"Instrument does not exist. Check instId.\" },\n \"51022\": { retry: false, suggestion: \"Instrument not available for trading.\" },\n \"51027\": { retry: false, suggestion: \"Contract has expired.\" },\n};\nimport { RateLimiter } from \"../utils/rate-limiter.js\";\nimport type { OkxConfig } from \"../config.js\";\nimport type {\n OkxApiResponse,\n QueryParams,\n QueryValue,\n RequestConfig,\n RequestResult,\n} from \"./types.js\";\n\nfunction isDefined(value: unknown): boolean {\n return value !== undefined && value !== null;\n}\n\nfunction extractTraceId(headers: Headers): string | undefined {\n return (\n headers.get(\"x-trace-id\") ??\n headers.get(\"x-request-id\") ??\n headers.get(\"traceid\") ??\n undefined\n );\n}\n\nfunction stringifyQueryValue(value: QueryValue): string {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\",\");\n }\n return String(value);\n}\n\nfunction buildQueryString(query?: QueryParams): string {\n if (!query) {\n return \"\";\n }\n\n const entries = Object.entries(query).filter(([, value]) => isDefined(value));\n if (entries.length === 0) {\n return \"\";\n }\n\n const params = new URLSearchParams();\n for (const [key, value] of entries) {\n params.set(key, stringifyQueryValue(value));\n }\n return params.toString();\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return \"***\";\n return `${key.slice(0, 3)}***${key.slice(-3)}`;\n}\n\nfunction vlog(message: string): void {\n process.stderr.write(`[verbose] ${message}\\n`);\n}\n\nexport class OkxRestClient {\n private readonly config: OkxConfig;\n private readonly rateLimiter: RateLimiter;\n private readonly dispatcher?: ProxyAgent;\n\n public constructor(config: OkxConfig) {\n this.config = config;\n this.rateLimiter = new RateLimiter(30_000, config.verbose);\n if (config.proxyUrl) {\n this.dispatcher = new ProxyAgent(config.proxyUrl);\n }\n }\n\n private logRequest(method: string, url: string, auth: string): void {\n if (!this.config.verbose) return;\n vlog(`\\u2192 ${method} ${url}`);\n const authInfo = auth === \"private\" && this.config.apiKey\n ? `auth=\\u2713(${maskKey(this.config.apiKey)})` : `auth=${auth}`;\n vlog(` ${authInfo} demo=${this.config.demo} timeout=${this.config.timeoutMs}ms`);\n }\n\n private logResponse(\n status: number, rawLen: number, elapsed: number,\n traceId: string | undefined, code?: string, msg?: string,\n ): void {\n if (!this.config.verbose) return;\n if (code && code !== \"0\" && code !== \"1\") {\n vlog(`\\u2717 ${status} | code=${code} | msg=${msg ?? \"-\"} | ${rawLen}B | ${elapsed}ms | trace=${traceId ?? \"-\"}`);\n } else {\n vlog(`\\u2190 ${status} | code=${code ?? \"0\"} | ${rawLen}B | ${elapsed}ms | trace=${traceId ?? \"-\"}`);\n }\n }\n\n public async publicGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"public\",\n query,\n rateLimit,\n });\n }\n\n public async privateGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"private\",\n query,\n rateLimit,\n });\n }\n\n public async publicPost<TData = unknown>(\n path: string,\n body?: RequestConfig[\"body\"],\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"POST\",\n path,\n auth: \"public\",\n body,\n rateLimit,\n });\n }\n\n public async privatePost<TData = unknown>(\n path: string,\n body?: RequestConfig[\"body\"],\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"POST\",\n path,\n auth: \"private\",\n body,\n rateLimit,\n });\n }\n\n private setAuthHeaders(\n headers: Headers, method: string, requestPath: string, bodyJson: string, timestamp: string,\n ): void {\n if (!this.config.hasAuth) {\n throw new ConfigError(\n \"Private endpoint requires API credentials.\",\n \"Configure OKX_API_KEY, OKX_SECRET_KEY and OKX_PASSPHRASE.\",\n );\n }\n\n if (!this.config.apiKey || !this.config.secretKey || !this.config.passphrase) {\n throw new ConfigError(\n \"Invalid private API credentials state.\",\n \"Ensure all OKX credentials are set.\",\n );\n }\n\n // OKX signature: timestamp + METHOD + requestPath + body\n const payload = `${timestamp}${method.toUpperCase()}${requestPath}${bodyJson}`;\n const signature = signOkxPayload(payload, this.config.secretKey);\n headers.set(\"OK-ACCESS-KEY\", this.config.apiKey);\n headers.set(\"OK-ACCESS-SIGN\", signature);\n headers.set(\"OK-ACCESS-PASSPHRASE\", this.config.passphrase);\n headers.set(\"OK-ACCESS-TIMESTAMP\", timestamp);\n }\n\n private throwOkxError(\n code: string, msg: string | undefined, reqConfig: RequestConfig, traceId: string | undefined,\n ): never {\n const message = msg || \"OKX API request failed.\";\n const endpoint = `${reqConfig.method} ${reqConfig.path}`;\n\n if (code === \"50111\" || code === \"50112\" || code === \"50113\") {\n throw new AuthenticationError(\n message,\n \"Check API key, secret, passphrase and permissions.\",\n endpoint,\n traceId,\n );\n }\n\n const behavior = OKX_CODE_BEHAVIORS[code];\n const suggestion = behavior?.suggestion?.replace(\"{site}\", this.config.site);\n\n if (code === \"50011\" || code === \"50061\") {\n throw new RateLimitError(message, suggestion, endpoint, traceId);\n }\n\n throw new OkxApiError(message, {\n code,\n endpoint,\n suggestion,\n traceId,\n });\n }\n\n private processResponse<TData>(\n rawText: string,\n response: Response,\n elapsed: number,\n traceId: string | undefined,\n reqConfig: RequestConfig,\n requestPath: string,\n ): RequestResult<TData> {\n let parsed: OkxApiResponse<TData>;\n try {\n parsed = (rawText ? JSON.parse(rawText) : {}) as OkxApiResponse<TData>;\n } catch (error) {\n this.logResponse(response.status, rawText.length, elapsed, traceId, \"non-JSON\");\n if (!response.ok) {\n const messagePreview = rawText.slice(0, 160).replace(/\\s+/g, \" \").trim();\n throw new OkxApiError(\n `HTTP ${response.status} from OKX: ${messagePreview || \"Non-JSON response body\"}`,\n {\n code: String(response.status),\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n suggestion: \"Verify endpoint path and request parameters.\",\n traceId,\n },\n );\n }\n throw new NetworkError(\n `OKX returned non-JSON response for ${reqConfig.method} ${requestPath}.`,\n `${reqConfig.method} ${requestPath}`,\n error,\n );\n }\n\n if (!response.ok) {\n this.logResponse(response.status, rawText.length, elapsed, traceId, parsed.code ?? \"-\", parsed.msg);\n throw new OkxApiError(\n `HTTP ${response.status} from OKX: ${parsed.msg ?? \"Unknown error\"}`,\n {\n code: String(response.status),\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n suggestion: \"Retry later or verify endpoint parameters.\",\n traceId,\n },\n );\n }\n\n const responseCode = parsed.code;\n this.logResponse(response.status, rawText.length, elapsed, traceId, responseCode, parsed.msg);\n\n if (responseCode && responseCode !== \"0\" && responseCode !== \"1\") {\n this.throwOkxError(responseCode, parsed.msg, reqConfig, traceId);\n }\n\n return {\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n requestTime: new Date().toISOString(),\n data: (parsed.data ?? null) as TData,\n raw: parsed,\n };\n }\n\n private async request<TData = unknown>(\n reqConfig: RequestConfig,\n ): Promise<RequestResult<TData>> {\n const queryString = buildQueryString(reqConfig.query);\n const requestPath = queryString.length > 0 ? `${reqConfig.path}?${queryString}` : reqConfig.path;\n const url = `${this.config.baseUrl}${requestPath}`;\n const bodyJson = reqConfig.body ? JSON.stringify(reqConfig.body) : \"\";\n const timestamp = getNow();\n\n this.logRequest(reqConfig.method, url, reqConfig.auth);\n\n if (reqConfig.rateLimit) {\n await this.rateLimiter.consume(reqConfig.rateLimit);\n }\n\n const headers = new Headers({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n });\n\n if (this.config.userAgent) {\n headers.set(\"User-Agent\", this.config.userAgent);\n }\n\n if (reqConfig.auth === \"private\") {\n this.setAuthHeaders(headers, reqConfig.method, requestPath, bodyJson, timestamp);\n }\n\n if (this.config.demo) {\n headers.set(\"x-simulated-trading\", \"1\");\n }\n\n const t0 = Date.now();\n let response: Response;\n try {\n const fetchOptions: Record<string, unknown> = {\n method: reqConfig.method,\n headers,\n body: reqConfig.method === \"POST\" ? bodyJson : undefined,\n signal: AbortSignal.timeout(this.config.timeoutMs),\n };\n if (this.dispatcher) {\n fetchOptions.dispatcher = this.dispatcher;\n }\n response = await fetch(url, fetchOptions as RequestInit);\n } catch (error) {\n if (this.config.verbose) {\n const elapsed = Date.now() - t0;\n const cause = error instanceof Error ? error.message : String(error);\n vlog(`\\u2717 NetworkError after ${elapsed}ms: ${cause}`);\n }\n throw new NetworkError(\n `Failed to call OKX endpoint ${reqConfig.method} ${requestPath}.`,\n `${reqConfig.method} ${requestPath}`,\n error,\n );\n }\n\n const rawText = await response.text();\n const elapsed = Date.now() - t0;\n const traceId = extractTraceId(response.headers);\n return this.processResponse<TData>(rawText, response, elapsed, traceId, reqConfig, requestPath);\n }\n}\n","import { createHmac } from \"node:crypto\";\n\nexport function getNow(): string {\n return new Date().toISOString();\n}\n\nexport function signOkxPayload(payload: string, secretKey: string): string {\n return createHmac(\"sha256\", secretKey).update(payload).digest(\"base64\");\n}\n","export type ErrorType =\n | \"ConfigError\"\n | \"AuthenticationError\"\n | \"RateLimitError\"\n | \"ValidationError\"\n | \"OkxApiError\"\n | \"NetworkError\"\n | \"InternalError\";\n\nexport interface ToolErrorPayload {\n error: true;\n type: ErrorType;\n code?: string;\n message: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n timestamp: string;\n}\n\nexport class OkxMcpError extends Error {\n public readonly type: ErrorType;\n public readonly code?: string;\n public readonly suggestion?: string;\n public readonly endpoint?: string;\n public readonly traceId?: string;\n\n public constructor(\n type: ErrorType,\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n cause?: unknown;\n },\n ) {\n super(message, options?.cause ? { cause: options.cause } : undefined);\n this.name = type;\n this.type = type;\n this.code = options?.code;\n this.suggestion = options?.suggestion;\n this.endpoint = options?.endpoint;\n this.traceId = options?.traceId;\n }\n}\n\nexport class ConfigError extends OkxMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ConfigError\", message, { suggestion });\n }\n}\n\nexport class ValidationError extends OkxMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ValidationError\", message, { suggestion });\n }\n}\n\nexport class RateLimitError extends OkxMcpError {\n public constructor(\n message: string,\n suggestion?: string,\n endpoint?: string,\n traceId?: string,\n ) {\n super(\"RateLimitError\", message, { suggestion, endpoint, traceId });\n }\n}\n\nexport class AuthenticationError extends OkxMcpError {\n public constructor(\n message: string,\n suggestion?: string,\n endpoint?: string,\n traceId?: string,\n ) {\n super(\"AuthenticationError\", message, { suggestion, endpoint, traceId });\n }\n}\n\nexport class OkxApiError extends OkxMcpError {\n public constructor(\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n cause?: unknown;\n },\n ) {\n super(\"OkxApiError\", message, options);\n }\n}\n\nexport class NetworkError extends OkxMcpError {\n public constructor(message: string, endpoint?: string, cause?: unknown) {\n super(\"NetworkError\", message, {\n endpoint,\n cause,\n suggestion:\n \"Please check network connectivity and retry the request in a few seconds.\",\n });\n }\n}\n\nexport function toToolErrorPayload(\n error: unknown,\n fallbackEndpoint?: string,\n): ToolErrorPayload {\n if (error instanceof OkxMcpError) {\n return {\n error: true,\n type: error.type,\n code: error.code,\n message: error.message,\n suggestion: error.suggestion,\n endpoint: error.endpoint ?? fallbackEndpoint,\n traceId: error.traceId,\n timestamp: new Date().toISOString(),\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n error: true,\n type: \"InternalError\",\n message,\n suggestion:\n \"Unexpected server error. Check tool arguments and retry. If it persists, inspect server logs.\",\n endpoint: fallbackEndpoint,\n timestamp: new Date().toISOString(),\n };\n}\n","import { RateLimitError } from \"./errors.js\";\n\ntype Bucket = {\n tokens: number;\n lastRefillMs: number;\n capacity: number;\n refillPerSecond: number;\n};\n\nexport type RateLimitConfig = {\n key: string;\n capacity: number;\n refillPerSecond: number;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport class RateLimiter {\n private readonly buckets = new Map<string, Bucket>();\n private readonly maxWaitMs: number;\n private readonly verbose: boolean;\n\n public constructor(maxWaitMs = 30_000, verbose = false) {\n this.maxWaitMs = maxWaitMs;\n this.verbose = verbose;\n }\n\n public async consume(config: RateLimitConfig, amount = 1): Promise<void> {\n const bucket = this.getBucket(config);\n this.refill(bucket);\n\n if (bucket.tokens >= amount) {\n bucket.tokens -= amount;\n return;\n }\n\n const missing = amount - bucket.tokens;\n const secondsToWait = missing / bucket.refillPerSecond;\n const waitMs = Math.ceil(secondsToWait * 1000);\n\n if (waitMs > this.maxWaitMs) {\n throw new RateLimitError(\n `Client-side rate limit reached for ${config.key}. Required wait ${waitMs}ms exceeds allowed max ${this.maxWaitMs}ms.`,\n \"Reduce tool call frequency or retry later.\",\n );\n }\n\n if (this.verbose) {\n process.stderr.write(`[verbose] \\u23F3 rate-limit: waiting ${waitMs}ms for \"${config.key}\"\\n`);\n }\n await sleep(waitMs);\n this.refill(bucket);\n\n if (bucket.tokens < amount) {\n throw new RateLimitError(\n `Rate limiter failed to acquire enough tokens for ${config.key}.`,\n );\n }\n\n bucket.tokens -= amount;\n }\n\n private getBucket(config: RateLimitConfig): Bucket {\n const existing = this.buckets.get(config.key);\n if (existing) {\n if (\n existing.capacity !== config.capacity ||\n existing.refillPerSecond !== config.refillPerSecond\n ) {\n existing.capacity = config.capacity;\n existing.refillPerSecond = config.refillPerSecond;\n existing.tokens = Math.min(existing.tokens, config.capacity);\n }\n return existing;\n }\n\n const now = Date.now();\n const created: Bucket = {\n tokens: config.capacity,\n lastRefillMs: now,\n capacity: config.capacity,\n refillPerSecond: config.refillPerSecond,\n };\n this.buckets.set(config.key, created);\n return created;\n }\n\n private refill(bucket: Bucket): void {\n const now = Date.now();\n const elapsedMs = now - bucket.lastRefillMs;\n if (elapsedMs <= 0) {\n return;\n }\n\n const refillTokens = (elapsedMs / 1000) * bucket.refillPerSecond;\n bucket.tokens = Math.min(bucket.capacity, bucket.tokens + refillTokens);\n bucket.lastRefillMs = now;\n }\n}\n","import { ValidationError } from \"../utils/errors.js\";\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n return value as Record<string, unknown>;\n}\n\nexport function readString(\n args: Record<string, unknown>,\n key: string,\n): string | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new ValidationError(`Parameter \"${key}\" must be a string.`);\n }\n return value;\n}\n\nexport function readNumber(\n args: Record<string, unknown>,\n key: string,\n): number | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new ValidationError(`Parameter \"${key}\" must be a number.`);\n }\n return value;\n}\n\nexport function readBoolean(\n args: Record<string, unknown>,\n key: string,\n): boolean | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new ValidationError(`Parameter \"${key}\" must be a boolean.`);\n }\n return value;\n}\n\nexport function readStringArray(\n args: Record<string, unknown>,\n key: string,\n): string[] | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(`Parameter \"${key}\" must be an array of strings.`);\n }\n return value;\n}\n\nexport function requireString(\n args: Record<string, unknown>,\n key: string,\n): string {\n const value = readString(args, key);\n if (!value || value.length === 0) {\n throw new ValidationError(`Missing required parameter \"${key}\".`);\n }\n return value;\n}\n\nexport function assertEnum(\n value: string | undefined,\n key: string,\n values: readonly string[],\n): void {\n if (value === undefined) {\n return;\n }\n if (!values.includes(value)) {\n throw new ValidationError(\n `Parameter \"${key}\" must be one of: ${values.join(\", \")}.`,\n );\n }\n}\n\nexport function compactObject(\n object: Record<string, unknown>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(object)) {\n if (value !== undefined && value !== null) {\n next[key] = value;\n }\n }\n return next;\n}\n\nexport function normalizeResponse(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function buildAttachAlgoOrds(\n source: Record<string, unknown>,\n): Record<string, unknown>[] | undefined {\n const tpTriggerPx = readString(source, \"tpTriggerPx\");\n const tpOrdPx = readString(source, \"tpOrdPx\");\n const slTriggerPx = readString(source, \"slTriggerPx\");\n const slOrdPx = readString(source, \"slOrdPx\");\n const entry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n return Object.keys(entry).length > 0 ? [entry] : undefined;\n}\n","import type { RateLimitConfig } from \"../utils/rate-limiter.js\";\nimport { ConfigError } from \"../utils/errors.js\";\nimport type { OkxConfig } from \"../config.js\";\n\nexport const OKX_CANDLE_BARS = [\n \"1m\", \"3m\", \"5m\", \"15m\", \"30m\",\n \"1H\", \"2H\", \"4H\", \"6H\", \"12H\",\n \"1D\", \"2D\", \"3D\", \"1W\", \"1M\", \"3M\",\n] as const;\n\nexport const OKX_INST_TYPES = [\n \"SPOT\", \"SWAP\", \"FUTURES\", \"OPTION\", \"MARGIN\",\n] as const;\n\nexport function publicRateLimit(key: string, rps = 20): RateLimitConfig {\n return {\n key: `public:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n\nexport function privateRateLimit(key: string, rps = 10): RateLimitConfig {\n return {\n key: `private:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n\n/**\n * Throw a ConfigError if demo/simulated trading mode is active.\n * Use this for endpoints that OKX does not support in simulated trading.\n */\nexport function assertNotDemo(config: OkxConfig, endpoint: string): void {\n if (config.demo) {\n throw new ConfigError(\n `\"${endpoint}\" is not supported in simulated trading mode.`,\n \"Disable demo mode (remove OKX_DEMO=1 or --demo flag) to use this endpoint.\",\n );\n }\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { publicRateLimit } from \"./common.js\";\n\n// Valid timeframes accepted by the indicator API\nexport const INDICATOR_BARS = [\n \"3m\", \"5m\", \"15m\", \"1H\", \"4H\", \"12Hutc\", \"1Dutc\", \"3Dutc\", \"1Wutc\",\n] as const;\n\nexport type IndicatorBar = (typeof INDICATOR_BARS)[number];\n\n// Overrides for CLI names whose API code differs from simple uppercase + underscore\nconst INDICATOR_CODE_OVERRIDES: Record<string, string> = {\n \"rainbow\": \"BTCRAINBOW\",\n \"range-filter\": \"RANGEFILTER\",\n \"stoch-rsi\": \"STOCHRSI\",\n \"pi-cycle-top\": \"PI_CYCLE_TOP\",\n \"pi-cycle-bottom\": \"PI_CYCLE_BOTTOM\",\n // boll is an alias for bb; server supports BB not BOLL\n \"boll\": \"BB\",\n};\n\nexport function resolveIndicatorCode(name: string): string {\n const lower = name.toLowerCase();\n return INDICATOR_CODE_OVERRIDES[lower] ?? name.toUpperCase().replace(/-/g, \"_\");\n}\n\nfunction readNumberArray(\n args: Record<string, unknown>,\n key: string,\n): number[] | undefined {\n const value = args[key];\n if (value === undefined || value === null) return undefined;\n if (!Array.isArray(value)) return undefined;\n return value.map((item) => Number(item));\n}\n\nexport function registerIndicatorTools(): ToolSpec[] {\n return [\n {\n name: \"market_get_indicator\",\n module: \"market\",\n description:\n \"Get technical indicator values for an instrument (MA, EMA, RSI, MACD, BB, KDJ, SUPERTREND, AHR999, BTCRAINBOW, and more). No credentials required.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"Instrument ID, e.g. BTC-USDT\",\n },\n indicator: {\n type: \"string\",\n description:\n \"Indicator name (case-insensitive). Examples: ma, ema, rsi, macd, bb, kdj, supertrend, ahr999, rainbow, pi-cycle-top, pi-cycle-bottom, mayer, envelope, halftrend, alphatrend, pmax, waddah, tdi, qqe, range-filter\",\n },\n bar: {\n type: \"string\",\n enum: [...INDICATOR_BARS],\n description: \"Timeframe. Default: 1H\",\n },\n params: {\n type: \"array\",\n items: { type: \"number\" },\n description: \"Indicator parameters, e.g. [5, 20] for MA with periods 5 and 20\",\n },\n returnList: {\n type: \"boolean\",\n description: \"Return a historical list instead of the latest value only. Default: false\",\n },\n limit: {\n type: \"integer\",\n minimum: 1,\n maximum: 100,\n description: \"Number of historical records to return (only used when returnList=true). Default: 10\",\n },\n backtestTime: {\n type: \"integer\",\n description: \"Backtest timestamp in milliseconds. Omit for live (real-time) mode\",\n },\n },\n required: [\"instId\", \"indicator\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instId = requireString(args, \"instId\");\n const indicator = requireString(args, \"indicator\");\n const bar = readString(args, \"bar\") ?? \"1H\";\n const params = readNumberArray(args, \"params\");\n const returnList = readBoolean(args, \"returnList\") ?? false;\n const limit = readNumber(args, \"limit\") ?? 10;\n const backtestTime = readNumber(args, \"backtestTime\");\n\n const apiCode = resolveIndicatorCode(indicator);\n const indicatorConfig = compactObject({\n paramList: params && params.length > 0 ? params : undefined,\n returnList,\n limit: returnList ? limit : undefined,\n });\n\n const body = compactObject({\n instId,\n timeframes: [bar],\n indicators: { [apiCode]: indicatorConfig },\n backtestTime,\n });\n\n const response = await context.client.publicPost(\n \"/api/v5/aigc/mcp/indicators\",\n body,\n publicRateLimit(\"market_get_indicator\", 5),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","export const OKX_API_BASE_URL = \"https://www.okx.com\";\n\n/** Default source tag injected into all order placements for attribution. */\nexport const DEFAULT_SOURCE_TAG = \"MCP\";\n\n// ---------------------------------------------------------------------------\n// Site registry\n// ---------------------------------------------------------------------------\n\nexport interface OkxSite {\n label: string;\n apiBaseUrl: string;\n /** User-facing web URL for account/API key management pages */\n webUrl: string;\n}\n\nexport const OKX_SITES = {\n global: {\n label: \"Global\",\n apiBaseUrl: \"https://www.okx.com\",\n webUrl: \"https://www.okx.com\",\n },\n eea: {\n label: \"EEA\",\n apiBaseUrl: \"https://eea.okx.com\",\n webUrl: \"https://my.okx.com\",\n },\n us: {\n label: \"US\",\n apiBaseUrl: \"https://app.okx.com\",\n webUrl: \"https://app.okx.com\",\n },\n} as const satisfies Record<string, OkxSite>;\n\nexport type SiteId = keyof typeof OKX_SITES;\nexport const SITE_IDS = Object.keys(OKX_SITES) as SiteId[];\n\nexport const BOT_SUB_MODULE_IDS = [\n \"bot.grid\",\n \"bot.dca\",\n] as const;\n\nexport type BotSubModuleId = (typeof BOT_SUB_MODULE_IDS)[number];\n\nexport const BOT_DEFAULT_SUB_MODULES: BotSubModuleId[] = [\"bot.grid\"];\n\nexport const EARN_SUB_MODULE_IDS = [\n \"earn.savings\",\n \"earn.onchain\",\n \"earn.dcd\",\n \"earn.autoearn\",\n] as const;\n\nexport type EarnSubModuleId = (typeof EARN_SUB_MODULE_IDS)[number];\n\nexport const MODULES = [\n \"market\",\n \"spot\",\n \"swap\",\n \"futures\",\n \"option\",\n \"account\",\n ...EARN_SUB_MODULE_IDS,\n ...BOT_SUB_MODULE_IDS,\n] as const;\n\nexport type ModuleId = (typeof MODULES)[number];\n\nexport const DEFAULT_MODULES: ModuleId[] = [\"spot\", \"swap\", \"option\", \"account\", ...BOT_DEFAULT_SUB_MODULES];\n// Default: spot, swap, option, account, bot.grid\n// \"all\": every module including market, futures, bot.dca, earn.savings, earn.onchain, earn.dcd\n// \"bot\": bot.grid only; \"bot.all\": bot.grid + bot.dca\n// \"earn\" / \"earn.all\": all earn sub-modules (earn.savings + earn.onchain + earn.dcd)\n// \"earn.savings\": Simple Earn only; \"earn.onchain\": On-chain Earn only; \"earn.dcd\": Dual Currency Deposit only\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerAccountTools(): ToolSpec[] {\n return [\n {\n name: \"account_get_balance\",\n module: \"account\",\n description:\n \"Get account balance for trading account. Returns balances for all currencies or a specific one.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. BTC or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/balance\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_balance\", 10),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_transfer\",\n module: \"account\",\n description:\n \"Transfer funds between accounts (trading, funding, etc.). [CAUTION] Moves real funds.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Transfer amount\",\n },\n from: {\n type: \"string\",\n description: \"Source account: 6=funding, 18=trading (unified)\",\n },\n to: {\n type: \"string\",\n description: \"Destination account: 6=funding, 18=trading (unified)\",\n },\n type: {\n type: \"string\",\n description: \"0=main account (default), 1=main→sub, 2=sub→main, 3=sub→sub\",\n },\n subAcct: {\n type: \"string\",\n description: \"Sub-account name. Required when type=1/2/3\",\n },\n clientId: {\n type: \"string\",\n description: \"Client ID (max 32 chars)\",\n },\n },\n required: [\"ccy\", \"amt\", \"from\", \"to\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/asset/transfer\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n from: requireString(args, \"from\"),\n to: requireString(args, \"to\"),\n type: readString(args, \"type\"),\n subAcct: readString(args, \"subAcct\"),\n clientId: readString(args, \"clientId\"),\n }),\n privateRateLimit(\"account_transfer\", 2),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_max_size\",\n module: \"account\",\n description:\n \"Get max buy/sell order size for a SWAP/FUTURES instrument given current balance and leverage. Useful before placing orders.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n px: {\n type: \"string\",\n description: \"Limit order price (omit for market)\",\n },\n leverage: {\n type: \"string\",\n description: \"Leverage (defaults to account setting)\",\n },\n ccy: {\n type: \"string\",\n description: \"Margin currency. Required for isolated mode.\",\n },\n },\n required: [\"instId\", \"tdMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/max-size\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n px: readString(args, \"px\"),\n leverage: readString(args, \"leverage\"),\n ccy: readString(args, \"ccy\"),\n }),\n privateRateLimit(\"account_get_max_size\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_asset_balance\",\n module: \"account\",\n description:\n \"Get funding account balance (asset account). Different from account_get_balance which queries the trading account.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. BTC or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/asset/balances\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_asset_balance\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_bills\",\n module: \"account\",\n description:\n \"Get account ledger: fees paid, funding charges, realized PnL, transfers, etc. Default 20 records (last 7 days), max 100.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"isolated\", \"cross\"],\n },\n type: {\n type: \"string\",\n description: \"1=transfer,2=trade,3=delivery,4=auto convert,5=liquidation,6=margin transfer,7=interest,8=funding fee,9=adl,10=clawback,11=sys convert,12=strategy transfer,13=ddh\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/bills\",\n compactObject({\n instType: readString(args, \"instType\"),\n ccy: readString(args, \"ccy\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_bills\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_positions_history\",\n module: \"account\",\n description:\n \"Get closed position history for SWAP or FUTURES. Default 20 records, max 100.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\", \"MARGIN\", \"OPTION\"],\n description: \"Default SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n type: {\n type: \"string\",\n description: \"1=close long,2=close short,3=liq long,4=liq short,5=ADL long,6=ADL short\",\n },\n posId: {\n type: \"string\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions-history\",\n compactObject({\n instType: readString(args, \"instType\") ?? \"SWAP\",\n instId: readString(args, \"instId\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n posId: readString(args, \"posId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_positions_history\", 1),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_trade_fee\",\n module: \"account\",\n description:\n \"Get maker/taker fee rates for the account. Useful to understand your fee tier before trading.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/trade-fee\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n }),\n privateRateLimit(\"account_get_trade_fee\", 5),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_config\",\n module: \"account\",\n description:\n \"Get account configuration: position mode (net vs hedge), account level, auto-loan settings, etc.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/api/v5/account/config\",\n {},\n privateRateLimit(\"account_get_config\", 5),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_max_withdrawal\",\n module: \"account\",\n description:\n \"Get maximum withdrawable amount for a currency from the trading account. Useful before initiating a transfer or withdrawal.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/max-withdrawal\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_max_withdrawal\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_max_avail_size\",\n module: \"account\",\n description:\n \"Get maximum available size for opening or reducing a position. Different from account_get_max_size which calculates new order size.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP or BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\", \"cash\"],\n description: \"cash=spot\",\n },\n ccy: {\n type: \"string\",\n description: \"Margin currency. Required for isolated MARGIN mode.\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"true=calculate max size for closing position\",\n },\n },\n required: [\"instId\", \"tdMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = readBoolean(args, \"reduceOnly\");\n const response = await context.client.privateGet(\n \"/api/v5/account/max-avail-size\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n ccy: readString(args, \"ccy\"),\n reduceOnly: reduceOnly !== undefined ? String(reduceOnly) : undefined,\n }),\n privateRateLimit(\"account_get_max_avail_size\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_positions\",\n module: \"account\",\n description:\n \"Get current open positions across all instrument types (MARGIN, SWAP, FUTURES, OPTION). Use swap_get_positions for SWAP/FUTURES-only queries.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n posId: {\n type: \"string\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType: readString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(\"account_get_positions\", 10),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_bills_archive\",\n module: \"account\",\n description:\n \"Get archived account ledger (bills older than 7 days, up to 3 months). Use account_get_bills for recent 7-day records. Default 20 records, max 100.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"isolated\", \"cross\"],\n },\n type: {\n type: \"string\",\n description: \"1=transfer,2=trade,3=delivery,4=auto convert,5=liquidation,6=margin transfer,7=interest,8=funding fee,9=adl,10=clawback,11=sys convert,12=strategy transfer,13=ddh\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/bills-archive\",\n compactObject({\n instType: readString(args, \"instType\"),\n ccy: readString(args, \"ccy\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_bills_archive\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_set_position_mode\",\n module: \"account\",\n description:\n \"Switch between net position mode and long/short hedge mode. \" +\n \"net: one position per instrument (default). long_short_mode: separate long and short positions. \" +\n \"[CAUTION] Requires no open positions or pending orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n posMode: {\n type: \"string\",\n enum: [\"long_short_mode\", \"net_mode\"],\n description: \"long_short_mode=hedge; net_mode=one-way\",\n },\n },\n required: [\"posMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-position-mode\",\n { posMode: requireString(args, \"posMode\") },\n privateRateLimit(\"account_set_position_mode\", 5),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerAlgoTradeTools(): ToolSpec[] {\n return [\n {\n name: \"swap_place_algo_order\",\n module: \"swap\",\n description:\n \"Place a SWAP/FUTURES algo order: TP/SL (conditional/oco) or trailing stop (move_order_stop). [CAUTION] Executes real trades. \" +\n \"conditional: single TP, single SL, or both on one order. \" +\n \"oco: TP+SL simultaneously — first trigger cancels the other. \" +\n \"move_order_stop: provide callbackRatio (e.g. '0.01'=1%) OR callbackSpread, and optionally activePx. \" +\n \"Set tpOrdPx='-1' or slOrdPx='-1' for market execution.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"conditional=single TP/SL or both; oco=TP+SL pair (first trigger cancels other); move_order_stop=trailing stop\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts to close (NOT USDT amount). Use market_get_instruments to get ctVal for conversion.\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price (conditional/oco only)\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market (conditional/oco only)\",\n },\n tpTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark (conditional/oco only)\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price (conditional/oco only)\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market (recommended) (conditional/oco only)\",\n },\n slTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark (conditional/oco only)\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread (move_order_stop only)\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units; provide either ratio or spread (move_order_stop only)\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price; tracking starts after market reaches this level (move_order_stop only)\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in contracts, quote_ccy: sz in USDT\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n tpTriggerPxType: readString(args, \"tpTriggerPxType\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n slTriggerPxType: readString(args, \"slTriggerPxType\"),\n callBackRatio: readString(args, \"callbackRatio\"),\n callBackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"swap_place_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"swap_place_move_stop_order\",\n module: \"swap\",\n description:\n \"[DEPRECATED] Use swap_place_algo_order with ordType='move_order_stop' instead. \" +\n \"Place a SWAP/FUTURES trailing stop order. [CAUTION] Executes real trades. \" +\n \"Specify callbackRatio (e.g. '0.01'=1%) or callbackSpread (fixed price distance), not both. \" +\n \"Optionally set activePx so tracking starts once market reaches that price.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount). Use market_get_instruments to get ctVal for conversion.\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units; provide either ratio or spread\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price; tracking starts after market reaches this level\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: \"move_order_stop\",\n sz: requireString(args, \"sz\"),\n callBackRatio: readString(args, \"callbackRatio\"),\n callBackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"swap_place_move_stop_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"swap_cancel_algo_orders\",\n module: \"swap\",\n description:\n \"Cancel one or more pending SWAP/FUTURES algo orders (TP/SL). Accepts a list of {algoId, instId} objects.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"List of algo orders to cancel. Each item: {algoId, instId}.\",\n items: {\n type: \"object\",\n properties: {\n algoId: {\n type: \"string\",\n description: \"Algo order ID\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"algoId\", \"instId\"],\n },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n orders,\n privateRateLimit(\"swap_cancel_algo_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"swap_get_algo_orders\",\n module: \"swap\",\n description:\n \"Query pending or completed SWAP/FUTURES algo orders (TP/SL, OCO, trailing stop).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\"],\n description: \"SWAP (default) or FUTURES\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"Filter by type; omit for all\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n algoId: {\n type: \"string\",\n description: \"Filter by algo order ID\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description:\n \"Required when status=history. effective=triggered, canceled, order_failed. Defaults to effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n const baseParams = compactObject({\n instType,\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"swap_get_algo_orders\", 20),\n );\n return normalizeResponse(response);\n }\n\n // No filter: fetch all three types in parallel and merge\n const [r1, r2, r3] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"move_order_stop\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ...((r3.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n ];\n}\n\nexport function registerFuturesAlgoTools(): ToolSpec[] {\n return [\n {\n name: \"futures_place_algo_order\",\n module: \"futures\",\n description:\n \"Place a FUTURES delivery algo order: TP/SL (conditional/oco) or trailing stop (move_order_stop). [CAUTION] Executes real trades. \" +\n \"conditional: single TP, single SL, or both on one order. \" +\n \"oco: TP+SL simultaneously — first trigger cancels the other. \" +\n \"move_order_stop: provide callbackRatio (e.g. '0.01'=1%) OR callbackSpread, and optionally activePx. \" +\n \"Set tpOrdPx='-1' or slOrdPx='-1' for market execution.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"conditional=single TP/SL or both; oco=TP+SL pair; move_order_stop=trailing stop\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount).\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price (conditional/oco only)\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market (conditional/oco only)\",\n },\n tpTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark (conditional/oco only)\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price (conditional/oco only)\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market (conditional/oco only)\",\n },\n slTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark (conditional/oco only)\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread (move_order_stop only)\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units (move_order_stop only)\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price; tracking starts after market reaches this level (move_order_stop only)\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in contracts, quote_ccy: sz in USDT\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n tpTriggerPxType: readString(args, \"tpTriggerPxType\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n slTriggerPxType: readString(args, \"slTriggerPxType\"),\n callBackRatio: readString(args, \"callbackRatio\"),\n callBackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"futures_place_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"futures_place_move_stop_order\",\n module: \"futures\",\n description:\n \"[DEPRECATED] Use futures_place_algo_order with ordType='move_order_stop' instead. \" +\n \"Place a FUTURES delivery trailing stop order. [CAUTION] Executes real trades.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount).\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units; provide either ratio or spread\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: \"move_order_stop\",\n sz: requireString(args, \"sz\"),\n callBackRatio: readString(args, \"callbackRatio\"),\n callBackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"futures_place_move_stop_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"futures_amend_algo_order\",\n module: \"futures\",\n description:\n \"Amend a pending FUTURES delivery algo order (modify TP/SL prices or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT-240329\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\", description: \"New number of contracts\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"futures_amend_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"futures_cancel_algo_orders\",\n module: \"futures\",\n description:\n \"Cancel one or more pending FUTURES delivery algo orders (TP/SL). Accepts a list of {algoId, instId} objects.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"List of algo orders to cancel. Each item: {algoId, instId}.\",\n items: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID\" },\n instId: { type: \"string\", description: \"e.g. BTC-USDT-240329\" },\n },\n required: [\"algoId\", \"instId\"],\n },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n orders,\n privateRateLimit(\"futures_cancel_algo_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"futures_get_algo_orders\",\n module: \"futures\",\n description:\n \"Query pending or completed FUTURES delivery algo orders (TP/SL, OCO, trailing stop).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"Filter by type; omit for all\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n algoId: {\n type: \"string\",\n description: \"Filter by algo order ID\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description:\n \"Required when status=history. effective=triggered, canceled, order_failed. Defaults to effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"FUTURES\",\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"futures_get_algo_orders\", 20),\n );\n return normalizeResponse(response);\n }\n\n // No filter: fetch all three types in parallel and merge\n const [r1, r2, r3] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"futures_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"futures_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"move_order_stop\" }, privateRateLimit(\"futures_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ...((r3.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n ];\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { ToolSpec } from \"./types.js\";\nimport { asRecord, readNumber, readString } from \"./helpers.js\";\nimport type { LogEntry } from \"../utils/logger.js\";\n\nconst DEFAULT_LOG_DIR = path.join(os.homedir(), \".okx\", \"logs\");\n\nfunction getLogPaths(logDir: string, days = 7): string[] {\n const paths: string[] = [];\n const now = new Date();\n for (let i = 0; i < days; i++) {\n const d = new Date(now);\n d.setUTCDate(now.getUTCDate() - i);\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n paths.push(path.join(logDir, `trade-${yyyy}-${mm}-${dd}.log`));\n }\n return paths;\n}\n\nfunction readEntries(logDir: string): LogEntry[] {\n const entries: LogEntry[] = [];\n for (const filePath of getLogPaths(logDir)) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n entries.push(JSON.parse(trimmed) as LogEntry);\n } catch {\n // skip malformed lines\n }\n }\n }\n return entries;\n}\n\nexport function registerAuditTools(): ToolSpec[] {\n return [\n {\n name: \"trade_get_history\",\n module: \"account\",\n description:\n \"Query local audit log of tool calls made through this MCP server. \" +\n \"Returns recent operations with timestamps, duration, params, and results. \" +\n \"Use to review what trades or queries were executed in this session or past sessions.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n tool: {\n type: \"string\",\n description: \"e.g. swap_place_order\",\n },\n level: {\n type: \"string\",\n enum: [\"INFO\", \"WARN\", \"ERROR\", \"DEBUG\"],\n },\n since: {\n type: \"string\",\n description: \"ISO 8601 timestamp lower bound\",\n },\n },\n },\n handler: async (rawArgs) => {\n const args = asRecord(rawArgs);\n const limit = Math.min(readNumber(args, \"limit\") ?? 20, 100);\n const toolFilter = readString(args, \"tool\");\n const levelFilter = readString(args, \"level\")?.toUpperCase();\n const since = readString(args, \"since\");\n const sinceTime = since ? new Date(since).getTime() : undefined;\n\n let entries = readEntries(DEFAULT_LOG_DIR);\n\n if (toolFilter) {\n entries = entries.filter((e) => e.tool === toolFilter);\n }\n if (levelFilter) {\n entries = entries.filter((e) => e.level === levelFilter);\n }\n if (sinceTime !== undefined) {\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= sinceTime);\n }\n\n // most recent first\n entries.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n entries = entries.slice(0, limit);\n\n return { entries, total: entries.length };\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\nimport { OkxApiError } from \"../../utils/errors.js\";\n\n/** For write operations: surface any inner sCode/sMsg errors from data items. */\nfunction normalizeWrite(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n const data = response.data;\n if (Array.isArray(data) && data.length > 0) {\n const failed = data.filter(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n \"sCode\" in (item as object) &&\n (item as Record<string, unknown>)[\"sCode\"] !== \"0\",\n ) as Record<string, unknown>[];\n if (failed.length > 0) {\n const messages = failed.map(\n (item) => `[${item[\"sCode\"]}] ${item[\"sMsg\"] ?? \"Operation failed\"}`,\n );\n throw new OkxApiError(messages.join(\"; \"), {\n code: String(failed[0]![\"sCode\"] ?? \"\"),\n endpoint: response.endpoint,\n });\n }\n }\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data,\n };\n}\n\nexport function registerGridTools(): ToolSpec[] {\n return [\n {\n name: \"grid_get_orders\",\n module: \"bot.grid\",\n description:\n \"List grid bots. status='active' for running; 'history' for stopped.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n status: {\n type: \"string\",\n enum: [\"active\", \"history\"],\n description: \"active=running (default); history=stopped\",\n },\n instId: { type: \"string\", description: \"e.g. BTC-USDT, BTC-USD-SWAP\" },\n algoId: { type: \"string\", description: \"Grid bot algo order ID (not a trade ordId)\" },\n after: { type: \"string\", description: \"Cursor for older records\" },\n before: { type: \"string\", description: \"Cursor for newer records\" },\n limit: { type: \"number\", description: \"Default 100\" },\n },\n required: [\"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoOrdType = requireString(args, \"algoOrdType\");\n const status = readString(args, \"status\") ?? \"active\";\n const path =\n status === \"history\"\n ? \"/api/v5/tradingBot/grid/orders-algo-history\"\n : \"/api/v5/tradingBot/grid/orders-algo-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n algoOrdType,\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"grid_get_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"grid_get_order_details\",\n module: \"bot.grid\",\n description: \"Get grid bot detail by algo ID. Returns config, status, PnL, and position.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n algoId: { type: \"string\", description: \"Grid bot algo order ID (not a trade ordId)\" },\n },\n required: [\"algoOrdType\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/tradingBot/grid/orders-algo-details\",\n {\n algoOrdType: requireString(args, \"algoOrdType\"),\n algoId: requireString(args, \"algoId\"),\n },\n privateRateLimit(\"grid_get_order_details\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"grid_get_sub_orders\",\n module: \"bot.grid\",\n description:\n \"Query sub-orders (grid trades) of a bot. type='filled' for executed; 'live' for pending.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n algoId: { type: \"string\", description: \"Grid bot algo order ID (not a trade ordId)\" },\n type: {\n type: \"string\",\n enum: [\"filled\", \"live\"],\n description: \"filled=executed trades (default); live=pending\",\n },\n groupId: { type: \"string\", description: \"A buy-sell pair shares the same groupId\" },\n after: { type: \"string\", description: \"Cursor for older records\" },\n before: { type: \"string\", description: \"Cursor for newer records\" },\n limit: { type: \"number\", description: \"Default 100\" },\n },\n required: [\"algoOrdType\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/tradingBot/grid/sub-orders\",\n compactObject({\n algoOrdType: requireString(args, \"algoOrdType\"),\n algoId: requireString(args, \"algoId\"),\n type: readString(args, \"type\") ?? \"filled\",\n groupId: readString(args, \"groupId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"grid_get_sub_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"grid_create_order\",\n module: \"bot.grid\",\n description:\n \"Create grid bot (spot, USDT-margined, or coin-margined contract). [CAUTION] Locks funds. \" +\n \"Spot: quoteSz|baseSz. Contract: direction+lever+sz.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT, BTC-USDT-SWAP, BTC-USD-SWAP (coin-margined)\" },\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n maxPx: { type: \"string\", description: \"Upper price\" },\n minPx: { type: \"string\", description: \"Lower price\" },\n gridNum: { type: \"string\", description: \"Number of grids\" },\n runType: {\n type: \"string\",\n enum: [\"1\", \"2\"],\n description: \"1=arithmetic (default); 2=geometric\",\n },\n quoteSz: { type: \"string\", description: \"Spot: quote amount (e.g. USDT)\" },\n baseSz: { type: \"string\", description: \"Spot: base amount (e.g. BTC)\" },\n direction: {\n type: \"string\",\n enum: [\"long\", \"short\", \"neutral\"],\n description: \"Contract only\",\n },\n lever: { type: \"string\", description: \"Leverage. Contract only\" },\n sz: { type: \"string\", description: \"Margin in USDT or base coin (CoinM). Contract only\" },\n basePos: { type: \"boolean\", description: \"Open base position for contract. Default: true\" },\n tpTriggerPx: { type: \"string\", description: \"TP trigger price\" },\n slTriggerPx: { type: \"string\", description: \"SL trigger price\" },\n tpRatio: { type: \"string\", description: \"TP ratio e.g. 0.1=10%. Contract only\" },\n slRatio: { type: \"string\", description: \"SL ratio e.g. 0.1=10%. Contract only\" },\n algoClOrdId: { type: \"string\", description: \"User-defined ID. Alphanumeric, max 32, unique per user\" },\n },\n required: [\"instId\", \"algoOrdType\", \"maxPx\", \"minPx\", \"gridNum\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoOrdType = requireString(args, \"algoOrdType\");\n const body: Record<string, unknown> = compactObject({\n instId: requireString(args, \"instId\"),\n algoOrdType,\n maxPx: requireString(args, \"maxPx\"),\n minPx: requireString(args, \"minPx\"),\n gridNum: requireString(args, \"gridNum\"),\n runType: readString(args, \"runType\"),\n quoteSz: readString(args, \"quoteSz\"),\n baseSz: readString(args, \"baseSz\"),\n direction: readString(args, \"direction\"),\n lever: readString(args, \"lever\"),\n sz: readString(args, \"sz\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n tpRatio: readString(args, \"tpRatio\"),\n slRatio: readString(args, \"slRatio\"),\n algoClOrdId: readString(args, \"algoClOrdId\"),\n tag: context.config.sourceTag,\n });\n if (algoOrdType === \"contract_grid\") {\n requireString(args, \"direction\");\n body.triggerParams = [{ triggerAction: \"start\", triggerStrategy: \"instant\" }];\n body.basePos = readBoolean(args, \"basePos\") ?? true;\n }\n const response = await context.client.privatePost(\n \"/api/v5/tradingBot/grid/order-algo\",\n body,\n privateRateLimit(\"grid_create_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"grid_stop_order\",\n module: \"bot.grid\",\n description:\n \"Stop a grid bot. [CAUTION] Closes or cancels orders. \" +\n \"For contract: stopType controls close ('1') vs cancel-only ('2').\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Grid bot algo order ID (not a trade ordId)\" },\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n instId: { type: \"string\", description: \"e.g. BTC-USDT, BTC-USD-SWAP\" },\n stopType: {\n type: \"string\",\n enum: [\"1\", \"2\", \"3\", \"5\", \"6\"],\n description: \"1=close all (default); 2=keep assets; 3=limit close; 5=partial; 6=no sell\",\n },\n },\n required: [\"algoId\", \"algoOrdType\", \"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/tradingBot/grid/stop-order-algo\",\n [compactObject({\n algoId: requireString(args, \"algoId\"),\n algoOrdType: requireString(args, \"algoOrdType\"),\n instId: requireString(args, \"instId\"),\n stopType: readString(args, \"stopType\") ?? \"1\",\n })],\n privateRateLimit(\"grid_stop_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\nimport { OkxApiError } from \"../../utils/errors.js\";\n\nconst BASE = \"/api/v5/tradingBot/dca\";\n\n/** For write operations: surface any inner sCode/sMsg errors from data items. */\nfunction normalizeWrite(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n const data = response.data;\n if (Array.isArray(data) && data.length > 0) {\n const failed = data.filter(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n \"sCode\" in (item as object) &&\n (item as Record<string, unknown>)[\"sCode\"] !== \"0\",\n ) as Record<string, unknown>[];\n if (failed.length > 0) {\n const messages = failed.map(\n (item) => `[${item[\"sCode\"]}] ${item[\"sMsg\"] ?? \"Operation failed\"}`,\n );\n throw new OkxApiError(messages.join(\"; \"), {\n code: String(failed[0]![\"sCode\"] ?? \"\"),\n endpoint: response.endpoint,\n });\n }\n }\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data,\n };\n}\n\nexport function registerDcaTools(): ToolSpec[] {\n return [\n {\n name: \"dca_create_order\",\n module: \"bot.dca\",\n description:\n \"Create a DCA (Martingale) bot. [CAUTION] Real trades. \" +\n \"contract_dca requires lever; spot_dca must be long. \" +\n \"If maxSafetyOrds>0: need safetyOrdAmt, pxSteps.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"BTC-USDT (spot) or BTC-USDT-SWAP (contract)\" },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"] },\n lever: { type: \"string\", description: \"Required for contract_dca\" },\n direction: { type: \"string\", enum: [\"long\", \"short\"] },\n initOrdAmt: { type: \"string\", description: \"Initial amount in quote ccy\" },\n maxSafetyOrds: { type: \"string\", description: \"0=no DCA, max 100\" },\n tpPct: { type: \"string\", description: \"Take-profit ratio, 0.03=3%\" },\n safetyOrdAmt: { type: \"string\", description: \"Safety order amount. Need if maxSafetyOrds>0\" },\n pxSteps: { type: \"string\", description: \"Price drop per safety order. Need if maxSafetyOrds>0\" },\n pxStepsMult: { type: \"string\", description: \"Step multiplier. Required when maxSafetyOrds>0, e.g. '1'\" },\n volMult: { type: \"string\", description: \"Size multiplier. Required when maxSafetyOrds>0, e.g. '1'\" },\n slPct: { type: \"string\", description: \"Stop-loss ratio, 0.05=5%\" },\n slMode: { type: \"string\", enum: [\"limit\", \"market\"] },\n allowReinvest: { type: \"boolean\", description: \"Default true\" },\n triggerStrategy: { type: \"string\", enum: [\"instant\", \"price\"] },\n triggerPx: { type: \"string\", description: \"Need if triggerStrategy=price\" },\n algoClOrdId: { type: \"string\", description: \"Client order ID, 1-32 chars\" },\n // Backend expects boolean, but kept as string for backward compatibility with older clients.\n reserveFunds: { type: \"string\", description: \"'true' or 'false', default 'true'\" },\n tradeQuoteCcy: { type: \"string\" },\n },\n required: [\"instId\", \"algoOrdType\", \"direction\", \"initOrdAmt\", \"maxSafetyOrds\", \"tpPct\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instId = requireString(args, \"instId\");\n const algoOrdType = requireString(args, \"algoOrdType\");\n\n // Validate lever: required for contract_dca\n if (algoOrdType === \"contract_dca\" && !readString(args, \"lever\")) {\n throw new OkxApiError(\"lever is required for contract_dca\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n\n // Build triggerParams: default to instant; support price strategy\n const triggerStrategy = readString(args, \"triggerStrategy\") ?? \"instant\";\n const triggerParam: Record<string, string> = {\n triggerAction: \"start\",\n triggerStrategy,\n };\n if (triggerStrategy === \"price\") {\n triggerParam[\"triggerPx\"] = requireString(args, \"triggerPx\");\n }\n\n // Validate conditional required params when maxSafetyOrds > 0\n const maxSafetyOrds = requireString(args, \"maxSafetyOrds\");\n if (Number(maxSafetyOrds) > 0) {\n if (!readString(args, \"safetyOrdAmt\")) {\n throw new OkxApiError(\"safetyOrdAmt is required when maxSafetyOrds > 0\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n if (!readString(args, \"pxSteps\")) {\n throw new OkxApiError(\"pxSteps is required when maxSafetyOrds > 0\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n if (!readString(args, \"pxStepsMult\")) {\n throw new OkxApiError(\"pxStepsMult is required when maxSafetyOrds > 0\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n if (!readString(args, \"volMult\")) {\n throw new OkxApiError(\"volMult is required when maxSafetyOrds > 0\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n }\n\n const response = await context.client.privatePost(\n `${BASE}/create`,\n compactObject({\n instId,\n algoOrdType,\n lever: readString(args, \"lever\"),\n direction: requireString(args, \"direction\"),\n initOrdAmt: requireString(args, \"initOrdAmt\"),\n safetyOrdAmt: readString(args, \"safetyOrdAmt\"),\n maxSafetyOrds,\n pxSteps: readString(args, \"pxSteps\"),\n pxStepsMult: readString(args, \"pxStepsMult\"),\n volMult: readString(args, \"volMult\"),\n tpPct: requireString(args, \"tpPct\"),\n slPct: readString(args, \"slPct\"),\n slMode: readString(args, \"slMode\"),\n allowReinvest: args[\"allowReinvest\"] !== undefined\n ? (args[\"allowReinvest\"] === true || args[\"allowReinvest\"] === \"true\")\n : undefined,\n triggerParams: [triggerParam],\n tag: context.config.sourceTag,\n algoClOrdId: readString(args, \"algoClOrdId\"),\n reserveFunds: readString(args, \"reserveFunds\"),\n tradeQuoteCcy: readString(args, \"tradeQuoteCcy\"),\n }),\n privateRateLimit(\"dca_create_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"dca_stop_order\",\n module: \"bot.dca\",\n description:\n \"Stop a running DCA bot. [CAUTION] spot_dca needs stopType: 1=sell, 2=keep.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID\" },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"] },\n stopType: { type: \"string\", enum: [\"1\", \"2\"], description: \"Required for spot_dca: 1=sell all, 2=keep tokens\" },\n },\n required: [\"algoId\", \"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n const algoOrdType = requireString(args, \"algoOrdType\");\n const stopType = readString(args, \"stopType\");\n\n // Validate stopType: required for spot_dca\n if (algoOrdType === \"spot_dca\" && !stopType) {\n throw new OkxApiError(\n \"stopType is required for spot_dca. Use '1' (sell all tokens) or '2' (keep tokens)\",\n { code: \"VALIDATION\", endpoint: `${BASE}/stop` },\n );\n }\n\n const response = await context.client.privatePost(\n `${BASE}/stop`,\n compactObject({ algoId, algoOrdType, stopType }),\n privateRateLimit(\"dca_stop_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"dca_get_orders\",\n module: \"bot.dca\",\n description: \"List DCA bots. Default: active (running). Use status=history for stopped.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: { type: \"string\", enum: [\"active\", \"history\"] },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"], description: \"Default: contract_dca\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n instId: { type: \"string\" },\n after: { type: \"string\", description: \"Pagination cursor\" },\n before: { type: \"string\", description: \"Pagination cursor\" },\n limit: { type: \"number\" },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"active\";\n const path = status === \"history\" ? `${BASE}/history-list` : `${BASE}/ongoing-list`;\n // Default to contract_dca for backward compatibility\n const algoOrdType = readString(args, \"algoOrdType\") ?? \"contract_dca\";\n\n const response = await context.client.privateGet(\n path,\n compactObject({\n algoOrdType,\n algoId: readString(args, \"algoId\"),\n instId: readString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"dca_get_order_details\",\n module: \"bot.dca\",\n description: \"Get DCA bot position details (avgPx, upl, liqPx, etc).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID\" },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"] },\n },\n required: [\"algoId\", \"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n const algoOrdType = requireString(args, \"algoOrdType\");\n\n const response = await context.client.privateGet(\n `${BASE}/position-details`,\n { algoId, algoOrdType },\n privateRateLimit(\"dca_get_order_details\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"dca_get_sub_orders\",\n module: \"bot.dca\",\n description: \"Get DCA cycles or orders in a cycle. Omit cycleId=cycle list; with cycleId=orders.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID\" },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"] },\n cycleId: { type: \"string\", description: \"Omit for cycles; provide for orders\" },\n after: { type: \"string\", description: \"Pagination cursor\" },\n before: { type: \"string\", description: \"Pagination cursor\" },\n limit: { type: \"number\" },\n },\n required: [\"algoId\", \"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n const algoOrdType = requireString(args, \"algoOrdType\");\n const cycleId = readString(args, \"cycleId\");\n\n if (cycleId) {\n // orders within a specific cycle\n const response = await context.client.privateGet(\n `${BASE}/orders`,\n compactObject({\n algoId,\n algoOrdType,\n cycleId,\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_sub_orders\", 20),\n );\n return normalizeResponse(response);\n }\n // cycle list\n const response = await context.client.privateGet(\n `${BASE}/cycle-list`,\n compactObject({\n algoId,\n algoOrdType,\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_sub_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport { registerGridTools } from \"./grid.js\";\nimport { registerDcaTools } from \"./dca.js\";\n\nexport function registerBotTools(): ToolSpec[] {\n return [\n ...registerGridTools(),\n ...registerDcaTools(),\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { assertNotDemo, privateRateLimit, publicRateLimit } from \"../common.js\";\n\nexport function registerEarnTools(): ToolSpec[] {\n return [\n {\n name: \"earn_get_savings_balance\",\n module: \"earn.savings\",\n description:\n \"Get Simple Earn (savings/flexible earn) balance. Returns current holdings, lent amount, pending interest, and the user's set rate. \" +\n \"Response fields: amt (total held), loanAmt (actively lent), pendingAmt (awaiting match), earnings (cumulative interest), \" +\n \"rate (user's own minimum lending rate setting — NOT market yield, NOT APY). \" +\n \"To get the actual market lending rate, call earn_get_lending_rate_history instead.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT or BTC. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/savings/balance\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"earn_get_savings_balance\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_savings_purchase\",\n module: \"earn.savings\",\n description:\n \"Purchase Simple Earn (savings/flexible earn). [CAUTION] Moves real funds into earn product.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency to purchase, e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Purchase amount\",\n },\n rate: {\n type: \"string\",\n description:\n \"Minimum lending rate threshold (annual, decimal). e.g. 0.01 = 1%. Only matched when market rate ≥ this value. Defaults to 0.01. Keep at 0.01 to maximize matching probability — do NOT raise this to increase yield, as actual yield (lendingRate) is determined by market supply/demand, not this setting.\",\n },\n },\n required: [\"ccy\", \"amt\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_savings_purchase\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/savings/purchase-redempt\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n side: \"purchase\",\n rate: readString(args, \"rate\") ?? \"0.01\",\n }),\n privateRateLimit(\"earn_savings_purchase\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_savings_redeem\",\n module: \"earn.savings\",\n description:\n \"Redeem Simple Earn (savings/flexible earn). [CAUTION] Withdraws funds from earn product.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency to redeem, e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Redemption amount\",\n },\n },\n required: [\"ccy\", \"amt\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_savings_redeem\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/savings/purchase-redempt\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n side: \"redempt\",\n }),\n privateRateLimit(\"earn_savings_redeem\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_set_lending_rate\",\n module: \"earn.savings\",\n description:\n \"Set lending rate for Simple Earn. [CAUTION] Changes your lending rate preference.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency, e.g. USDT\",\n },\n rate: {\n type: \"string\",\n description: \"Minimum lending rate threshold (annual, decimal). e.g. 0.01 = 1%. Only matched when market rate ≥ this value. Keep at 0.01 to maximize matching probability — do NOT raise this to increase yield, as actual yield (lendingRate) is determined by market supply/demand, not this setting.\",\n },\n },\n required: [\"ccy\", \"rate\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_set_lending_rate\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/savings/set-lending-rate\",\n {\n ccy: requireString(args, \"ccy\"),\n rate: requireString(args, \"rate\"),\n },\n privateRateLimit(\"earn_set_lending_rate\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_get_lending_history\",\n module: \"earn.savings\",\n description:\n \"Get personal lending records for Simple Earn (your own lending history). NOT for market rate queries. \" +\n \"Returns your lending records with amount, rate, and earnings data.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT. Omit for all.\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this record ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this record ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/savings/lending-history\",\n compactObject({\n ccy: readString(args, \"ccy\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"earn_get_lending_history\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_get_lending_rate_history\",\n module: \"earn.savings\",\n description:\n \"Query Simple Earn lending rates. Public endpoint (no API key required). \" +\n \"Use this tool when the user asks about current or historical lending rates for Simple Earn, \" +\n \"or when displaying savings balance with market rate context. \" +\n \"Response fields per record: \" +\n \"rate (market lending rate — the rate borrowers pay this period; user's minimum setting must be ≤ this to be eligible), \" +\n \"lendingRate (actual yield received by lenders; stablecoins e.g. USDT/USDC only: subject to pro-rata dilution — when eligible supply exceeds borrowing demand total interest is shared so lendingRate < rate; non-stablecoins: lendingRate = rate, no dilution; always use lendingRate as the true APY to show users), \" +\n \"ts (settlement timestamp ms). \" +\n \"To get current APY: use limit=1 and read lendingRate.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT. Omit for all.\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/finance/savings/lending-rate-history\",\n compactObject({\n ccy: readString(args, \"ccy\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"earn_get_lending_rate_history\", 6),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { assertNotDemo, privateRateLimit } from \"../common.js\";\n\nexport function registerOnchainEarnTools(): ToolSpec[] {\n return [\n // -------------------------------------------------------------------------\n // Get Offers\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_get_offers\",\n module: \"earn.onchain\",\n description:\n \"List staking/DeFi products with APY, terms, and limits. \" +\n \"Always show protocol name (protocol field) and earnings currency (earningData[].ccy) when presenting results.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Product ID filter.\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n ccy: {\n type: \"string\",\n description: \"e.g. ETH\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/staking-defi/offers\",\n compactObject({\n productId: readString(args, \"productId\"),\n protocolType: readString(args, \"protocolType\"),\n ccy: readString(args, \"ccy\"),\n }),\n privateRateLimit(\"onchain_earn_get_offers\", 3),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Purchase\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_purchase\",\n module: \"earn.onchain\",\n description: \"Invest in a staking/DeFi product. [CAUTION] Moves real funds. Not available in demo mode.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Product ID\",\n },\n investData: {\n type: \"array\",\n description: \"Array of {ccy, amt} to invest.\",\n items: {\n type: \"object\",\n properties: {\n ccy: { type: \"string\", description: \"e.g. ETH\" },\n amt: { type: \"string\" },\n },\n required: [\"ccy\", \"amt\"],\n },\n },\n term: {\n type: \"string\",\n description: \"Investment term in days, required for fixed-term products.\",\n },\n tag: {\n type: \"string\",\n description: \"Order tag.\",\n },\n },\n required: [\"productId\", \"investData\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"onchain_earn_purchase\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/staking-defi/purchase\",\n compactObject({\n productId: requireString(args, \"productId\"),\n investData: args.investData,\n term: readString(args, \"term\"),\n tag: readString(args, \"tag\"),\n }),\n privateRateLimit(\"onchain_earn_purchase\", 2),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Redeem\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_redeem\",\n module: \"earn.onchain\",\n description: \"Redeem a staking/DeFi investment. [CAUTION] Some products have lock periods, early redemption may incur penalties. Not available in demo mode.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: {\n type: \"string\",\n description: \"Order ID\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n allowEarlyRedeem: {\n type: \"boolean\",\n description: \"Allow early exit for fixed-term products, may incur penalties. Default: false.\",\n },\n },\n required: [\"ordId\", \"protocolType\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"onchain_earn_redeem\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/staking-defi/redeem\",\n compactObject({\n ordId: requireString(args, \"ordId\"),\n protocolType: requireString(args, \"protocolType\"),\n allowEarlyRedeem: readBoolean(args, \"allowEarlyRedeem\"),\n }),\n privateRateLimit(\"onchain_earn_redeem\", 2),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Cancel\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_cancel\",\n module: \"earn.onchain\",\n description: \"Cancel a pending staking/DeFi purchase order. [CAUTION] Not available in demo mode.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: {\n type: \"string\",\n description: \"Order ID\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n },\n required: [\"ordId\", \"protocolType\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"onchain_earn_cancel\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/staking-defi/cancel\",\n {\n ordId: requireString(args, \"ordId\"),\n protocolType: requireString(args, \"protocolType\"),\n },\n privateRateLimit(\"onchain_earn_cancel\", 2),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Get Active Orders\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_get_active_orders\",\n module: \"earn.onchain\",\n description: \"List current active staking/DeFi investments.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Product ID filter.\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n ccy: {\n type: \"string\",\n description: \"e.g. ETH\",\n },\n state: {\n type: \"string\",\n description: \"8=pending, 13=cancelling, 9=onchain, 1=earning, 2=redeeming\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/staking-defi/orders-active\",\n compactObject({\n productId: readString(args, \"productId\"),\n protocolType: readString(args, \"protocolType\"),\n ccy: readString(args, \"ccy\"),\n state: readString(args, \"state\"),\n }),\n privateRateLimit(\"onchain_earn_get_active_orders\", 3),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Get Order History\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_get_order_history\",\n module: \"earn.onchain\",\n description: \"List past staking/DeFi orders including redeemed ones.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Product ID filter.\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n ccy: {\n type: \"string\",\n description: \"e.g. ETH\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: results older than this order ID.\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: results newer than this order ID.\",\n },\n limit: {\n type: \"string\",\n description: \"Max results (default 100, max 100).\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/staking-defi/orders-history\",\n compactObject({\n productId: readString(args, \"productId\"),\n protocolType: readString(args, \"protocolType\"),\n ccy: readString(args, \"ccy\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readString(args, \"limit\"),\n }),\n privateRateLimit(\"onchain_earn_get_order_history\", 3),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { assertNotDemo, privateRateLimit } from \"../common.js\";\nimport { OkxApiError, RateLimitError } from \"../../utils/errors.js\";\n\n// retry=true: withDcdErrors converts the error to RateLimitError, signaling the caller to back off and retry.\nconst DCD_CODE_BEHAVIORS: Record<string, { retry: boolean; suggestion: string }> = {\n \"50001\": { retry: true, suggestion: \"DCD service is down. Retry in a few minutes.\" },\n \"50002\": { retry: false, suggestion: \"Invalid JSON in request body. This is likely a bug — check request parameters.\" },\n \"50014\": { retry: false, suggestion: \"Missing required parameter. Check that all required fields are provided.\" },\n \"50016\": { retry: false, suggestion: \"notionalCcy does not match productId option type. Use baseCcy for CALL, quoteCcy for PUT.\" },\n \"50026\": { retry: true, suggestion: \"DCD system error. Retry in a few minutes.\" },\n \"50030\": { retry: false, suggestion: \"Account not authorized for DCD (earn-auth check failed). Complete required verification in the OKX app first.\" },\n \"50038\": { retry: false, suggestion: \"DCD Open API feature is disabled for this account. Contact OKX support to enable it.\" },\n \"50051\": { retry: false, suggestion: \"This currency pair is restricted for your country or account type. Do not retry.\" },\n \"51000\": { retry: false, suggestion: \"Invalid parameter value or format. Check ordId, quoteId, or clOrdId.\" },\n \"51728\": { retry: false, suggestion: \"Available quota exceeded. Reduce the amount and retry.\" },\n \"51736\": { retry: false, suggestion: \"Insufficient balance. Top up your account before retrying.\" },\n \"52905\": { retry: false, suggestion: \"Quote has expired or was not found. Request a new quote.\" },\n \"52909\": { retry: false, suggestion: \"Duplicate client order ID. Use a different clOrdId.\" },\n \"52917\": { retry: false, suggestion: \"Amount is below the minimum trade size. Increase the amount.\" },\n \"52918\": { retry: false, suggestion: \"Amount exceeds the maximum trade size. Reduce the amount.\" },\n \"52921\": { retry: false, suggestion: \"Quote has already been used by another trade.\" },\n \"52927\": { retry: true, suggestion: \"No quote returned by liquidity provider. Retry the quote request.\" },\n \"52928\": { retry: false, suggestion: \"Amount is not divisible by the required step size. Adjust the amount.\" },\n \"58004\": { retry: false, suggestion: \"Account is frozen or blocked. Contact OKX support. Do not retry.\" },\n \"58102\": { retry: true, suggestion: \"DCD rate limit exceeded. Back off and retry after a short delay.\" },\n};\n\nasync function withDcdErrors<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n if (error instanceof OkxApiError && error.code) {\n const behavior = DCD_CODE_BEHAVIORS[error.code];\n if (behavior) {\n if (behavior.retry) {\n throw new RateLimitError(error.message, behavior.suggestion, error.endpoint, error.traceId);\n }\n throw new OkxApiError(error.message, {\n code: error.code,\n suggestion: behavior.suggestion,\n endpoint: error.endpoint,\n traceId: error.traceId,\n });\n }\n }\n throw error;\n }\n}\n\nexport function registerDcdTools(): ToolSpec[] {\n return [\n {\n name: \"dcd_get_currency_pairs\",\n module: \"earn.dcd\",\n description: \"Get available DCD currency pairs.\",\n isWrite: false,\n inputSchema: { type: \"object\", properties: {} },\n handler: async (_rawArgs, context) => {\n return withDcdErrors(async () => {\n const response = await context.client.privateGet(\n \"/api/v5/finance/sfp/dcd/currency-pair\",\n undefined,\n privateRateLimit(\"dcd_get_currency_pairs\", 5),\n );\n return normalizeResponse(response);\n });\n },\n },\n {\n name: \"dcd_get_products\",\n module: \"earn.dcd\",\n description: \"Get DCD products with yield and quota info.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n baseCcy: { type: \"string\", description: \"Base currency, e.g. BTC\" },\n quoteCcy: { type: \"string\", description: \"Quote currency, e.g. USDT\" },\n optType: { type: \"string\", description: \"Option type: C (Call, sell high) or P (Put, buy low)\" },\n },\n required: [\"baseCcy\", \"quoteCcy\", \"optType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n return withDcdErrors(async () => {\n const response = await context.client.privateGet(\n \"/api/v5/finance/sfp/dcd/products\",\n {\n baseCcy: requireString(args, \"baseCcy\"),\n quoteCcy: requireString(args, \"quoteCcy\"),\n optType: requireString(args, \"optType\"),\n },\n privateRateLimit(\"dcd_get_products\", 5),\n );\n return normalizeResponse(response);\n });\n },\n },\n {\n name: \"dcd_get_order_state\",\n module: \"earn.dcd\",\n description: \"Check DCD order state after subscription (returns ordId + state only). For full order details (productId, strike, yield, settlement info), use dcd_get_orders instead.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: { type: \"string\", description: \"Order ID\" },\n },\n required: [\"ordId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n return withDcdErrors(async () => {\n const response = await context.client.privateGet(\n \"/api/v5/finance/sfp/dcd/order-status\",\n { ordId: requireString(args, \"ordId\") },\n privateRateLimit(\"dcd_get_order_state\", 5),\n );\n return normalizeResponse(response);\n });\n },\n },\n {\n name: \"dcd_get_orders\",\n module: \"earn.dcd\",\n description: \"Get DCD order history.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: { type: \"string\", description: \"Filter by order ID (overrides other filters)\" },\n productId: { type: \"string\", description: \"e.g. BTC-USDT-260327-77000-C\" },\n uly: { type: \"string\", description: \"Underlying index, e.g. BTC-USD\" },\n state: {\n type: \"string\",\n description:\n \"Filter by state: initial | live | pending_settle | settled | pending_redeem | redeemed | rejected\",\n },\n beginId: { type: \"string\", description: \"Cursor for newer records\" },\n endId: { type: \"string\", description: \"Cursor for older records\" },\n begin: { type: \"string\", description: \"Begin timestamp, Unix ms\" },\n end: { type: \"string\", description: \"End timestamp, Unix ms\" },\n limit: { type: \"number\", description: \"Default 100\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n return withDcdErrors(async () => {\n const response = await context.client.privateGet(\n \"/api/v5/finance/sfp/dcd/order-history\",\n compactObject({\n ordId: readString(args, \"ordId\"),\n productId: readString(args, \"productId\"),\n uly: readString(args, \"uly\"),\n state: readString(args, \"state\"),\n beginId: readString(args, \"beginId\"),\n endId: readString(args, \"endId\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dcd_get_orders\", 5),\n );\n return normalizeResponse(response);\n });\n },\n },\n {\n name: \"dcd_subscribe\",\n module: \"earn.dcd\",\n description:\n \"Subscribe to a DCD product: get quote and execute atomically. \" +\n \"Confirm product, amount, and currency with user before calling. \" +\n \"Optional minAnnualizedYield (percent) rejects the order if quote yield falls below threshold. \" +\n \"Returns order result with quote snapshot (annualizedYield, absYield).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: { type: \"string\", description: \"Product ID, e.g. BTC-USDT-260327-77000-C\" },\n notionalSz: { type: \"string\", description: \"Investment amount (the quantity to invest, e.g. '0.1' for 0.1 BTC). This is the 'sz' / 'size' field for DCD.\" },\n notionalCcy: { type: \"string\", description: \"Investment currency: baseCcy for CALL (C), quoteCcy for PUT (P)\" },\n clOrdId: { type: \"string\", description: \"Client order ID for idempotency (optional)\" },\n minAnnualizedYield: {\n type: \"number\",\n description:\n \"Minimum acceptable annualized yield in percent (e.g. 18 means 18%). \" +\n \"Order will NOT be placed if the quote yield is below this threshold.\",\n },\n },\n required: [\"productId\", \"notionalSz\", \"notionalCcy\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"dcd_subscribe\");\n const args = asRecord(rawArgs);\n const productId = requireString(args, \"productId\");\n const notionalSz = requireString(args, \"notionalSz\");\n const notionalCcy = requireString(args, \"notionalCcy\");\n const clOrdId = readString(args, \"clOrdId\");\n const minAnnualizedYield = readNumber(args, \"minAnnualizedYield\");\n\n return withDcdErrors(async () => {\n // Step 1: request quote\n const quoteResp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/quote\",\n { productId, notionalSz, notionalCcy },\n privateRateLimit(\"dcd_subscribe\", 5),\n );\n const quoteNorm = normalizeResponse(quoteResp);\n const quoteList = Array.isArray(quoteNorm[\"data\"])\n ? (quoteNorm[\"data\"] as Record<string, unknown>[])\n : [];\n const quote = quoteList[0];\n\n if (!quote || !quote[\"quoteId\"]) {\n throw new OkxApiError(\"No quote returned by liquidity provider.\", {\n code: \"52927\",\n suggestion: \"Retry the subscription request.\",\n });\n }\n\n // Step 2: check minAnnualizedYield before executing\n if (minAnnualizedYield !== undefined) {\n const actualYield = parseFloat(quote[\"annualizedYield\"] as string);\n if (!isNaN(actualYield) && actualYield < minAnnualizedYield) {\n throw new OkxApiError(\n `Quote yield ${actualYield}% is below the minimum threshold of ${minAnnualizedYield}%.`,\n {\n code: \"YIELD_BELOW_MIN\",\n suggestion: `Order not placed. Actual: ${actualYield}%, required: >= ${minAnnualizedYield}%. Try a different product or lower your minimum yield.`,\n },\n );\n }\n }\n\n // Step 3: execute quote immediately\n const tradeResp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/trade\",\n compactObject({\n quoteId: quote[\"quoteId\"] as string,\n clOrdId,\n }),\n privateRateLimit(\"dcd_subscribe\", 5),\n );\n const tradeNorm = normalizeResponse(tradeResp);\n\n // Return trade result with quote snapshot attached\n return {\n ...tradeNorm,\n quote: {\n quoteId: quote[\"quoteId\"],\n annualizedYield: quote[\"annualizedYield\"],\n absYield: quote[\"absYield\"],\n notionalSz: quote[\"notionalSz\"],\n notionalCcy: quote[\"notionalCcy\"],\n },\n };\n });\n },\n },\n {\n name: \"dcd_redeem\",\n module: \"earn.dcd\",\n description:\n \"Early redemption of a DCD order, two-step flow. \" +\n \"First call (no quoteId): returns redemption quote for user confirmation. \" +\n \"Second call (with quoteId): executes redemption. If the quote expired, auto-refreshes and executes; response includes autoRefreshedQuote: true.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: { type: \"string\", description: \"Order ID to redeem early\" },\n quoteId: {\n type: \"string\",\n description:\n \"Redeem quote ID returned by the first dcd_redeem call. \" +\n \"Omit on the first call to preview the exit cost; provide on the second call to execute.\",\n },\n },\n required: [\"ordId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const ordId = requireString(args, \"ordId\");\n const quoteId = readString(args, \"quoteId\");\n\n if (!quoteId) {\n // First call: preview mode — request quote only, no state change\n return withDcdErrors(async () => {\n const resp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/redeem-quote\",\n { ordId },\n privateRateLimit(\"dcd_redeem\", 5),\n );\n return normalizeResponse(resp);\n });\n }\n\n // Second call: execute mode\n assertNotDemo(context.config, \"dcd_redeem\");\n return withDcdErrors(async () => {\n try {\n const resp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/redeem\",\n { ordId, quoteId },\n privateRateLimit(\"dcd_redeem\", 5),\n );\n return normalizeResponse(resp);\n } catch (error) {\n // Quote expired: user already confirmed — re-request and execute atomically\n if (error instanceof OkxApiError && error.code === \"52905\") {\n const quoteResp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/redeem-quote\",\n { ordId },\n privateRateLimit(\"dcd_redeem\", 5),\n );\n const quoteNorm = normalizeResponse(quoteResp);\n const quoteList = Array.isArray(quoteNorm[\"data\"])\n ? (quoteNorm[\"data\"] as Record<string, unknown>[])\n : [];\n const newQuote = quoteList[0];\n if (!newQuote?.[\"quoteId\"]) {\n throw error; // cannot recover, surface original expiry error\n }\n const redeemResp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/redeem\",\n { ordId, quoteId: newQuote[\"quoteId\"] as string },\n privateRateLimit(\"dcd_redeem\", 5),\n );\n return {\n ...normalizeResponse(redeemResp),\n autoRefreshedQuote: true,\n refreshedQuote: {\n quoteId: newQuote[\"quoteId\"],\n redeemSz: newQuote[\"redeemSz\"],\n redeemCcy: newQuote[\"redeemCcy\"],\n termRate: newQuote[\"termRate\"],\n },\n };\n }\n throw error;\n }\n });\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\n\nexport function registerAutoEarnTools(): ToolSpec[] {\n return [\n {\n name: \"earn_auto_set\",\n module: \"earn.autoearn\",\n description:\n \"Enable or disable auto-earn for a currency. \" +\n \"earnType='0' for auto-lend+stake (most currencies); earnType='1' for USDG earn (USDG, BUIDL). \" +\n \"Use account_get_balance first: if autoLendStatus or autoStakingStatus != 'unsupported', use earnType='0'; for USDG/BUIDL use earnType='1'. \" +\n \"[CAUTION] Cannot disable within 24h of enabling.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency, e.g. SOL, USDG\",\n },\n action: {\n type: \"string\",\n description: \"turn_on or turn_off\",\n },\n earnType: {\n type: \"string\",\n description: \"0=auto-lend+stake (default), 1=USDG earn. Omit to use default.\",\n },\n },\n required: [\"ccy\", \"action\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-auto-earn\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n action: requireString(args, \"action\"),\n earnType: readString(args, \"earnType\") ?? \"0\",\n }),\n privateRateLimit(\"earn_auto_set\", 10),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport { registerEarnTools } from \"./savings.js\";\nimport { registerOnchainEarnTools } from \"./onchain.js\";\nimport { registerDcdTools } from \"./dcd.js\";\nimport { registerAutoEarnTools } from \"./autoearn.js\";\n\nexport { registerEarnTools, registerOnchainEarnTools, registerDcdTools, registerAutoEarnTools };\n\nexport function registerAllEarnTools(): ToolSpec[] {\n return [\n ...registerEarnTools(),\n ...registerOnchainEarnTools(),\n ...registerDcdTools(),\n ...registerAutoEarnTools(),\n ];\n}\n","/**\n * Shared factory for SWAP and FUTURES contract trade tools.\n * Both modules share 11 identical tool shapes; only names, descriptions,\n * default instType, and instId examples differ.\n */\nimport type { ToolSpec } from \"./types.js\";\nimport type { ModuleId } from \"../constants.js\";\nimport {\n asRecord,\n assertEnum,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport interface ContractConfig {\n /** Tool name prefix, e.g. \"swap\" → \"swap_place_order\" */\n prefix: string;\n /** MCP module name */\n module: ModuleId;\n /** Human-readable label used in descriptions, e.g. \"SWAP/FUTURES\" or \"FUTURES delivery\" */\n label: string;\n /** [defaultType, otherType], e.g. [\"SWAP\", \"FUTURES\"] or [\"FUTURES\", \"SWAP\"] */\n instTypes: readonly [string, string];\n /** instId example string shown in property descriptions */\n instIdExample: string;\n}\n\n/** Build the 11 common contract trade tools shared by swap and futures modules. */\nexport function buildContractTradeTools(cfg: ContractConfig): ToolSpec[] {\n const { prefix, module, label, instTypes, instIdExample } = cfg;\n const [defaultType, otherType] = instTypes;\n const instTypeDesc = `${defaultType} (default) or ${otherType}`;\n const n = (suffix: string) => `${prefix}_${suffix}`;\n\n return [\n // ── place_order ──────────────────────────────────────────────────────────\n {\n name: n(\"place_order\"),\n module,\n description: `Place ${label} order. Attach TP/SL via tpTriggerPx/slTriggerPx. [CAUTION] Executes real trades.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"buy=long, sell=short; hedge: use with posSide\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market=no px; limit/fok/ioc=px req; post_only=maker\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts count by default. Set tgtCcy=quote_ccy to use USDT amount instead.\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in contracts, quote_ccy: sz in USDT\",\n },\n px: { type: \"string\", description: \"Required for limit/post_only/fok/ioc\" },\n reduceOnly: {\n type: \"boolean\",\n description: \"Close/reduce only, no new position (one-way mode)\",\n },\n clOrdId: { type: \"string\", description: \"Client order ID (max 32 chars)\" },\n tpTriggerPx: { type: \"string\", description: \"TP trigger price\" },\n tpOrdPx: { type: \"string\", description: \"TP order price; -1=market\" },\n slTriggerPx: { type: \"string\", description: \"SL trigger price\" },\n slOrdPx: { type: \"string\", description: \"SL order price; -1=market\" },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const attachAlgoOrds = buildAttachAlgoOrds(args);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(n(\"place_order\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── cancel_order ─────────────────────────────────────────────────────────\n {\n name: n(\"cancel_order\"),\n module,\n description: `Cancel an unfilled ${label} order.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\", description: \"Client order ID\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(n(\"cancel_order\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_order ─────────────────────────────────────────────────────────────\n {\n name: n(\"get_order\"),\n module,\n description: `Get details of a single ${label} order by ordId or clOrdId.`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n ordId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n clOrdId: { type: \"string\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(n(\"get_order\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_orders ───────────────────────────────────────────────────────────\n {\n name: n(\"get_orders\"),\n module,\n description: `Query ${label} open orders, history (last 7 days), or archive (up to 3 months).`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n description: \"open=active, history=7d, archive=3mo\",\n },\n instType: {\n type: \"string\",\n enum: [...instTypes],\n description: instTypeDesc,\n },\n instId: { type: \"string\", description: instIdExample },\n ordType: { type: \"string\", description: \"Order type filter\" },\n state: { type: \"string\", description: \"canceled|filled\" },\n after: { type: \"string\", description: \"Cursor: return older\" },\n before: { type: \"string\", description: \"Cursor: return newer\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const instType = readString(args, \"instType\") ?? defaultType;\n assertEnum(instType, \"instType\", instTypes);\n let path = \"/api/v5/trade/orders-pending\";\n if (status === \"archive\") {\n path = \"/api/v5/trade/orders-history-archive\";\n } else if (status === \"history\") {\n path = \"/api/v5/trade/orders-history\";\n }\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(n(\"get_orders\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_positions ────────────────────────────────────────────────────────\n {\n name: n(\"get_positions\"),\n module,\n description: `Get current ${label} positions.`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...instTypes],\n description: instTypeDesc,\n },\n instId: { type: \"string\", description: instIdExample },\n posId: { type: \"string\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instType = readString(args, \"instType\") ?? defaultType;\n assertEnum(instType, \"instType\", instTypes);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(n(\"get_positions\"), 10),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_fills ────────────────────────────────────────────────────────────\n {\n name: n(\"get_fills\"),\n module,\n description: `Get ${label} fill details. archive=false (default): last 3 days; archive=true: up to 3 months.`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instType: {\n type: \"string\",\n enum: [...instTypes],\n description: instTypeDesc,\n },\n instId: { type: \"string\", description: \"Instrument ID filter\" },\n ordId: { type: \"string\", description: \"Order ID filter\" },\n after: { type: \"string\", description: \"Cursor: return older\" },\n before: { type: \"string\", description: \"Cursor: return newer\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results (default 100 or 20 for archive)\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const instType = readString(args, \"instType\") ?? defaultType;\n assertEnum(instType, \"instType\", instTypes);\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(n(\"get_fills\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── close_position ───────────────────────────────────────────────────────\n {\n name: n(\"close_position\"),\n module,\n description: `[CAUTION] Close entire ${label} position at market.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n mgnMode: { type: \"string\", enum: [\"cross\", \"isolated\"] },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"long/short=hedge mode; omit for one-way (net)\",\n },\n autoCxl: {\n type: \"boolean\",\n description: \"Cancel pending orders for this instrument on close\",\n },\n clOrdId: { type: \"string\", description: \"Client order ID for close order\" },\n },\n required: [\"instId\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const autoCxl = args.autoCxl;\n const response = await context.client.privatePost(\n \"/api/v5/trade/close-position\",\n compactObject({\n instId: requireString(args, \"instId\"),\n mgnMode: requireString(args, \"mgnMode\"),\n posSide: readString(args, \"posSide\"),\n autoCxl: typeof autoCxl === \"boolean\" ? String(autoCxl) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(n(\"close_position\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── set_leverage ─────────────────────────────────────────────────────────\n {\n name: n(\"set_leverage\"),\n module,\n description: `Set leverage for a ${label} instrument or position. [CAUTION] Changes risk parameters.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n lever: { type: \"string\", description: \"Leverage, e.g. '10'\" },\n mgnMode: { type: \"string\", enum: [\"cross\", \"isolated\"] },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"Required for isolated margin in hedge mode\",\n },\n },\n required: [\"instId\", \"lever\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-leverage\",\n compactObject({\n instId: requireString(args, \"instId\"),\n lever: requireString(args, \"lever\"),\n mgnMode: requireString(args, \"mgnMode\"),\n posSide: readString(args, \"posSide\"),\n }),\n privateRateLimit(n(\"set_leverage\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_leverage ─────────────────────────────────────────────────────────\n {\n name: n(\"get_leverage\"),\n module,\n description: `Get current leverage for a ${label} instrument.`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n mgnMode: { type: \"string\", enum: [\"cross\", \"isolated\"] },\n },\n required: [\"instId\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/leverage-info\",\n compactObject({\n instId: requireString(args, \"instId\"),\n mgnMode: requireString(args, \"mgnMode\"),\n }),\n privateRateLimit(n(\"get_leverage\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── batch_amend ──────────────────────────────────────────────────────────\n {\n name: n(\"batch_amend\"),\n module,\n description: `[CAUTION] Batch amend up to 20 unfilled ${label} orders.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?, newSz?, newPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(n(\"batch_amend\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── batch_cancel ─────────────────────────────────────────────────────────\n {\n name: n(\"batch_cancel\"),\n module,\n description: `[CAUTION] Batch cancel up to 20 ${label} orders.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(n(\"batch_cancel\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { buildContractTradeTools } from \"./contract-trade.js\";\n\nexport function registerFuturesTools(): ToolSpec[] {\n const common = buildContractTradeTools({\n prefix: \"futures\",\n module: \"futures\",\n label: \"FUTURES delivery\",\n instTypes: [\"FUTURES\", \"SWAP\"],\n instIdExample: \"e.g. BTC-USDT-240329\",\n });\n\n return [\n ...common,\n\n // ── futures_amend_order ───────────────────────────────────────────────────\n // Unique to futures: amend a regular (non-algo) unfilled order.\n {\n name: \"futures_amend_order\",\n module: \"futures\",\n description:\n \"Amend an unfilled FUTURES delivery order (modify price and/or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT-240329\" },\n ordId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n clOrdId: { type: \"string\" },\n newSz: { type: \"string\", description: \"New number of contracts\" },\n newPx: { type: \"string\", description: \"New price\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n }),\n privateRateLimit(\"futures_amend_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── futures_batch_orders ──────────────────────────────────────────────────\n // Unique to futures: batch place only (no cancel/amend action dispatch).\n {\n name: \"futures_batch_orders\",\n module: \"futures\",\n description:\n \"[CAUTION] Batch place up to 20 FUTURES delivery orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description:\n \"Array (max 20): {instId,tdMode,side,ordType,sz,px?,posSide?,reduceOnly?,clOrdId?,tpTriggerPx?,tpOrdPx?,slTriggerPx?,slOrdPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const body = orders.map((order: unknown) => {\n const o = asRecord(order);\n const attachAlgoOrds = buildAttachAlgoOrds(o);\n const reduceOnly = o.reduceOnly;\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: requireString(o, \"tdMode\"),\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n posSide: readString(o, \"posSide\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n });\n const response = await context.client.privatePost(\n \"/api/v5/trade/batch-orders\",\n body,\n privateRateLimit(\"futures_batch_orders\", 60),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport { asRecord, compactObject, normalizeResponse, readBoolean, readNumber, readString, requireString } from \"./helpers.js\";\nimport { publicRateLimit, OKX_CANDLE_BARS, OKX_INST_TYPES } from \"./common.js\";\n\nexport function registerMarketTools(): ToolSpec[] {\n return [\n {\n name: \"market_get_ticker\",\n module: \"market\",\n description:\n \"Get ticker data for a single instrument.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT, BTC-USDT-SWAP\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/ticker\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_ticker\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_tickers\",\n module: \"market\",\n description:\n \"Get ticker data for all instruments of a given type.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...OKX_INST_TYPES],\n },\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD. Required for OPTION\",\n },\n instFamily: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/tickers\",\n compactObject({\n instType: requireString(args, \"instType\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_tickers\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_orderbook\",\n module: \"market\",\n description:\n \"Get the order book (bids/asks) for an instrument.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n sz: {\n type: \"number\",\n description: \"Depth per side, default 1, max 400\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/books\",\n compactObject({\n instId: requireString(args, \"instId\"),\n sz: readNumber(args, \"sz\"),\n }),\n publicRateLimit(\"market_get_orderbook\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_candles\",\n module: \"market\",\n description:\n \"Get candlestick (OHLCV) data for an instrument. history=false (default): recent candles up to 1440 bars; history=true: older historical data.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n bar: {\n type: \"string\",\n enum: [...OKX_CANDLE_BARS],\n description: \"Default 1m\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n history: {\n type: \"boolean\",\n description: \"true=older historical data beyond recent window\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n const path = isHistory\n ? \"/api/v5/market/history-candles\"\n : \"/api/v5/market/candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"market_get_candles\", 40),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_instruments\",\n module: \"market\",\n description:\n \"Get tradable instruments for a given type. Returns contract specs: min order size, lot size, tick size, contract value, settlement currency, listing/expiry time. Essential before placing orders.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...OKX_INST_TYPES],\n },\n instId: {\n type: \"string\",\n description: \"Filter by ID, e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"Required for OPTION, e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_instruments\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_funding_rate\",\n module: \"market\",\n description:\n \"Get funding rate for a SWAP instrument. history=false (default): current rate + next estimated rate; history=true: historical rates.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"SWAP instrument, e.g. BTC-USDT-SWAP\",\n },\n history: {\n type: \"boolean\",\n description: \"true=fetch historical rates\",\n },\n after: {\n type: \"string\",\n description: \"Pagination (history): before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination (history): after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"History records (default 20, max 100)\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n if (isHistory) {\n const response = await context.client.publicGet(\n \"/api/v5/public/funding-rate-history\",\n compactObject({\n instId: requireString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n publicRateLimit(\"market_get_funding_rate\", 20),\n );\n return normalizeResponse(response);\n }\n const response = await context.client.publicGet(\n \"/api/v5/public/funding-rate\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_funding_rate\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_mark_price\",\n module: \"market\",\n description:\n \"Get mark price for SWAP, FUTURES, or MARGIN instruments. Used for liquidation calculations and unrealized PnL.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/mark-price\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_mark_price\", 10),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_trades\",\n module: \"market\",\n description:\n \"Get recent trades for an instrument. Default 20 records, max 500.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n limit: {\n type: \"number\",\n description: \"Default 20, max 500\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/trades\",\n compactObject({\n instId: requireString(args, \"instId\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n publicRateLimit(\"market_get_trades\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_index_ticker\",\n module: \"market\",\n description:\n \"Get index ticker data (e.g. BTC-USD, ETH-USD index prices). Independent of any single exchange.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD. Omit for all indices\",\n },\n quoteCcy: {\n type: \"string\",\n description: \"e.g. USD or USDT\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/index-tickers\",\n compactObject({\n instId: readString(args, \"instId\"),\n quoteCcy: readString(args, \"quoteCcy\"),\n }),\n publicRateLimit(\"market_get_index_ticker\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_index_candles\",\n module: \"market\",\n description:\n \"Get candlestick data for an index (e.g. BTC-USD index). history=false: recent up to 1440 bars; history=true: older data.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"Index ID, e.g. BTC-USD\",\n },\n bar: {\n type: \"string\",\n enum: [...OKX_CANDLE_BARS],\n description: \"Default 1m\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n history: {\n type: \"boolean\",\n description: \"true=older historical data\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n const path = isHistory\n ? \"/api/v5/market/history-index-candles\"\n : \"/api/v5/market/index-candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"market_get_index_candles\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_price_limit\",\n module: \"market\",\n description:\n \"Get the current price limit (upper and lower bands) for a SWAP or FUTURES instrument. Orders outside these limits will be rejected.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"SWAP or FUTURES ID, e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/price-limit\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_price_limit\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_open_interest\",\n module: \"market\",\n description:\n \"Get open interest for SWAP, FUTURES, or OPTION instruments. Useful for gauging market sentiment and positioning.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/open-interest\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_open_interest\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_stock_tokens\",\n module: \"market\",\n description:\n \"Get all stock token instruments (instCategory=3). Stock tokens track real-world stock prices on OKX (e.g. AAPL-USDT-SWAP). Filters client-side by instCategory=3.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"SWAP\"],\n description: \"Instrument type. Default: SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"Optional: filter by specific instrument ID, e.g. AAPL-USDT-SWAP\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n const instId = readString(args, \"instId\");\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({ instType, instId }),\n publicRateLimit(\"market_get_stock_tokens\", 20),\n );\n const data = response.data;\n const filtered = Array.isArray(data)\n ? data.filter((item) => (item as Record<string, unknown>).instCategory === \"3\")\n : data;\n return normalizeResponse({ ...response, data: filtered });\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerOptionAlgoTools(): ToolSpec[] {\n return [\n {\n name: \"option_place_algo_order\",\n module: \"option\",\n description:\n \"Place OPTION TP/SL algo order (conditional/oco). [CAUTION] Executes real trades. conditional=single TP/SL; oco=TP+SL pair. -1=market.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD-241227-50000-C\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=buyer full premium; cross/isolated=seller margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"conditional=single TP/SL or both; oco=TP+SL pair (first trigger cancels other)\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts count (NOT USDT). Use market_get_instruments for ctVal.\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n tpTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n slTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in contracts, quote_ccy: sz in USDT (may not be supported for options)\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = readBoolean(args, \"reduceOnly\");\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n tpTriggerPxType: readString(args, \"tpTriggerPxType\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n slTriggerPxType: readString(args, \"slTriggerPxType\"),\n reduceOnly: reduceOnly !== undefined ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"option_place_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_amend_algo_order\",\n module: \"option\",\n description:\n \"Amend a pending OPTION algo order (modify TP/SL prices or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\", description: \"New contracts count\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"option_amend_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_cancel_algo_orders\",\n module: \"option\",\n description:\n \"Cancel OPTION algo orders (TP/SL). Each item: {algoId, instId}.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array of {algoId, instId} to cancel.\",\n items: {\n type: \"object\",\n properties: {\n algoId: {\n type: \"string\",\n description: \"Algo order ID\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD-241227-50000-C\",\n },\n },\n required: [\"algoId\", \"instId\"],\n },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n orders,\n privateRateLimit(\"option_cancel_algo_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_algo_orders\",\n module: \"option\",\n description:\n \"Query pending or completed OPTION algo orders (TP/SL, OCO).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"Filter by type; omit for all\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n algoId: {\n type: \"string\",\n description: \"Filter by algo order ID\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: return older\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: return newer\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description: \"When history: effective|canceled|order_failed\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"option_get_algo_orders\", 20),\n );\n return normalizeResponse(response);\n }\n\n // No filter: fetch conditional + oco in parallel and merge\n const [r1, r2] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"option_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"option_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerOptionTools(): ToolSpec[] {\n return [\n {\n name: \"option_place_order\",\n module: \"option\",\n description:\n \"Place OPTION order. instId: {uly}-{expiry}-{strike}-C/P, e.g. BTC-USD-241227-50000-C. [CAUTION] Executes real trades.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD-241227-50000-C\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=buyer full premium; cross/isolated=seller margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market=no px; limit/fok/ioc=px req; post_only=maker\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts count (NOT USDT). Use market_get_instruments for ctVal.\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Reduce/close only\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const attachAlgoOrds = buildAttachAlgoOrds(args);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"option_place_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_cancel_order\",\n module: \"option\",\n description:\n \"Cancel an unfilled OPTION order. Provide ordId or clOrdId.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"option_cancel_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_batch_cancel\",\n module: \"option\",\n description:\n \"[CAUTION] Batch cancel up to 20 OPTION orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"option_batch_cancel\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_amend_order\",\n module: \"option\",\n description:\n \"Amend an unfilled OPTION order (price and/or size). Provide ordId or clOrdId.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\" },\n newSz: { type: \"string\", description: \"New contracts count\" },\n newPx: { type: \"string\", description: \"New price\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n }),\n privateRateLimit(\"option_amend_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_order\",\n module: \"option\",\n description:\n \"Get details of a single OPTION order by ordId or clOrdId.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n clOrdId: { type: \"string\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"option_get_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_orders\",\n module: \"option\",\n description:\n \"List OPTION orders. status: live=pending (default), history=7d, archive=3mo.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"live\", \"history\", \"archive\"],\n description: \"live=pending (default), history=7d, archive=3mo\",\n },\n uly: { type: \"string\", description: \"Underlying filter, e.g. BTC-USD\" },\n instId: { type: \"string\", description: \"Instrument filter\" },\n ordType: { type: \"string\", description: \"Order type filter\" },\n state: { type: \"string\", description: \"canceled|filled\" },\n after: { type: \"string\", description: \"Cursor: return older\" },\n before: { type: \"string\", description: \"Cursor: return newer\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"live\";\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"OPTION\",\n uly: readString(args, \"uly\"),\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"option_get_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_positions\",\n module: \"option\",\n description:\n \"Get current OPTION positions including Greeks (delta, gamma, theta, vega).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"Filter by specific contract\" },\n uly: { type: \"string\", description: \"Filter by underlying, e.g. BTC-USD\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n }),\n privateRateLimit(\"option_get_positions\", 10),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_fills\",\n module: \"option\",\n description:\n \"Get OPTION fill history. archive=false: last 3 days (default); archive=true: up to 3 months.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instId: { type: \"string\", description: \"Instrument filter\" },\n ordId: { type: \"string\", description: \"Order ID filter\" },\n after: { type: \"string\", description: \"Cursor: return older\" },\n before: { type: \"string\", description: \"Cursor: return newer\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"option_get_fills\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_instruments\",\n module: \"option\",\n description:\n \"List available OPTION contracts for a given underlying (option chain). Use to find valid instIds before placing orders.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD or ETH-USD\",\n },\n expTime: {\n type: \"string\",\n description: \"Filter by expiry date, e.g. 241227\",\n },\n },\n required: [\"uly\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({\n instType: \"OPTION\",\n uly: requireString(args, \"uly\"),\n expTime: readString(args, \"expTime\"),\n }),\n privateRateLimit(\"option_get_instruments\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_greeks\",\n module: \"option\",\n description:\n \"Get implied volatility and Greeks (delta, gamma, theta, vega) for OPTION contracts by underlying.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD or ETH-USD\",\n },\n expTime: {\n type: \"string\",\n description: \"Filter by expiry date, e.g. 241227\",\n },\n },\n required: [\"uly\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/opt-summary\",\n compactObject({\n uly: requireString(args, \"uly\"),\n expTime: readString(args, \"expTime\"),\n }),\n privateRateLimit(\"option_get_greeks\", 20),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerSpotTradeTools(): ToolSpec[] {\n return [\n {\n name: \"spot_place_order\",\n module: \"spot\",\n description:\n \"Place a spot order. Attach TP/SL via tpTriggerPx/slTriggerPx. [CAUTION] Executes real trades.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=regular spot, cross/isolated=margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok(all-or-cancel)|ioc(partial fill)\",\n },\n sz: {\n type: \"string\",\n description: \"Buy market: quote amount, all others: base amount\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in base (e.g. BTC), quote_ccy: sz in quote (e.g. USDT)\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price, -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price, -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const attachAlgoOrds = buildAttachAlgoOrds(args);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n px: readString(args, \"px\"),\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"spot_place_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_cancel_order\",\n module: \"spot\",\n description:\n \"Cancel an unfilled spot order.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"spot_cancel_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_amend_order\",\n module: \"spot\",\n description:\n \"Amend an unfilled spot order (modify price or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n },\n newSz: {\n type: \"string\",\n description: \"New size in base currency\",\n },\n newPx: {\n type: \"string\",\n description: \"New price\",\n },\n newClOrdId: {\n type: \"string\",\n description: \"Replacement client order ID\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n newClOrdId: readString(args, \"newClOrdId\"),\n }),\n privateRateLimit(\"spot_amend_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_get_orders\",\n module: \"spot\",\n description:\n \"Query spot orders. status: open(active)|history(7d)|archive(3mo).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n description: \"Order type filter\",\n },\n state: {\n type: \"string\",\n description: \"canceled|filled\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: older than this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: newer than this order ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"spot_get_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_place_algo_order\",\n module: \"spot\",\n description:\n \"Place a spot algo order: TP/SL (conditional/oco) or trailing stop (move_order_stop). [CAUTION] Executes real trades.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash(default)=spot, cross/isolated=margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"conditional=single TP/SL, oco=TP+SL pair, move_order_stop=trailing stop\",\n },\n sz: {\n type: \"string\",\n description: \"Quantity in base currency\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price (conditional/oco only)\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price, -1=market (conditional/oco only)\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price (conditional/oco only)\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price, -1=market (conditional/oco only)\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in base (e.g. BTC), quote_ccy: sz in quote (e.g. USDT)\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio e.g. 0.01=1%, use ratio or spread (move_order_stop only)\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units, use ratio or spread (move_order_stop only)\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price, trailing starts when market hits this (move_order_stop only)\",\n },\n },\n required: [\"instId\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: readString(args, \"tdMode\") ?? \"cash\",\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n callbackRatio: readString(args, \"callbackRatio\"),\n callbackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"spot_place_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_amend_algo_order\",\n module: \"spot\",\n description:\n \"Amend a pending spot algo order (modify TP/SL prices or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT\" },\n algoId: { type: \"string\" },\n newSz: { type: \"string\", description: \"New size in base currency\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price, -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price, -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"spot_amend_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_cancel_algo_order\",\n module: \"spot\",\n description:\n \"Cancel a spot algo order (TP/SL).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n algoId: {\n type: \"string\",\n },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n [\n {\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n },\n ],\n privateRateLimit(\"spot_cancel_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_get_algo_orders\",\n module: \"spot\",\n description:\n \"Query spot algo orders (TP/SL) — pending or history.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default), history=completed\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"Filter by type\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: older than this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: newer than this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description: \"Required for history. effective=triggered, canceled, order_failed. Default: effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"spot_get_algo_orders\", 20),\n );\n return normalizeResponse(response);\n }\n\n // ordType is required by OKX; fetch all three spot types in parallel and merge\n const [r1, r2, r3] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"move_order_stop\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ...((r3.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n {\n name: \"spot_get_fills\",\n module: \"spot\",\n description:\n \"Get spot transaction fills. archive=false(3d, default)|true(up to 3mo).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3mo, false=3d (default)\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordId: {\n type: \"string\",\n description: \"Order ID filter\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: older than this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: newer than this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100 or 20 for archive)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"spot_get_fills\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_batch_orders\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch place/cancel/amend up to 20 spot orders. action: place|cancel|amend.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"place\", \"cancel\", \"amend\"],\n },\n orders: {\n type: \"array\",\n description:\n \"Array (max 20). place: {instId,side,ordType,sz,tdMode(default cash; use cross for unified/margin accounts),px?,clOrdId?,tpTriggerPx?,tpOrdPx?,slTriggerPx?,slOrdPx?}. cancel: {instId,ordId|clOrdId}. amend: {instId,ordId|clOrdId,newSz?,newPx?}.\",\n items: {\n type: \"object\",\n },\n },\n },\n required: [\"action\", \"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"place\", \"cancel\", \"amend\"]);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const endpointMap: Record<string, string> = {\n place: \"/api/v5/trade/batch-orders\",\n cancel: \"/api/v5/trade/cancel-batch-orders\",\n amend: \"/api/v5/trade/amend-batch-orders\",\n };\n const body: Record<string, unknown>[] =\n action === \"place\"\n ? orders.map((order: unknown) => {\n const o = asRecord(order);\n const attachAlgoOrds = buildAttachAlgoOrds(o);\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: readString(o, \"tdMode\") ?? \"cash\",\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n })\n : (orders as Record<string, unknown>[]);\n const response = await context.client.privatePost(\n endpointMap[action],\n body,\n privateRateLimit(\"spot_batch_orders\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_get_order\",\n module: \"spot\",\n description:\n \"Get details of a single spot order.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"spot_get_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_batch_amend\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch amend up to 20 unfilled spot orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?, newSz?, newPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"spot_batch_amend\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_batch_cancel\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch cancel up to 20 spot orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"spot_batch_cancel\", 60),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { buildContractTradeTools } from \"./contract-trade.js\";\n\nexport function registerSwapTradeTools(): ToolSpec[] {\n const common = buildContractTradeTools({\n prefix: \"swap\",\n module: \"swap\",\n label: \"SWAP/FUTURES\",\n instTypes: [\"SWAP\", \"FUTURES\"],\n instIdExample: \"e.g. BTC-USDT-SWAP\",\n });\n\n return [\n ...common,\n\n // ── swap_amend_algo_order ─────────────────────────────────────────────────\n // Unique to swap: amend a pending TP/SL algo order attached to a position.\n {\n name: \"swap_amend_algo_order\",\n module: \"swap\",\n description:\n \"Amend a pending SWAP/FUTURES algo order (modify TP/SL prices or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT-SWAP\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\", description: \"New contracts count\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"swap_amend_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── swap_batch_orders ─────────────────────────────────────────────────────\n // Unique to swap: 3-in-1 batch tool (place / cancel / amend via action param).\n {\n name: \"swap_batch_orders\",\n module: \"swap\",\n description:\n \"[CAUTION] Batch place/cancel/amend SWAP/FUTURES orders (max 20). action=place|cancel|amend.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"place\", \"cancel\", \"amend\"],\n },\n orders: {\n type: \"array\",\n description:\n \"Max 20. place:{instId,tdMode,side,ordType,sz,...}; cancel:{instId,ordId|clOrdId}; amend:{instId,ordId|clOrdId,newSz?,newPx?}.\",\n items: { type: \"object\" },\n },\n },\n required: [\"action\", \"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"place\", \"cancel\", \"amend\"]);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const endpointMap: Record<string, string> = {\n place: \"/api/v5/trade/batch-orders\",\n cancel: \"/api/v5/trade/cancel-batch-orders\",\n amend: \"/api/v5/trade/amend-batch-orders\",\n };\n const body: Record<string, unknown>[] =\n action === \"place\"\n ? orders.map((order: unknown) => {\n const o = asRecord(order);\n const attachAlgoOrds = buildAttachAlgoOrds(o);\n const reduceOnly = o.reduceOnly;\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: requireString(o, \"tdMode\"),\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n posSide: readString(o, \"posSide\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n })\n : (orders as Record<string, unknown>[]);\n const response = await context.client.privatePost(\n endpointMap[action],\n body,\n privateRateLimit(\"swap_batch_orders\", 60),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { OkxConfig } from \"../config.js\";\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport { MODULES, type ModuleId } from \"../constants.js\";\nimport { registerAccountTools } from \"./account.js\";\nimport { registerAlgoTradeTools, registerFuturesAlgoTools } from \"./algo-trade.js\";\nimport { registerAuditTools } from \"./audit.js\";\nimport { registerBotTools } from \"./bot/index.js\";\nimport { registerAllEarnTools } from \"./earn/index.js\";\nimport { registerFuturesTools } from \"./futures-trade.js\";\nimport { registerIndicatorTools } from \"./indicator.js\";\nimport { registerMarketTools } from \"./market.js\";\nimport { registerOptionAlgoTools } from \"./option-algo-trade.js\";\nimport { registerOptionTools } from \"./option-trade.js\";\nimport { registerSpotTradeTools } from \"./spot-trade.js\";\nimport { registerSwapTradeTools } from \"./swap-trade.js\";\nimport type { ToolSpec, ToolArgs } from \"./types.js\";\n\n/**\n * Return specs for every registered tool across all modules.\n *\n * Exported for external consumers (e.g. diagnostic / introspection tooling)\n * that need to enumerate tool names, schemas, or module membership without\n * instantiating a full client. Not all callers use every spec — consumers\n * should filter as needed.\n */\nexport function allToolSpecs(): ToolSpec[] {\n return [\n ...registerMarketTools(),\n ...registerIndicatorTools(),\n ...registerSpotTradeTools(),\n ...registerSwapTradeTools(),\n ...registerFuturesTools(),\n ...registerFuturesAlgoTools(),\n ...registerOptionTools(),\n ...registerOptionAlgoTools(),\n ...registerAlgoTradeTools(),\n ...registerAccountTools(),\n ...registerBotTools(),\n ...registerAllEarnTools(),\n ...registerAuditTools(),\n ];\n}\n\nexport function buildTools(config: OkxConfig): ToolSpec[] {\n const enabledModules = new Set(config.modules);\n const tools = allToolSpecs().filter((tool) => enabledModules.has(tool.module));\n if (!config.readOnly) {\n return tools;\n }\n return tools.filter((tool) => !tool.isWrite);\n}\n\nexport interface ToolResult {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}\n\nexport type ToolRunner = (toolName: string, args: ToolArgs) => Promise<ToolResult>;\n\n/**\n * Create a function that can call any registered tool by name.\n * All modules are enabled regardless of config.modules, since CLI\n * controls which commands to expose at the routing level.\n */\nexport function createToolRunner(client: OkxRestClient, config: OkxConfig): ToolRunner {\n const fullConfig: OkxConfig = { ...config, modules: [...MODULES] as ModuleId[], readOnly: false };\n const tools = allToolSpecs();\n const toolMap = new Map<string, ToolSpec>(tools.map((t) => [t.name, t]));\n\n return async (toolName: string, args: ToolArgs): Promise<ToolResult> => {\n const tool = toolMap.get(toolName);\n if (!tool) throw new Error(`Unknown tool: ${toolName}`);\n const result = await tool.handler(args, { config: fullConfig, client });\n return result as ToolResult;\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport type { OkxConfig } from \"../config.js\";\nimport type { ModuleId } from \"../constants.js\";\n\nexport type ToolArgs = Record<string, unknown>;\n\nexport type JsonSchema = Tool[\"inputSchema\"];\n\nexport interface ToolContext {\n config: OkxConfig;\n client: OkxRestClient;\n}\n\nexport interface ToolSpec {\n name: string;\n module: ModuleId;\n description: string;\n inputSchema: JsonSchema;\n isWrite: boolean;\n handler: (args: ToolArgs, context: ToolContext) => Promise<unknown>;\n}\n\nexport function toMcpTool(tool: ToolSpec): Tool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n readOnlyHint: !tool.isWrite,\n destructiveHint: tool.isWrite,\n idempotentHint: !tool.isWrite,\n openWorldHint: true,\n },\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse, stringify } from \"smol-toml\";\nimport { ConfigError } from \"../utils/errors.js\";\n\nexport { stringify as tomlStringify };\n\nexport interface OkxProfile {\n api_key?: string;\n secret_key?: string;\n passphrase?: string;\n base_url?: string;\n timeout_ms?: number;\n demo?: boolean;\n site?: string;\n proxy_url?: string;\n}\n\nexport interface OkxTomlConfig {\n default_profile?: string;\n profiles: Record<string, OkxProfile>;\n}\n\nexport function configFilePath(): string {\n return join(homedir(), \".okx\", \"config.toml\");\n}\n\n/**\n * Read the full config from ~/.okx/config.toml.\n * Returns a config with empty profiles if the file does not exist.\n */\nexport function readFullConfig(): OkxTomlConfig {\n const path = configFilePath();\n if (!existsSync(path)) return { profiles: {} };\n const raw = readFileSync(path, \"utf-8\");\n try {\n return parse(raw) as unknown as OkxTomlConfig;\n } catch (err) {\n throw new ConfigError(\n `Failed to parse ${path}: ${err instanceof Error ? err.message : String(err)}`,\n \"If your passphrase or keys contain special characters:\\n\" +\n \" - Contains # \\\\ \\\" → use single quotes: passphrase = 'your#pass'\\n\" +\n \" - Contains ' → use double quotes: passphrase = \\\"your'pass\\\"\\n\" +\n \" - Contains both → use triple quotes: passphrase = '''your'#pass'''\\n\" +\n \"Or re-run: okx config init\",\n );\n }\n}\n\n/**\n * Read a profile from ~/.okx/config.toml.\n * Returns an empty object if the file does not exist or the profile is not found.\n */\nexport function readTomlProfile(profileName?: string): OkxProfile {\n const config = readFullConfig();\n const name = profileName ?? config.default_profile ?? \"default\";\n return config.profiles?.[name] ?? {};\n}\n\nconst CONFIG_HEADER =\n \"# OKX Trade Kit Configuration\\n\" +\n \"# If editing manually, wrap values containing special chars in quotes:\\n\" +\n \"# passphrase = 'value' (if value contains # \\\\ \\\")\\n\" +\n \"# passphrase = \\\"value\\\" (if value contains ')\\n\" +\n \"# passphrase = '''value''' (if value contains both)\\n\\n\";\n\n/**\n * Write the full config to ~/.okx/config.toml.\n * Creates the parent directory if it does not exist.\n */\nexport function writeFullConfig(config: OkxTomlConfig): void {\n const path = configFilePath();\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, CONFIG_HEADER + stringify(config as unknown as Record<string, unknown>), \"utf-8\");\n}\n","import { BOT_DEFAULT_SUB_MODULES, BOT_SUB_MODULE_IDS, EARN_SUB_MODULE_IDS, DEFAULT_MODULES, DEFAULT_SOURCE_TAG, MODULES, OKX_SITES, SITE_IDS, type ModuleId, type SiteId } from \"./constants.js\";\nimport { ConfigError } from \"./utils/errors.js\";\nimport { readTomlProfile } from \"./config/toml.js\";\nimport type { OkxProfile } from \"./config/toml.js\";\n\nexport interface CliOptions {\n modules?: string;\n readOnly: boolean;\n demo: boolean;\n profile?: string;\n site?: string;\n userAgent?: string;\n sourceTag?: string;\n verbose?: boolean;\n}\n\nexport interface OkxConfig {\n apiKey?: string;\n secretKey?: string;\n passphrase?: string;\n hasAuth: boolean;\n baseUrl: string;\n timeoutMs: number;\n modules: ModuleId[];\n readOnly: boolean;\n demo: boolean;\n site: SiteId;\n userAgent?: string;\n sourceTag: string;\n proxyUrl?: string;\n verbose: boolean;\n}\n\n/**\n * Expand a single module shorthand into its concrete sub-module IDs.\n * Returns the expanded IDs, or null if the input is not a shorthand.\n */\nfunction expandShorthand(moduleId: string): ModuleId[] | null {\n // \"all\" expands to every known module (base + bot sub-modules + earn sub-modules)\n if (moduleId === \"all\") return [...MODULES];\n if (moduleId === \"earn\" || moduleId === \"earn.all\") return [...EARN_SUB_MODULE_IDS];\n if (moduleId === \"bot\") return [...BOT_DEFAULT_SUB_MODULES];\n if (moduleId === \"bot.all\") return [...BOT_SUB_MODULE_IDS];\n return null;\n}\n\nfunction parseModuleList(rawModules?: string): ModuleId[] {\n if (!rawModules || rawModules.trim().length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const trimmed = rawModules.trim().toLowerCase();\n const requested = trimmed.split(\",\").map((s) => s.trim()).filter(Boolean);\n if (requested.length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const deduped = new Set<ModuleId>();\n for (const moduleId of requested) {\n const expanded = expandShorthand(moduleId);\n if (expanded) {\n expanded.forEach((sub) => deduped.add(sub));\n continue;\n }\n if (!MODULES.includes(moduleId as ModuleId)) {\n throw new ConfigError(\n `Unknown module \"${moduleId}\".`,\n `Use one of: ${MODULES.join(\", \")}, \"earn\", \"earn.all\", \"bot\", \"bot.all\", or \"all\".`,\n );\n }\n deduped.add(moduleId as ModuleId);\n }\n\n return Array.from(deduped);\n}\n\nfunction loadCredentials(toml: OkxProfile): { apiKey?: string; secretKey?: string; passphrase?: string; hasAuth: boolean } {\n const apiKey = process.env.OKX_API_KEY?.trim() ?? toml.api_key;\n const secretKey = process.env.OKX_SECRET_KEY?.trim() ?? toml.secret_key;\n const passphrase = process.env.OKX_PASSPHRASE?.trim() ?? toml.passphrase;\n const hasAuth = Boolean(apiKey && secretKey && passphrase);\n const partialAuth = Boolean(apiKey) || Boolean(secretKey) || Boolean(passphrase);\n if (partialAuth && !hasAuth) {\n throw new ConfigError(\n \"Partial API credentials detected.\",\n \"Set OKX_API_KEY, OKX_SECRET_KEY and OKX_PASSPHRASE together (env vars or config.toml profile).\",\n );\n }\n return { apiKey, secretKey, passphrase, hasAuth };\n}\n\nfunction resolveSite(cliSite?: string, tomlSite?: string): SiteId {\n const rawSite = cliSite?.trim() ?? process.env.OKX_SITE?.trim() ?? tomlSite ?? \"global\";\n if (!SITE_IDS.includes(rawSite as SiteId)) {\n throw new ConfigError(\n `Unknown site \"${rawSite}\".`,\n `Use one of: ${SITE_IDS.join(\", \")}.`,\n );\n }\n return rawSite as SiteId;\n}\n\nfunction resolveBaseUrl(site: SiteId, tomlBaseUrl?: string): string {\n const rawBaseUrl =\n process.env.OKX_API_BASE_URL?.trim() ?? tomlBaseUrl ?? OKX_SITES[site].apiBaseUrl;\n if (!rawBaseUrl.startsWith(\"http://\") && !rawBaseUrl.startsWith(\"https://\")) {\n throw new ConfigError(\n `Invalid base URL \"${rawBaseUrl}\".`,\n \"OKX_API_BASE_URL must start with http:// or https://\",\n );\n }\n return rawBaseUrl.replace(/\\/+$/, \"\");\n}\n\n/**\n * Credential priority (highest to lowest):\n * 1. Environment variables (OKX_API_KEY / OKX_SECRET_KEY / OKX_PASSPHRASE)\n * 2. ~/.okx/config.toml — profile selected by cli.profile or default_profile\n *\n * Site priority (highest to lowest):\n * 1. cli.site arg\n * 2. OKX_SITE env var\n * 3. toml profile site field\n * 4. default: \"global\"\n *\n * Base URL priority (highest to lowest):\n * 1. OKX_API_BASE_URL env var (explicit override — advanced users)\n * 2. toml profile base_url\n * 3. site's apiBaseUrl (auto-derived from site)\n */\nexport function loadConfig(cli: CliOptions): OkxConfig {\n const toml = readTomlProfile(cli.profile);\n const creds = loadCredentials(toml);\n\n const demo =\n cli.demo ||\n process.env.OKX_DEMO === \"1\" ||\n process.env.OKX_DEMO === \"true\" ||\n (toml.demo ?? false);\n\n const site = resolveSite(cli.site, toml.site);\n const baseUrl = resolveBaseUrl(site, toml.base_url);\n\n const rawTimeout = process.env.OKX_TIMEOUT_MS\n ? Number(process.env.OKX_TIMEOUT_MS)\n : (toml.timeout_ms ?? 15_000);\n if (!Number.isFinite(rawTimeout) || rawTimeout <= 0) {\n throw new ConfigError(\n `Invalid timeout value \"${rawTimeout}\".`,\n \"Set OKX_TIMEOUT_MS as a positive integer in milliseconds.\",\n );\n }\n\n // proxy: toml profile only (no env vars — keep it explicit)\n const rawProxyUrl = toml.proxy_url?.trim();\n if (rawProxyUrl && !rawProxyUrl.startsWith(\"http://\") && !rawProxyUrl.startsWith(\"https://\")) {\n throw new ConfigError(\n `Invalid proxy URL \"${rawProxyUrl}\".`,\n \"proxy_url must start with http:// or https://. SOCKS proxies are not supported.\",\n );\n }\n\n return {\n ...creds,\n baseUrl,\n timeoutMs: Math.floor(rawTimeout),\n modules: parseModuleList(cli.modules),\n readOnly: cli.readOnly,\n demo,\n site,\n userAgent: cli.userAgent,\n sourceTag: cli.sourceTag ?? DEFAULT_SOURCE_TAG,\n proxyUrl: rawProxyUrl || undefined,\n verbose: cli.verbose ?? false,\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CACHE_FILE = join(homedir(), \".okx\", \"update-check.json\");\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface PackageCache {\n latestVersion: string;\n checkedAt: number;\n}\n\ntype UpdateCache = Record<string, PackageCache>;\n\nfunction readCache(): UpdateCache {\n try {\n if (existsSync(CACHE_FILE)) {\n return JSON.parse(readFileSync(CACHE_FILE, \"utf-8\")) as UpdateCache;\n }\n } catch {\n // ignore corrupt cache\n }\n return {};\n}\n\nfunction writeCache(cache: UpdateCache): void {\n try {\n mkdirSync(join(homedir(), \".okx\"), { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2), \"utf-8\");\n } catch {\n // ignore write failures\n }\n}\n\nfunction isNewerVersion(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v\n .replace(/^v/, \"\")\n .split(\".\")\n .map((n) => parseInt(n, 10));\n const [cMaj, cMin, cPat] = parse(current);\n const [lMaj, lMin, lPat] = parse(latest);\n if (lMaj !== cMaj) return lMaj > cMaj;\n if (lMin !== cMin) return lMin > cMin;\n return lPat > cPat;\n}\n\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`, {\n signal: controller.signal,\n headers: { accept: \"application/json\" },\n });\n clearTimeout(timeout);\n if (!res.ok) return null;\n const data = (await res.json()) as { version: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction refreshCacheInBackground(packageName: string): void {\n fetchLatestVersion(packageName)\n .then((latest) => {\n if (!latest) return;\n const cache = readCache();\n cache[packageName] = { latestVersion: latest, checkedAt: Date.now() };\n writeCache(cache);\n })\n .catch(() => {\n // ignore\n });\n}\n\n/**\n * Check if an update is available and print a notice to stderr.\n * Uses a local cache (~/.okx/update-check.json) so network calls happen\n * at most once per 24 hours, in the background without blocking startup.\n */\nexport function checkForUpdates(packageName: string, currentVersion: string): void {\n const cache = readCache();\n const entry = cache[packageName];\n\n if (entry && isNewerVersion(currentVersion, entry.latestVersion)) {\n process.stderr.write(\n `\\nUpdate available for ${packageName}: ${currentVersion} → ${entry.latestVersion}\\n` +\n `Run: npm install -g ${packageName}\\n\\n`,\n );\n }\n\n if (!entry || Date.now() - entry.checkedAt > CHECK_INTERVAL_MS) {\n refreshCacheInBackground(packageName);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\";\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\n\nconst SENSITIVE_KEY_PATTERN = /apiKey|secretKey|passphrase|password|secret/i;\n\nfunction sanitize(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(sanitize);\n }\n if (typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (SENSITIVE_KEY_PATTERN.test(k)) {\n result[k] = \"[REDACTED]\";\n } else {\n result[k] = sanitize(v);\n }\n }\n return result;\n }\n return value;\n}\n\nexport interface LogEntry {\n timestamp: string;\n level: Uppercase<LogLevel>;\n tool: string;\n durationMs: number;\n params: unknown;\n result: unknown;\n}\n\nexport class TradeLogger {\n private readonly logLevel: LogLevel;\n private readonly logDir: string;\n\n constructor(logLevel: LogLevel = \"info\", logDir?: string) {\n this.logLevel = logLevel;\n this.logDir = logDir ?? path.join(os.homedir(), \".okx\", \"logs\");\n }\n\n getLogPath(date?: Date): string {\n const d = date ?? new Date();\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n return path.join(this.logDir, `trade-${yyyy}-${mm}-${dd}.log`);\n }\n\n log(\n level: LogLevel,\n tool: string,\n params: unknown,\n result: unknown,\n durationMs: number,\n ): void {\n if (LOG_LEVEL_PRIORITY[level] > LOG_LEVEL_PRIORITY[this.logLevel]) {\n return;\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level: level.toUpperCase() as Uppercase<LogLevel>,\n tool,\n durationMs,\n params: sanitize(params),\n result: sanitize(result),\n };\n\n try {\n fs.mkdirSync(this.logDir, { recursive: true });\n fs.appendFileSync(this.getLogPath(), JSON.stringify(entry) + \"\\n\", \"utf8\");\n } catch {\n // silent fail\n }\n }\n\n static sanitize(params: unknown): unknown {\n return sanitize(params);\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\nimport { configFilePath } from \"./config/toml.js\";\n\nexport type ClientId = \"claude-desktop\" | \"cursor\" | \"windsurf\" | \"vscode\" | \"claude-code\";\n\nexport interface SetupOptions {\n client: ClientId;\n profile?: string;\n modules?: string;\n}\n\nexport const CLIENT_NAMES: Record<ClientId, string> = {\n \"claude-desktop\": \"Claude Desktop\",\n cursor: \"Cursor\",\n windsurf: \"Windsurf\",\n vscode: \"VS Code\",\n \"claude-code\": \"Claude Code CLI\",\n};\n\nexport const SUPPORTED_CLIENTS = Object.keys(CLIENT_NAMES) as ClientId[];\n\nfunction appData(): string {\n return process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n}\n\nconst CLAUDE_CONFIG_FILE = \"claude_desktop_config.json\";\n\n/**\n * Detect Microsoft Store installation of Claude Desktop on Windows.\n * MS Store apps use a sandboxed path:\n * %LOCALAPPDATA%\\Packages\\Claude_<hash>\\LocalCache\\Roaming\\Claude\\\n * Returns the config file path if found, null otherwise.\n */\nfunction findMsStoreClaudePath(): string | null {\n const localAppData = process.env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\");\n const packagesDir = path.join(localAppData, \"Packages\");\n try {\n const entries = fs.readdirSync(packagesDir);\n const claudePkg = entries.find((e) => e.startsWith(\"Claude_\"));\n if (claudePkg) {\n const configPath = path.join(\n packagesDir, claudePkg, \"LocalCache\", \"Roaming\", \"Claude\", CLAUDE_CONFIG_FILE,\n );\n // Return if the config file or its parent directory already exists\n if (fs.existsSync(configPath) || fs.existsSync(path.dirname(configPath))) {\n return configPath;\n }\n }\n } catch {\n // Packages dir may not exist or may not be readable\n }\n return null;\n}\n\nexport function getConfigPath(client: ClientId): string | null {\n const home = os.homedir();\n const platform = process.platform;\n switch (client) {\n case \"claude-desktop\":\n if (platform === \"win32\") {\n // Prefer MS Store path if detected, otherwise standard %APPDATA%\n return findMsStoreClaudePath() ?? path.join(appData(), \"Claude\", CLAUDE_CONFIG_FILE);\n }\n if (platform === \"darwin\") {\n return path.join(home, \"Library\", \"Application Support\", \"Claude\", CLAUDE_CONFIG_FILE);\n }\n // Linux / other\n return path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, \".config\"), \"Claude\", CLAUDE_CONFIG_FILE);\n case \"cursor\":\n return path.join(home, \".cursor\", \"mcp.json\");\n case \"windsurf\":\n return path.join(home, \".codeium\", \"windsurf\", \"mcp_config.json\");\n case \"vscode\":\n return path.join(process.cwd(), \".mcp.json\");\n case \"claude-code\":\n return null;\n }\n}\n\nconst NPX_PACKAGE = \"@okx_ai/okx-trade-mcp\";\n\nfunction buildEntry(\n client: ClientId,\n args: string[]\n): Record<string, unknown> {\n if (client === \"vscode\") {\n // VS Code inherits the terminal PATH — bare command is fine\n return { type: \"stdio\", command: \"okx-trade-mcp\", args };\n }\n // Standalone apps (Claude Desktop, Cursor, Windsurf) have a limited PATH\n // that often can't find globally-installed npm bins. Use npx to ensure\n // the binary is always resolved.\n return { command: \"npx\", args: [\"-y\", NPX_PACKAGE, ...args] };\n}\n\nfunction buildArgs(options: SetupOptions): string[] {\n const args: string[] = [];\n if (options.profile) args.push(\"--profile\", options.profile);\n args.push(\"--modules\", options.modules ?? \"all\");\n return args;\n}\n\nfunction mergeJsonConfig(\n configPath: string,\n serverName: string,\n entry: Record<string, unknown>\n): void {\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n\n let data: Record<string, unknown> = {};\n if (fs.existsSync(configPath)) {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n try {\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n throw new Error(`Failed to parse existing config at ${configPath}`);\n }\n // Backup before modifying\n const backupPath = configPath + \".bak\";\n fs.copyFileSync(configPath, backupPath);\n process.stdout.write(` Backup → ${backupPath}\\n`);\n }\n\n if (typeof data.mcpServers !== \"object\" || data.mcpServers === null) {\n data.mcpServers = {};\n }\n (data.mcpServers as Record<string, unknown>)[serverName] = entry;\n\n fs.writeFileSync(configPath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function printSetupUsage(): void {\n process.stdout.write(\n `Usage: okx-trade-mcp setup --client <client> [--profile <name>] [--modules <list>]\\n\\n` +\n `Clients:\\n` +\n SUPPORTED_CLIENTS.map((id) => ` ${id.padEnd(16)} ${CLIENT_NAMES[id]}`).join(\"\\n\") +\n `\\n\\nOptions:\\n` +\n ` --profile <name> Profile from ${configFilePath()} (default: uses default_profile)\\n` +\n ` --modules <list> Comma-separated modules or \"all\" (default: all)\\n`\n );\n}\n\nexport function runSetup(options: SetupOptions): void {\n const { client } = options;\n const name = CLIENT_NAMES[client];\n const args = buildArgs(options);\n const serverName = options.profile ? `okx-trade-mcp-${options.profile}` : \"okx-trade-mcp\";\n\n if (client === \"claude-code\") {\n const claudeArgs = [\n \"mcp\",\n \"add\",\n \"--transport\",\n \"stdio\",\n serverName,\n \"--\",\n \"okx-trade-mcp\",\n ...args,\n ];\n process.stdout.write(`Running: claude ${claudeArgs.join(\" \")}\\n`);\n execFileSync(\"claude\", claudeArgs, { stdio: \"inherit\" }); // NOSONAR\n process.stdout.write(`✓ Configured ${name}\\n`);\n return;\n }\n\n const configPath = getConfigPath(client);\n if (!configPath) {\n throw new Error(`${name} is not supported on this platform`);\n }\n\n const entry = buildEntry(client, args);\n mergeJsonConfig(configPath, serverName, entry);\n process.stdout.write(\n `✓ Configured ${name}\\n` +\n ` ${configPath}\\n` +\n ` Server args: ${args.join(\" \")}\\n`\n );\n if (client !== \"vscode\") {\n process.stdout.write(` Restart ${name} to apply changes.\\n`);\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n return banComments || c !== '#'\n ? ptr\n : skipVoid(str, skipComment(str, ptr), banNewLines);\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (obj instanceof Date)\n return 'date';\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatString(s) {\n return JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f');\n}\nfunction stringifyValue(val, type, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n if (type === 'number') {\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (numberAsFloat && Number.isInteger(val))\n return val.toFixed(1);\n return val.toString();\n }\n if (type === 'bigint' || type === 'boolean') {\n return val.toString();\n }\n if (type === 'string') {\n return formatString(val);\n }\n if (type === 'date') {\n if (isNaN(val.getTime())) {\n throw new TypeError('cannot serialize invalid date');\n }\n return val.toISOString();\n }\n if (type === 'object') {\n return stringifyInlineTable(val, depth, numberAsFloat);\n }\n if (type === 'array') {\n return stringifyArray(val, depth, numberAsFloat);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += BARE_KEY.test(k) ? k : formatString(k);\n res += ' = ';\n res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = BARE_KEY.test(k) ? k : formatString(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n","import dns from \"node:dns/promises\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport tls from \"node:tls\";\nimport type { OkxConfig } from \"@agent-tradekit/core\";\nimport { OkxRestClient, readFullConfig, configFilePath } from \"@agent-tradekit/core\";\nimport { Report, ok, fail, section, readCliVersion, writeReportIfRequested } from \"./diagnose-utils.js\";\nimport { output, outputLine } from \"../formatter.js\";\nimport { cmdDiagnoseMcp } from \"./diagnose-mcp.js\";\n\nconst CLI_VERSION = readCliVersion();\n\ndeclare const __GIT_HASH__: string;\nconst GIT_HASH: string = typeof __GIT_HASH__ !== \"undefined\" ? __GIT_HASH__ : \"dev\";\n\n\nfunction maskKey(key: string | undefined): string {\n if (!key) return \"(not set)\";\n if (key.length <= 8) return \"****\";\n return `${key.slice(0, 2)}****${key.slice(-2)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Network probes\n// ---------------------------------------------------------------------------\n\ninterface ProbeResult { ok: boolean; ms: number; ip?: string; error?: string }\n\nasync function checkDns(hostname: string): Promise<ProbeResult> {\n const t0 = Date.now();\n try {\n const addresses = await dns.resolve4(hostname);\n return { ok: true, ip: addresses[0], ms: Date.now() - t0 };\n } catch (e) {\n return { ok: false, ms: Date.now() - t0, error: e instanceof Error ? e.message : String(e) };\n }\n}\n\nasync function checkSocket(\n createFn: () => net.Socket | tls.TLSSocket,\n successEvent: string,\n timeoutMs: number,\n): Promise<ProbeResult> {\n const t0 = Date.now();\n return new Promise((resolve) => {\n const socket = createFn();\n const cleanup = (): void => { socket.removeAllListeners(); socket.destroy(); };\n socket.once(successEvent, () => {\n cleanup();\n resolve({ ok: true, ms: Date.now() - t0 });\n });\n socket.once(\"timeout\", () => {\n cleanup();\n resolve({ ok: false, ms: Date.now() - t0, error: `timed out after ${timeoutMs}ms` });\n });\n socket.once(\"error\", (err: Error) => {\n cleanup();\n resolve({ ok: false, ms: Date.now() - t0, error: err.message });\n });\n });\n}\n\nasync function checkTcp(hostname: string, port: number, timeoutMs = 5000): Promise<ProbeResult> {\n return checkSocket(\n () => net.createConnection({ host: hostname, port, timeout: timeoutMs }),\n \"connect\",\n timeoutMs,\n );\n}\n\nasync function checkTls(hostname: string, port: number, timeoutMs = 5000): Promise<ProbeResult> {\n return checkSocket(\n () => tls.connect({ host: hostname, port, timeout: timeoutMs, servername: hostname }),\n \"secureConnect\",\n timeoutMs,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Diagnostic check helpers (extracted to reduce cmdDiagnose complexity)\n// ---------------------------------------------------------------------------\n\nfunction checkProxyEnv(report: Report): void {\n const httpProxy = process.env.HTTP_PROXY ?? process.env.http_proxy;\n const httpsProxy = process.env.HTTPS_PROXY ?? process.env.https_proxy;\n const noProxy = process.env.NO_PROXY ?? process.env.no_proxy;\n if (httpProxy || httpsProxy) {\n ok(\"HTTP_PROXY\", httpProxy ?? \"(not set)\");\n ok(\"HTTPS_PROXY\", httpsProxy ?? \"(not set)\");\n if (noProxy) ok(\"NO_PROXY\", noProxy);\n report.add(\"http_proxy\", httpProxy ?? \"-\");\n report.add(\"https_proxy\", httpsProxy ?? \"-\");\n if (noProxy) report.add(\"no_proxy\", noProxy);\n } else {\n ok(\"Proxy\", \"(none)\");\n report.add(\"proxy\", \"none\");\n }\n}\n\nfunction checkEnvironment(report: Report): boolean {\n let passed = true;\n section(\"Environment\");\n\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.slice(1), 10);\n if (nodeMajor >= 18) {\n ok(\"Node.js\", `${nodeVersion} (>= 18 required)`);\n } else {\n fail(\"Node.js\", `${nodeVersion} (>= 18 required)`, [\"Upgrade Node.js to v18 or later\"]);\n passed = false;\n }\n ok(\"CLI\", `v${CLI_VERSION} (${GIT_HASH})`);\n ok(\"OS\", `${process.platform} ${process.arch}`);\n ok(\"OS release\", os.release());\n ok(\"Shell\", process.env.SHELL ?? \"(unknown)\");\n ok(\"Locale\", `${process.env.LANG ?? process.env.LC_ALL ?? \"(unknown)\"}`);\n ok(\"Timezone\", Intl.DateTimeFormat().resolvedOptions().timeZone);\n\n report.add(\"cli\", `${CLI_VERSION} (${GIT_HASH})`);\n report.add(\"node\", `${nodeVersion} ${process.platform} ${process.arch}`);\n // os.machine() available since Node 19.9 — fall back to process.arch for Node 18\n const machine = typeof os.machine === \"function\" ? os.machine() : process.arch;\n report.add(\"os\", `${os.type()} ${os.release()} ${machine}`);\n report.add(\"shell\", process.env.SHELL ?? \"-\");\n report.add(\"locale\", process.env.LANG ?? process.env.LC_ALL ?? \"-\");\n report.add(\"tz\", Intl.DateTimeFormat().resolvedOptions().timeZone);\n\n checkProxyEnv(report);\n\n return passed;\n}\n\nfunction checkConfig(config: OkxConfig, profile: string, report: Report): boolean {\n let passed = true;\n section(`Config (profile: ${profile})`);\n\n if (config.hasAuth) {\n ok(\"API key\", maskKey(config.apiKey));\n ok(\"Secret\", \"****\");\n ok(\"Passphrase\", \"****\");\n } else {\n fail(\"Credentials\", \"not configured\", [\n \"Set OKX_API_KEY, OKX_SECRET_KEY, OKX_PASSPHRASE env vars\",\n \"Or run: okx config init\",\n ]);\n passed = false;\n }\n ok(\"Demo mode\", String(config.demo));\n ok(\"Site\", config.site);\n ok(\"Base URL\", config.baseUrl);\n ok(\"Timeout\", `${config.timeoutMs}ms`);\n\n report.add(\"profile\", profile);\n report.add(\"site\", config.site);\n report.add(\"base\", config.baseUrl);\n report.add(\"auth\", config.hasAuth ? `true (key=${maskKey(config.apiKey)})` : \"false\");\n report.add(\"demo\", String(config.demo));\n report.add(\"timeout\", `${config.timeoutMs}ms`);\n\n return passed;\n}\n\nasync function checkTcpTls(\n hostname: string, port: number, protocol: string, report: Report,\n): Promise<boolean> {\n let passed = true;\n const tcpResult = await checkTcp(hostname, port);\n if (tcpResult.ok) {\n ok(\"TCP connect\", `port ${port} (${tcpResult.ms}ms)`);\n report.add(\"tcp\", `${port} OK (${tcpResult.ms}ms)`);\n } else {\n fail(\"TCP connect\", `port ${port} \\u2014 ${tcpResult.error}`, [\n \"Check firewall/proxy/VPN settings\",\n `Try: nc -zv ${hostname} ${port}`,\n ]);\n report.add(\"tcp\", `FAIL ${port} ${tcpResult.error} (${tcpResult.ms}ms)`);\n return false;\n }\n\n if (protocol === \"https:\") {\n const tlsResult = await checkTls(hostname, port);\n if (tlsResult.ok) {\n ok(\"TLS handshake\", `(${tlsResult.ms}ms)`);\n report.add(\"tls\", `OK (${tlsResult.ms}ms)`);\n } else {\n fail(\"TLS handshake\", tlsResult.error ?? \"failed\", [\n \"Check system certificates or proxy MITM settings\",\n ]);\n passed = false;\n report.add(\"tls\", `FAIL ${tlsResult.error} (${tlsResult.ms}ms)`);\n }\n }\n return passed;\n}\n\nasync function checkNetwork(config: OkxConfig, client: OkxRestClient, report: Report): Promise<boolean> {\n let passed = true;\n section(\"Network\");\n\n const url = new URL(config.baseUrl);\n const hostname = url.hostname;\n const defaultPort = url.protocol === \"https:\" ? 443 : 80;\n const port = url.port ? parseInt(url.port, 10) : defaultPort;\n\n const dnsResult = await checkDns(hostname);\n if (dnsResult.ok) {\n ok(\"DNS resolve\", `${hostname} \\u2192 ${dnsResult.ip} (${dnsResult.ms}ms)`);\n report.add(\"dns\", `${hostname} \\u2192 ${dnsResult.ip} (${dnsResult.ms}ms)`);\n } else {\n fail(\"DNS resolve\", `${hostname} \\u2014 ${dnsResult.error}`, [\n \"Check DNS settings or network connection\",\n `Try: nslookup ${hostname}`,\n ]);\n passed = false;\n report.add(\"dns\", `FAIL ${hostname} ${dnsResult.error} (${dnsResult.ms}ms)`);\n }\n\n if (dnsResult.ok) {\n const tcpTlsPassed = await checkTcpTls(hostname, port, url.protocol, report);\n if (!tcpTlsPassed) passed = false;\n }\n\n // Public API check\n const t0 = Date.now();\n try {\n await client.publicGet(\"/api/v5/public/time\");\n const ms = Date.now() - t0;\n ok(\"API /public/time\", `200 (${ms}ms)`);\n report.add(\"api\", `/public/time 200 (${ms}ms)`);\n } catch (e) {\n const ms = Date.now() - t0;\n const msg = e instanceof Error ? e.message : String(e);\n fail(\"API /public/time\", msg, [\n \"OKX API may be down or blocked in your network\",\n `Try: curl ${config.baseUrl}/api/v5/public/time`,\n ]);\n passed = false;\n report.add(\"api\", `FAIL /public/time ${msg} (${ms}ms)`);\n }\n\n return passed;\n}\n\nfunction getAuthHints(msg: string, baseUrl: string): string[] {\n const accountUrl = baseUrl.replace(/\\/+$/, \"\") + \"/account/my-api\";\n if (msg.includes(\"50111\") || msg.includes(\"Invalid OK-ACCESS-KEY\")) {\n return [\"API key is invalid or expired\", `Regenerate at ${accountUrl}`];\n }\n if (msg.includes(\"50112\") || msg.includes(\"Invalid Sign\")) {\n return [\"Secret key or passphrase may be wrong\", `Regenerate API key at ${accountUrl}`];\n }\n if (msg.includes(\"50113\")) {\n return [\"Passphrase is incorrect\"];\n }\n if (msg.includes(\"50100\")) {\n return [\"API key lacks required permissions\", `Update permissions at ${accountUrl}`];\n }\n return [\"Check API credentials and permissions\"];\n}\n\nasync function checkAuth(client: OkxRestClient, config: OkxConfig, report: Report): Promise<boolean> {\n if (!config.hasAuth) {\n report.add(\"auth_api\", \"skipped (no credentials)\");\n return true;\n }\n\n let passed = true;\n section(\"Authentication\");\n\n const t1 = Date.now();\n try {\n await client.privateGet(\"/api/v5/account/balance\");\n const ms = Date.now() - t1;\n ok(\"Account balance\", `200 (${ms}ms)`);\n if (config.demo) {\n ok(\"Demo header\", \"x-simulated-trading: 1\");\n }\n report.add(\"auth_api\", `/account/balance 200 (${ms}ms)`);\n } catch (e) {\n const ms = Date.now() - t1;\n const msg = e instanceof Error ? e.message : String(e);\n const hints = getAuthHints(msg, config.baseUrl);\n fail(\"Account balance\", msg, hints);\n passed = false;\n report.add(\"auth_api\", `FAIL /account/balance ${msg} (${ms}ms)`);\n }\n\n return passed;\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nexport interface DiagnoseOptions {\n mcp?: boolean;\n cli?: boolean;\n all?: boolean;\n output?: string;\n}\n\nexport async function cmdDiagnose(config: OkxConfig | undefined, profile: string, options: DiagnoseOptions = {}): Promise<void> {\n // --mcp only: run MCP server checks\n if (options.mcp && !options.all) {\n return cmdDiagnoseMcp({ output: options.output });\n }\n\n // --all: run CLI checks first, then MCP checks\n if (options.all) {\n await runCliChecks(config, profile, options.output);\n return cmdDiagnoseMcp({ output: options.output });\n }\n\n // --cli or no flag (default): run CLI/general checks only\n return runCliChecks(config, profile, options.output);\n}\n\nfunction checkConfigFile(report: Report): boolean {\n section(\"Config File\");\n const path = configFilePath();\n try {\n readFullConfig();\n ok(\"Config parse\", `${path} OK`);\n report.add(\"config_parse\", \"OK\");\n return true;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n fail(\"Config parse\", msg, [\n \"If passphrase contains special characters (# \\\\ \\\" '), wrap in quotes:\",\n \" Contains # \\\\ \\\" → passphrase = 'value'\",\n \" Contains ' → passphrase = \\\"value\\\"\",\n \" Contains both → passphrase = '''value'''\",\n \"Or re-run: okx config init\",\n ]);\n report.add(\"config_parse\", `FAIL ${msg}`);\n return false;\n }\n}\n\nasync function runCliChecks(config: OkxConfig | undefined, profile: string, outputPath?: string): Promise<void> {\n process.stdout.write(\"\\n OKX Trade CLI Diagnostics\\n\");\n process.stdout.write(\" \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\n\");\n\n const report = new Report();\n report.add(\"ts\", new Date().toISOString());\n\n const configFilePassed = checkConfigFile(report);\n const envPassed = checkEnvironment(report);\n\n if (!config) {\n // Config parse failed — skip remaining checks that need config\n fail(\"Config\", \"Could not load config (see Config File check above)\", []);\n report.add(\"result\", \"FAIL\");\n report.print();\n writeReportIfRequested(report, outputPath);\n process.exitCode = 1;\n return;\n }\n\n const cfgPassed = checkConfig(config, profile, report);\n const client = new OkxRestClient(config);\n const netPassed = await checkNetwork(config, client, report);\n const authPassed = await checkAuth(client, config, report);\n\n const allPassed = configFilePassed && envPassed && cfgPassed && netPassed && authPassed;\n\n // --- Result ---\n outputLine(\"\");\n if (allPassed) {\n outputLine(\" Result: All checks passed \\u2713\");\n } else {\n outputLine(\" Result: Some checks failed \\u2717\");\n process.exitCode = 1;\n }\n\n report.add(\"result\", allPassed ? \"PASS\" : \"FAIL\");\n report.print();\n\n writeReportIfRequested(report, outputPath);\n}\n","import fs from \"node:fs\";\n\nimport { createRequire } from \"node:module\";\nimport { output, outputLine, errorLine } from \"../formatter.js\";\n\nconst _require = createRequire(import.meta.url);\n\n// ---------------------------------------------------------------------------\n// Version helpers (shared between diagnose.ts and diagnose-mcp.ts)\n// ---------------------------------------------------------------------------\n\nexport function readCliVersion(): string {\n for (const rel of [\"../package.json\", \"../../package.json\"]) {\n try {\n return (_require(rel) as { version: string }).version;\n } catch (_err: unknown) {\n // Path not found in this layout (bundled vs source) — try next\n }\n }\n return \"0.0.0\";\n}\n\n// ---------------------------------------------------------------------------\n// Report collector — accumulates raw data for the copy-paste block\n// ---------------------------------------------------------------------------\n\nexport interface ReportLine { key: string; value: string }\n\nexport class Report {\n private lines: ReportLine[] = [];\n\n add(key: string, value: string): void {\n this.lines.push({ key, value });\n }\n\n print(): void {\n const sep = \"\\u2500\".repeat(52);\n outputLine(\"\");\n outputLine(` \\u2500\\u2500 Diagnostic Report (copy & share) ${sep.slice(35)}`);\n for (const { key, value } of this.lines) {\n outputLine(` ${key.padEnd(14)} ${value}`);\n }\n outputLine(` ${sep}`);\n outputLine(\"\");\n }\n\n /** Write report to a file path, returns true on success. */\n writeToFile(filePath: string): boolean {\n try {\n const sep = \"-\".repeat(52);\n const lines: string[] = [\n `-- Diagnostic Report (copy & share) ${sep.slice(35)}`,\n ];\n for (const { key, value } of this.lines) {\n lines.push(`${key.padEnd(14)} ${value}`);\n }\n lines.push(sep, \"\");\n fs.writeFileSync(filePath, lines.join(\"\\n\"), \"utf8\");\n return true;\n } catch (_e) {\n return false;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Display helpers\n// ---------------------------------------------------------------------------\n\nexport function ok(label: string, detail: string): void {\n outputLine(` \\u2713 ${label.padEnd(14)} ${detail}`);\n}\n\nexport function fail(label: string, detail: string, hints: string[]): void {\n outputLine(` \\u2717 ${label.padEnd(14)} ${detail}`);\n for (const hint of hints) {\n outputLine(` \\u2192 ${hint}`);\n }\n}\n\nexport function warn(label: string, detail: string, hints: string[] = []): void {\n outputLine(` \\u26a0 ${label.padEnd(14)} ${detail}`);\n for (const hint of hints) {\n outputLine(` \\u2192 ${hint}`);\n }\n}\n\nexport function section(title: string): void {\n outputLine(\"\");\n outputLine(` ${title}`);\n}\n\n// ---------------------------------------------------------------------------\n// Output file helper — shared between diagnose.ts and diagnose-mcp.ts\n// ---------------------------------------------------------------------------\n\nexport function writeReportIfRequested(report: Report, outputPath?: string): void {\n if (!outputPath) return;\n const written = report.writeToFile(outputPath);\n if (written) {\n outputLine(` Report saved to: ${outputPath}`);\n } else {\n errorLine(` Warning: failed to write report to: ${outputPath}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Sanitization — strip secrets / long hex / UUIDs before sharing\n// ---------------------------------------------------------------------------\n\nexport function sanitize(value: string): string {\n // UUID-like patterns (e.g. 550e8400-e29b-41d4-a716-446655440000)\n value = value.replace(\n /\\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\b/gi,\n \"****-uuid-****\",\n );\n // Long hex strings (32+ chars) — likely keys/tokens\n value = value.replace(/\\b[0-9a-f]{32,}\\b/gi, \"****hex****\");\n // Bearer/token patterns\n value = value.replace(/Bearer\\s+\\S{8,}/gi, \"Bearer ****\");\n return value;\n}\n","import { EOL } from \"node:os\";\n\n// ---------------------------------------------------------------------------\n// Output interface — defines the contract for any IO sink.\n// The default implementation writes to process.stdout/stderr.\n// Swap it out in tests or to redirect to a file.\n// ---------------------------------------------------------------------------\n\nexport interface CliOutput {\n out(message: string): void;\n err(message: string): void;\n}\n\nconst stdioOutput: CliOutput = {\n out: (message) => process.stdout.write(message),\n err: (message) => process.stderr.write(message),\n};\n\nlet activeOutput: CliOutput = stdioOutput;\n\nexport function setOutput(impl: CliOutput): void {\n activeOutput = impl;\n}\n\nexport function resetOutput(): void {\n activeOutput = stdioOutput;\n}\n\n// Emit a raw string to stdout. Use this when the message already\n// contains newlines (e.g. multi-line blocks, pre-formatted output).\nexport function output(message: string): void {\n activeOutput.out(message);\n}\n\n// Emit a raw string to stderr. Use this when the message already\n// contains newlines (e.g. multi-line blocks, pre-formatted output).\nexport function errorOutput(message: string): void {\n activeOutput.err(message);\n}\n\n// Emit a single line to stdout. Automatically appends the platform newline\n// (os.EOL) so callers never hard-code \"\\n\".\nexport function outputLine(message: string): void {\n activeOutput.out(message + EOL);\n}\n\n// Emit a single line to stderr. Automatically appends the platform newline\n// (os.EOL) so callers never hard-code \"\\n\".\nexport function errorLine(message: string): void {\n activeOutput.err(message + EOL);\n}\n\n// ---------------------------------------------------------------------------\n// Structured output helpers (always write to stdout)\n// ---------------------------------------------------------------------------\n\nexport function printJson(data: unknown): void {\n activeOutput.out(JSON.stringify(data, null, 2) + EOL);\n}\n\nexport function printTable(rows: Record<string, unknown>[]): void {\n if (rows.length === 0) {\n activeOutput.out(\"(no data)\" + EOL);\n return;\n }\n const keys = Object.keys(rows[0]);\n const widths = keys.map((k) =>\n Math.max(k.length, ...rows.map((r) => String(r[k] ?? \"\").length)),\n );\n const header = keys.map((k, i) => k.padEnd(widths[i])).join(\" \");\n const divider = widths.map((w) => \"-\".repeat(w)).join(\" \");\n activeOutput.out(header + EOL + divider + EOL);\n for (const row of rows) {\n activeOutput.out(keys.map((k, i) => String(row[k] ?? \"\").padEnd(widths[i])).join(\" \") + EOL);\n }\n}\n\nexport function printKv(obj: Record<string, unknown>, indent = 0): void {\n const pad = \" \".repeat(indent);\n for (const [k, v] of Object.entries(obj)) {\n if (v !== null && typeof v === \"object\" && !Array.isArray(v)) {\n activeOutput.out(`${pad}${k}:${EOL}`);\n printKv(v as Record<string, unknown>, indent + 2);\n } else {\n activeOutput.out(`${pad}${k.padEnd(20 - indent)} ${v}${EOL}`);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Exit-code helper\n// ---------------------------------------------------------------------------\n\n// OKX write endpoints return HTTP 200 with top-level code=\"0\" even when an\n// individual order is rejected (e.g. insufficient balance). The real per-item\n// result is in each element's `sCode` field (\"0\" = success, anything else =\n// business failure). This function detects that case and sets exit code 1 so\n// that callers (LLMs, scripts) can rely on exit code alone to detect failure.\nexport function markFailedIfSCodeError(data: unknown): void {\n // Read-only endpoints return plain arrays without sCode — skip them.\n if (!Array.isArray(data)) return;\n for (const item of data) {\n if (item !== null && typeof item === \"object\") {\n const sCode = (item as Record<string, unknown>)[\"sCode\"];\n // sCode absent → not a write-response item, ignore.\n // sCode \"0\" or 0 → success.\n // anything else → business failure (e.g. \"51008\" = insufficient balance).\n if (sCode !== undefined && sCode !== \"0\" && sCode !== 0) {\n process.exitCode = 1;\n return;\n }\n }\n }\n}\n","/**\n * MCP server diagnostics — `okx diagnose --mcp`\n *\n * All checks use Node.js built-ins only (no external dependencies).\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { spawnSync, spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n getConfigPath,\n allToolSpecs,\n CLIENT_NAMES,\n DEFAULT_MODULES,\n} from \"@agent-tradekit/core\";\nimport type { ClientId } from \"@agent-tradekit/core\";\nimport {\n Report,\n ok,\n fail,\n warn,\n section,\n sanitize,\n readCliVersion,\n writeReportIfRequested,\n} from \"./diagnose-utils.js\";\nimport { outputLine } from \"../formatter.js\";\n\nconst _require = createRequire(import.meta.url);\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// ---------------------------------------------------------------------------\n// Version helpers\n// ---------------------------------------------------------------------------\n\nfunction readMcpVersion(): string {\n // Try to read from the installed @okx_ai/okx-trade-mcp package\n const candidates = [\n // Installed as global or local dependency\n \"@okx_ai/okx-trade-mcp/package.json\",\n // Relative paths for monorepo dev layout\n \"../../../mcp/package.json\",\n \"../../../../packages/mcp/package.json\",\n ];\n for (const rel of candidates) {\n try {\n const pkg = _require(rel) as { version?: string };\n if (pkg.version) return pkg.version;\n } catch (_e) {\n // try next\n }\n }\n return \"(unknown)\";\n}\n\n// ---------------------------------------------------------------------------\n// Check helpers\n// ---------------------------------------------------------------------------\n\nfunction checkMcpPackageVersion(report: Report): void {\n section(\"MCP Package\");\n const mcpVersion = readMcpVersion();\n const cliVersion = readCliVersion();\n ok(\"MCP version\", mcpVersion);\n ok(\"CLI version\", cliVersion);\n report.add(\"mcp_ver\", mcpVersion);\n report.add(\"cli_ver\", cliVersion);\n}\n\nfunction checkNodeCompat(report: Report): boolean {\n section(\"Node.js Compatibility\");\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.slice(1), 10);\n if (nodeMajor >= 18) {\n ok(\"Node.js\", `${nodeVersion} (>= 18 required)`);\n report.add(\"node\", `${nodeVersion} OK`);\n return true;\n } else {\n fail(\"Node.js\", `${nodeVersion} (>= 18 required)`, [\"Upgrade Node.js to v18 or later\"]);\n report.add(\"node\", `${nodeVersion} FAIL`);\n return false;\n }\n}\n\nexport function checkMcpEntryPoint(report: Report): { entryPath: string | null; passed: boolean } {\n section(\"MCP Entry Point\");\n\n // Try to resolve the okx-trade-mcp binary\n let entryPath: string | null = null;\n\n // 1. Check PATH for the installed binary\n const which = spawnSync(process.platform === \"win32\" ? \"where\" : \"which\", [\"okx-trade-mcp\"], {\n encoding: \"utf8\",\n });\n if (which.status === 0 && which.stdout.trim()) {\n entryPath = which.stdout.trim().split(\"\\n\")[0].trim();\n }\n\n // 2. If not found in PATH, try common monorepo locations\n if (!entryPath) {\n const candidates = [\n // Installed locally\n path.join(process.cwd(), \"node_modules\", \".bin\", \"okx-trade-mcp\"),\n // Monorepo workspace (e.g. running from source)\n path.join(__dirname, \"..\", \"..\", \"..\", \"..\", \"mcp\", \"dist\", \"index.js\"),\n ];\n for (const candidate of candidates) {\n try {\n fs.accessSync(candidate, fs.constants.X_OK | fs.constants.R_OK);\n entryPath = candidate;\n break;\n } catch (_e) {\n // not found or not accessible — try next\n }\n }\n }\n\n if (entryPath) {\n ok(\"entry point\", entryPath);\n report.add(\"mcp_entry\", entryPath);\n return { entryPath, passed: true };\n } else {\n fail(\"entry point\", \"okx-trade-mcp not found in PATH\", [\n \"Install globally: npm install -g @okx_ai/okx-trade-mcp\",\n \"Or install locally and use npx okx-trade-mcp\",\n ]);\n report.add(\"mcp_entry\", \"NOT_FOUND\");\n return { entryPath: null, passed: false };\n }\n}\n\n/** Server name token used to detect okx-trade-mcp entries in any client config. */\nconst MCP_SERVER_NAME = \"okx-trade-mcp\";\n\n// ---------------------------------------------------------------------------\n// MCP client tool count limits (as of 2026-03)\n// Source: Cursor docs & community reports; update when clients change limits.\n// ---------------------------------------------------------------------------\nconst CLIENT_LIMITS: Partial<Record<ClientId, { perServer: number; total: number }>> = {\n cursor: { perServer: 40, total: 80 },\n};\n\n/**\n * Check if a JSON config file (mcpServers format) contains an okx-trade-mcp entry.\n * Returns \"found\" | \"not-configured\" | \"parse-error\" | \"missing\".\n */\nfunction checkJsonMcpConfig(configPath: string): \"found\" | \"not-configured\" | \"parse-error\" | \"missing\" {\n if (!fs.existsSync(configPath)) return \"missing\";\n try {\n const raw = fs.readFileSync(configPath, \"utf8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const mcpServers = parsed[\"mcpServers\"] as Record<string, unknown> | undefined;\n if (!mcpServers) return \"not-configured\";\n const entries = Object.entries(mcpServers);\n const found = entries.find(([name, v]) => {\n if (name.includes(MCP_SERVER_NAME)) return true;\n const val = v as Record<string, unknown>;\n const cmd = String(val[\"command\"] ?? \"\");\n const args = (val[\"args\"] as string[] | undefined) ?? [];\n return cmd.includes(MCP_SERVER_NAME) || args.some((a) => a.includes(MCP_SERVER_NAME));\n });\n return found ? \"found\" : \"not-configured\";\n } catch (_e) {\n return \"parse-error\";\n }\n}\n\n/**\n * Check Claude Code configuration by looking at ~/.claude/settings.json\n * and ~/.claude.json for mcpServers entries containing okx-trade-mcp.\n * Iterates all candidates: a parse error in one file does not prevent\n * checking the other.\n */\nfunction checkClaudeCodeConfig(): \"found\" | \"not-configured\" | \"parse-error\" | \"missing\" {\n const home = os.homedir();\n const candidates = [\n path.join(home, \".claude\", \"settings.json\"),\n path.join(home, \".claude.json\"),\n ];\n let anyFound = false;\n let anyParseError = false;\n for (const cfgPath of candidates) {\n if (!fs.existsSync(cfgPath)) continue;\n anyFound = true;\n const result = checkJsonMcpConfig(cfgPath);\n if (result === \"found\") return \"found\";\n if (result === \"parse-error\") anyParseError = true;\n }\n if (!anyFound) return \"missing\";\n if (anyParseError) return \"parse-error\";\n return \"not-configured\";\n}\n\n/**\n * Check all known MCP clients and return overall pass/fail and list of configured clients.\n * - Found + valid → ✓, added to configuredClients\n * - Found + invalid → ✗ with fix guidance\n * - Not found → skip (no output, no fail)\n * - At least one client configured → overall pass\n */\nexport function checkMcpClients(report: Report): { passed: boolean; configuredClients: ClientId[] } {\n section(\"MCP Client Config\");\n\n // Clients with JSON config files detectable globally\n const jsonClients: ClientId[] = [\"claude-desktop\", \"cursor\", \"windsurf\"];\n const configuredClients: ClientId[] = [];\n let anyFailed = false;\n\n for (const clientId of jsonClients) {\n const configPath = getConfigPath(clientId);\n if (!configPath) continue; // platform doesn't support this client\n\n const name = CLIENT_NAMES[clientId];\n const status = checkJsonMcpConfig(configPath);\n\n if (status === \"missing\") {\n // Client not installed — skip silently\n continue;\n }\n\n if (status === \"found\") {\n ok(name, `configured (${sanitize(configPath)})`);\n report.add(`client_${clientId}`, `OK ${sanitize(configPath)}`);\n configuredClients.push(clientId);\n } else if (status === \"not-configured\") {\n fail(name, \"okx-trade-mcp not found in mcpServers\", [\n `Run: okx setup --client ${clientId}`,\n ]);\n report.add(`client_${clientId}`, \"NOT_CONFIGURED\");\n anyFailed = true;\n } else {\n fail(name, `JSON parse error in ${sanitize(configPath)}`, [\n `Check ${sanitize(configPath)} for JSON syntax errors`,\n `Then run: okx setup --client ${clientId}`,\n ]);\n report.add(`client_${clientId}`, \"PARSE_ERROR\");\n anyFailed = true;\n }\n }\n\n // Claude Code — special handling (uses claude mcp add, config paths vary)\n // \"not-configured\" is treated as a warning rather than a failure: Claude Code may\n // be installed for other purposes and not used for OKX trading. Only a parse\n // error is counted as a failure.\n const claudeCodeStatus = checkClaudeCodeConfig();\n if (claudeCodeStatus !== \"missing\") {\n const name = CLIENT_NAMES[\"claude-code\"];\n if (claudeCodeStatus === \"found\") {\n ok(name, \"configured\");\n report.add(\"client_claude-code\", \"OK\");\n configuredClients.push(\"claude-code\");\n } else if (claudeCodeStatus === \"not-configured\") {\n warn(name, \"installed but okx-trade-mcp not configured\", [\n \"Run: okx setup --client claude-code\",\n ]);\n report.add(\"client_claude-code\", \"NOT_CONFIGURED\");\n // not set anyFailed — Claude Code may be used for other purposes\n } else {\n fail(name, \"settings file has JSON parse error\", [\n \"Run: okx setup --client claude-code\",\n ]);\n report.add(\"client_claude-code\", \"PARSE_ERROR\");\n anyFailed = true;\n }\n }\n\n // vscode is project-level — skip for global diagnose\n\n if (configuredClients.length === 0 && !anyFailed) {\n // No client config found at all\n fail(\"no client\", \"no MCP client configuration found\", [\n \"Run: okx setup --client <client>\",\n \"Supported clients: claude-desktop, cursor, windsurf, claude-code\",\n ]);\n report.add(\"client_cfg\", \"NONE_FOUND\");\n return { passed: false, configuredClients };\n }\n\n const passed = configuredClients.length > 0 && !anyFailed;\n report.add(\"client_cfg\", passed ? `OK (${configuredClients.join(\",\")})` : \"FAIL\");\n return { passed, configuredClients };\n}\n\n/**\n * Check tool count and warn if exceeding known client limits.\n * Tool count warnings do not affect overall pass/fail — they are advisory only.\n *\n * @param getSpecs - Optional override for retrieving tool specs (used in tests).\n */\nexport function checkToolCount(\n report: Report,\n configuredClients: ClientId[],\n getSpecs: () => ReturnType<typeof allToolSpecs> = allToolSpecs,\n): void {\n section(\"Tool Count\");\n\n const specs = getSpecs();\n const totalCount = specs.length;\n\n // Count tools for default modules (the suggested --modules set)\n const defaultModuleSet = new Set<string>(DEFAULT_MODULES);\n const defaultCount = specs.filter((s) => defaultModuleSet.has(s.module)).length;\n const defaultModulesArg = DEFAULT_MODULES.join(\",\");\n\n // Determine which limits apply based on configured clients\n const applicableLimits = configuredClients\n .map((id) => ({ id, limits: CLIENT_LIMITS[id] }))\n .filter((x): x is { id: ClientId; limits: { perServer: number; total: number } } => x.limits !== undefined);\n\n if (applicableLimits.length === 0) {\n // No clients with known limits — just report count\n ok(\"total tools\", `${totalCount} tools loaded`);\n report.add(\"tool_count\", `${totalCount}`);\n return;\n }\n\n // Check against each limit\n let anyExceeded = false;\n for (const { id, limits } of applicableLimits) {\n const name = CLIENT_NAMES[id];\n if (totalCount > limits.total) {\n warn(\n \"tool count\",\n `${totalCount} tools loaded — exceeds ${name} limit (${limits.total} total / ${limits.perServer} per server)`,\n [\n `Use --modules to reduce: okx-trade-mcp --modules ${defaultModulesArg} (${defaultCount} tools)`,\n ],\n );\n report.add(\"tool_count\", `${totalCount} EXCEEDS_${id.toUpperCase()}_LIMIT`);\n anyExceeded = true;\n } else if (totalCount > limits.perServer) {\n warn(\n \"tool count\",\n `${totalCount} tools loaded — exceeds ${name} per-server limit (${limits.perServer})`,\n [\n `Use --modules to reduce: okx-trade-mcp --modules ${defaultModulesArg} (${defaultCount} tools)`,\n ],\n );\n report.add(\"tool_count\", `${totalCount} EXCEEDS_${id.toUpperCase()}_PER_SERVER_LIMIT`);\n anyExceeded = true;\n }\n }\n\n if (!anyExceeded) {\n ok(\"total tools\", `${totalCount} tools loaded (within limits for all configured clients)`);\n report.add(\"tool_count\", `${totalCount} OK`);\n }\n}\n\n/**\n * Read the last 8 KB of a log file and return the last 5 non-empty lines.\n * Throws if the file does not exist or cannot be read.\n */\nfunction readLogTail(logPath: string): string[] {\n const stat = fs.statSync(logPath);\n const readSize = Math.min(8192, stat.size);\n const buffer = Buffer.alloc(readSize);\n const fd = fs.openSync(logPath, \"r\");\n try {\n fs.readSync(fd, buffer, 0, readSize, Math.max(0, stat.size - readSize));\n } finally {\n fs.closeSync(fd);\n }\n return buffer.toString(\"utf8\").split(\"\\n\").filter((l) => l.trim()).slice(-5);\n}\n\n/** Build the platform-specific list of MCP log file candidates. */\nfunction getMcpLogCandidates(): string[] {\n if (process.platform === \"darwin\") {\n const logsDir = path.join(os.homedir(), \"Library\", \"Logs\", \"Claude\");\n const candidates = [\n path.join(logsDir, \"mcp.log\"),\n path.join(logsDir, \"mcp-server-okx-trade-mcp.log\"),\n ];\n try {\n const extra = fs.readdirSync(logsDir)\n .filter((f) => f.startsWith(\"mcp\") && f.endsWith(\".log\"))\n .map((f) => path.join(logsDir, f));\n candidates.push(...extra);\n } catch (_e) {\n // logsDir not found or not readable — skip\n }\n return candidates;\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return [path.join(appData, \"Claude\", \"logs\", \"mcp.log\")];\n }\n // Linux — XDG\n const configHome = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\");\n return [path.join(configHome, \"Claude\", \"logs\", \"mcp.log\")];\n}\n\n/** Check recent MCP log lines (macOS-specific path, gracefully skipped elsewhere). */\nexport function checkMcpLogs(report: Report): void {\n section(\"MCP Server Logs (recent)\");\n\n const seen = new Set<string>();\n for (const logPath of getMcpLogCandidates()) {\n if (seen.has(logPath)) continue;\n seen.add(logPath);\n\n try {\n const lines = readLogTail(logPath);\n ok(\"log file\", logPath);\n report.add(\"mcp_log\", logPath);\n if (lines.length > 0) {\n ok(\"last lines\", `(${lines.length} shown)`);\n for (const line of lines) outputLine(` ${sanitize(line)}`);\n } else {\n ok(\"last lines\", \"(empty log)\");\n }\n return;\n } catch (_e) {\n // File does not exist or is unreadable — try next candidate\n }\n }\n\n ok(\"log file\", \"(not found — logs only appear after MCP server has been started)\");\n report.add(\"mcp_log\", \"not_found\");\n}\n\ninterface HandshakeResponse {\n ok: true; serverName: string; serverVer: string;\n}\ninterface HandshakeError {\n ok: false; errMsg: string;\n}\ntype ParsedHandshake = HandshakeResponse | HandshakeError | null;\n\n/**\n * Parse a single newline-delimited JSON-RPC line from the MCP server's stdout.\n * Returns a typed result when the line is a response to request id=1, or null\n * if the line is not yet actionable (startup noise, unrelated message, etc.).\n */\nfunction parseHandshakeResponse(line: string): ParsedHandshake {\n const trimmed = line.trim();\n if (!trimmed) return null;\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>;\n if (parsed[\"id\"] === 1 && parsed[\"result\"]) {\n const result = parsed[\"result\"] as Record<string, unknown>;\n const info = result[\"serverInfo\"] as Record<string, unknown> | undefined;\n return {\n ok: true,\n serverName: String(info?.[\"name\"] ?? \"MCP server\"),\n serverVer: String(info?.[\"version\"] ?? \"?\"),\n };\n }\n if (parsed[\"id\"] === 1 && parsed[\"error\"]) {\n const errMsg = (parsed[\"error\"] as Record<string, unknown>)[\"message\"] ?? \"unknown error\";\n return { ok: false, errMsg: String(errMsg) };\n }\n } catch (_e) {\n // not valid JSON — possibly startup noise, keep buffering\n }\n return null;\n}\n\n/** Perform a stdio handshake with the MCP server (spawn, send initialize, check response). */\nexport async function checkStdioHandshake(entryPath: string, report: Report): Promise<boolean> {\n section(\"stdio Handshake\");\n\n const TIMEOUT_MS = 5000;\n const initMessage = JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"initialize\",\n params: {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"okx-diagnose\", version: \"1.0\" },\n },\n });\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const settle = (passed: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(passed);\n };\n\n const child = spawn(process.execPath, [entryPath], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n const timer = setTimeout(() => {\n child.kill();\n fail(\"handshake\", `timed out after ${TIMEOUT_MS}ms`, [\n \"MCP server may be hanging on startup (check credentials/config)\",\n `Try: node ${entryPath} --help`,\n ]);\n report.add(\"handshake\", `TIMEOUT ${TIMEOUT_MS}ms`);\n settle(false);\n }, TIMEOUT_MS);\n\n child.on(\"error\", (err: Error) => {\n fail(\"handshake\", `spawn error: ${err.message}`, [\n `Ensure ${entryPath} is executable`,\n \"Check Node.js version compatibility\",\n ]);\n report.add(\"handshake\", `SPAWN_ERROR ${err.message}`);\n settle(false);\n });\n\n let responseBuffer = \"\";\n child.stdout.on(\"data\", (chunk: Buffer) => {\n responseBuffer += chunk.toString(\"utf8\");\n const lines = responseBuffer.split(\"\\n\");\n responseBuffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const parsed = parseHandshakeResponse(line);\n if (!parsed) continue;\n if (parsed.ok) {\n ok(\"handshake\", `OK — ${parsed.serverName} v${parsed.serverVer}`);\n report.add(\"handshake\", `OK ${parsed.serverName}@${parsed.serverVer}`);\n } else {\n fail(\"handshake\", `JSON-RPC error: ${parsed.errMsg}`, [\n \"MCP server returned an error during initialization\",\n ]);\n report.add(\"handshake\", `RPC_ERROR ${parsed.errMsg}`);\n }\n child.kill();\n settle(parsed.ok);\n return;\n }\n });\n\n child.stderr.on(\"data\", (_chunk: Buffer) => {\n // Ignore stderr output (MCP server logs to stderr normally)\n });\n\n // Send the initialize request\n try {\n child.stdin.write(initMessage + \"\\n\");\n } catch (_e) {\n fail(\"handshake\", \"failed to write to stdin\", [\"Check that MCP server accepts stdin\"]);\n report.add(\"handshake\", \"STDIN_WRITE_FAIL\");\n settle(false);\n }\n });\n}\n\n/** Check that the MCP module can be required without errors (module loading test). */\nexport function checkModuleLoading(entryPath: string | null, report: Report): boolean {\n section(\"Module Loading\");\n\n if (!entryPath) {\n ok(\"module load\", \"(skipped — entry point not found)\");\n report.add(\"module_load\", \"skipped\");\n return true;\n }\n\n // Try a quick --version call as a smoke test for module loading\n const result = spawnSync(process.execPath, [entryPath, \"--version\"], {\n encoding: \"utf8\",\n timeout: 5000,\n env: { ...process.env },\n });\n\n if (result.status === 0 && result.stdout.trim()) {\n ok(\"module load\", `version output: ${result.stdout.trim()}`);\n report.add(\"module_load\", `OK v${result.stdout.trim()}`);\n return true;\n } else {\n const errMsg = result.stderr?.trim() || result.error?.message || \"non-zero exit\";\n fail(\"module load\", `failed: ${sanitize(errMsg)}`, [\n \"MCP server may have import errors or missing dependencies\",\n `Try: node ${entryPath} --version`,\n ]);\n report.add(\"module_load\", `FAIL ${sanitize(errMsg)}`);\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface DiagnoseMcpOptions {\n output?: string;\n}\n\nexport async function cmdDiagnoseMcp(options: DiagnoseMcpOptions = {}): Promise<void> {\n outputLine(\"\");\n outputLine(\" OKX MCP Server Diagnostics\");\n outputLine(\" \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\");\n\n const report = new Report();\n report.add(\"ts\", new Date().toISOString());\n report.add(\"mode\", \"mcp\");\n report.add(\"os\", `${process.platform} ${process.arch} ${os.release()}`);\n\n checkMcpPackageVersion(report);\n const nodePassed = checkNodeCompat(report);\n const { entryPath, passed: entryPassed } = checkMcpEntryPoint(report);\n const { passed: cfgPassed, configuredClients } = checkMcpClients(report);\n checkMcpLogs(report);\n\n const moduleLoadPassed = checkModuleLoading(entryPath, report);\n\n // Tool count check — advisory only, does not affect pass/fail\n checkToolCount(report, configuredClients);\n\n let handshakePassed = false;\n if (entryPath && entryPassed && moduleLoadPassed) {\n handshakePassed = await checkStdioHandshake(entryPath, report);\n } else {\n section(\"stdio Handshake\");\n ok(\"handshake\", \"(skipped — entry point not available)\");\n report.add(\"handshake\", \"skipped\");\n handshakePassed = true; // don't count as failure if entry not found\n }\n\n const allPassed = nodePassed && entryPassed && cfgPassed && moduleLoadPassed && handshakePassed;\n\n // --- Result ---\n outputLine(\"\");\n if (allPassed) {\n outputLine(\" Result: All checks passed \\u2713\");\n } else {\n outputLine(\" Result: Some checks failed \\u2717\");\n process.exitCode = 1;\n }\n\n report.add(\"result\", allPassed ? \"PASS\" : \"FAIL\");\n report.print();\n\n writeReportIfRequested(report, options.output);\n}\n","import type { OkxConfig } from \"@agent-tradekit/core\";\nimport { loadConfig } from \"@agent-tradekit/core\";\n\nexport interface LoadProfileOptions {\n profile?: string;\n modules?: string;\n readOnly?: boolean;\n demo?: boolean;\n site?: string;\n userAgent?: string;\n sourceTag?: string;\n verbose?: boolean;\n}\n\n/**\n * Load config for CLI commands.\n * Delegates to core's loadConfig which handles the full priority chain:\n * env vars > ~/.okx/config.toml (selected profile) > defaults\n */\nexport function loadProfileConfig(opts: LoadProfileOptions): OkxConfig {\n return loadConfig({\n profile: opts.profile,\n modules: opts.modules,\n readOnly: opts.readOnly ?? false,\n demo: opts.demo ?? false,\n site: opts.site,\n userAgent: opts.userAgent,\n sourceTag: opts.sourceTag,\n verbose: opts.verbose,\n });\n}\n","import { EOL } from \"node:os\";\nimport { SUPPORTED_CLIENTS } from \"./commands/client-setup.js\";\nimport { configFilePath } from \"@agent-tradekit/core\";\nimport { output, outputLine, errorLine } from \"./formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Help tree data structures\n// ---------------------------------------------------------------------------\n\ninterface CommandInfo {\n /** Full usage line, e.g. \"okx bot grid create --instId <id> ...\" */\n usage: string;\n /** Short description of what the command does */\n description: string;\n}\n\ninterface GroupInfo {\n /** One-line description shown in parent overview */\n description: string;\n /** Optional direct usage line when the group has no sub-commands */\n usage?: string;\n /** Leaf commands within this group */\n commands?: Record<string, CommandInfo>;\n /** Nested sub-groups (e.g. bot → grid, spot → algo) */\n subgroups?: Record<string, GroupInfo>;\n}\n\ntype HelpTree = Record<string, GroupInfo>;\n\n// ---------------------------------------------------------------------------\n// Help data — descriptions are intentionally kept in sync with core ToolSpec\n// ---------------------------------------------------------------------------\n\nconst HELP_TREE: HelpTree = {\n market: {\n description: \"Market data (ticker, orderbook, candles, trades)\",\n commands: {\n ticker: {\n usage: \"okx market ticker <instId>\",\n description: \"Get latest ticker data for an instrument\",\n },\n tickers: {\n usage: \"okx market tickers <instType>\",\n description: \"Get all tickers for an instrument type (SPOT|SWAP|FUTURES|OPTION)\",\n },\n orderbook: {\n usage: \"okx market orderbook <instId> [--sz <n>]\",\n description: \"Get order book depth for an instrument\",\n },\n candles: {\n usage: \"okx market candles <instId> [--bar <bar>] [--limit <n>]\",\n description: \"Get candlestick (OHLCV) data\",\n },\n instruments: {\n usage: \"okx market instruments --instType <type> [--instId <id>]\",\n description: \"List tradable instruments of a given type\",\n },\n \"funding-rate\": {\n usage: \"okx market funding-rate <instId> [--history] [--limit <n>]\",\n description: \"Get current or historical funding rate for perpetual swaps\",\n },\n \"mark-price\": {\n usage: \"okx market mark-price --instType <MARGIN|SWAP|FUTURES|OPTION> [--instId <id>]\",\n description: \"Get mark price for instruments\",\n },\n trades: {\n usage: \"okx market trades <instId> [--limit <n>]\",\n description: \"Get recent trades for an instrument\",\n },\n \"index-ticker\": {\n usage: \"okx market index-ticker [--instId <id>] [--quoteCcy <ccy>]\",\n description: \"Get index ticker data\",\n },\n \"index-candles\": {\n usage: \"okx market index-candles <instId> [--bar <bar>] [--limit <n>] [--history]\",\n description: \"Get index candlestick data\",\n },\n \"price-limit\": {\n usage: \"okx market price-limit <instId>\",\n description: \"Get price limit for an instrument\",\n },\n \"open-interest\": {\n usage: \"okx market open-interest --instType <SWAP|FUTURES|OPTION> [--instId <id>]\",\n description: \"Get open interest for instruments\",\n },\n \"stock-tokens\": {\n usage: \"okx market stock-tokens [--instType <SPOT|SWAP>] [--instId <id>]\",\n description: \"List all stock token instruments (instCategory=3, e.g. AAPL-USDT-SWAP)\",\n },\n },\n },\n\n account: {\n description: \"Account balance, positions, bills, and configuration\",\n commands: {\n balance: {\n usage: \"okx account balance [<ccy>]\",\n description: \"Get trading account balance\",\n },\n \"asset-balance\": {\n usage: \"okx account asset-balance [--ccy <ccy>]\",\n description: \"Get funding account asset balance\",\n },\n positions: {\n usage: \"okx account positions [--instType <type>] [--instId <id>]\",\n description: \"Get current open positions\",\n },\n \"positions-history\": {\n usage: \"okx account positions-history [--instType <type>] [--instId <id>] [--limit <n>]\",\n description: \"Get historical positions\",\n },\n bills: {\n usage: \"okx account bills [--instType <type>] [--ccy <ccy>] [--limit <n>] [--archive]\",\n description: \"Get account bill history\",\n },\n fees: {\n usage: \"okx account fees --instType <type> [--instId <id>]\",\n description: \"Get trading fee rates\",\n },\n config: {\n usage: \"okx account config\",\n description: \"Get account configuration\",\n },\n \"set-position-mode\": {\n usage: \"okx account set-position-mode --posMode <long_short_mode|net_mode>\",\n description: \"Set position mode (long/short or net)\",\n },\n \"max-size\": {\n usage: \"okx account max-size --instId <id> --tdMode <cross|isolated> [--px <price>]\",\n description: \"Get maximum order size for an instrument\",\n },\n \"max-avail-size\": {\n usage: \"okx account max-avail-size --instId <id> --tdMode <cross|isolated|cash>\",\n description: \"Get maximum available tradable amount\",\n },\n \"max-withdrawal\": {\n usage: \"okx account max-withdrawal [--ccy <ccy>]\",\n description: \"Get maximum withdrawable amount\",\n },\n transfer: {\n usage: \"okx account transfer --ccy <ccy> --amt <n> --from <acct> --to <acct> [--transferType <0|1|2|3>]\",\n description: \"Transfer funds between accounts\",\n },\n audit: {\n usage: \"okx account audit [--tool <name>] [--since <ISO-date>] [--limit <n>]\",\n description: \"Audit account activity and tool call history\",\n },\n },\n },\n\n spot: {\n description: \"Spot trading (orders, algo orders)\",\n commands: {\n orders: {\n usage: \"okx spot orders [--instId <id>] [--history]\",\n description: \"List open or historical spot orders\",\n },\n get: {\n usage: \"okx spot get --instId <id> --ordId <id>\",\n description: \"Get details of a specific spot order\",\n },\n fills: {\n usage: \"okx spot fills [--instId <id>] [--ordId <id>]\",\n description: \"Get trade fill history for spot orders\",\n },\n place: {\n usage: \"okx spot place --instId <id> --side <buy|sell> --ordType <type> --sz <n> [--px <price>] [--tdMode <cash|cross|isolated>] [--tpTriggerPx <price>] [--tpOrdPx <price|-1>] [--slTriggerPx <price>] [--slOrdPx <price|-1>]\",\n description: \"Place a new spot order (supports attached TP/SL)\",\n },\n amend: {\n usage: \"okx spot amend --instId <id> --ordId <id> [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending spot order\",\n },\n cancel: {\n usage: \"okx spot cancel <instId> --ordId <id>\",\n description: \"Cancel a pending spot order\",\n },\n batch: {\n usage: \"okx spot batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel spot orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Spot algo orders (conditional, OCO, take-profit/stop-loss)\",\n commands: {\n orders: {\n usage: \"okx spot algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List spot algo orders\",\n },\n place: {\n usage: \"okx spot algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>] [--tdMode <cash|cross|isolated>]\",\n description: \"Place a spot algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx spot algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending spot algo order\",\n },\n cancel: {\n usage: \"okx spot algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending spot algo order\",\n },\n },\n },\n },\n },\n\n swap: {\n description: \"Perpetual swap trading (orders, algo orders)\",\n commands: {\n positions: {\n usage: \"okx swap positions [<instId>]\",\n description: \"Get current perpetual swap positions\",\n },\n orders: {\n usage: \"okx swap orders [--instId <id>] [--history] [--archive]\",\n description: \"List open or historical swap orders\",\n },\n get: {\n usage: \"okx swap get --instId <id> --ordId <id>\",\n description: \"Get details of a specific swap order\",\n },\n fills: {\n usage: \"okx swap fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for swap orders\",\n },\n place: {\n usage: \"okx swap place --instId <id> --side <buy|sell> --ordType <type> --sz <n> [--posSide <side>] [--px <price>] [--tdMode <cross|isolated>] [--tpTriggerPx <price>] [--tpOrdPx <price|-1>] [--slTriggerPx <price>] [--slOrdPx <price|-1>]\",\n description: \"Place a new perpetual swap order (supports attached TP/SL)\",\n },\n cancel: {\n usage: \"okx swap cancel <instId> --ordId <id>\",\n description: \"Cancel a pending swap order\",\n },\n amend: {\n usage: \"okx swap amend --instId <id> --ordId <id> [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending swap order\",\n },\n close: {\n usage: \"okx swap close --instId <id> --mgnMode <cross|isolated> [--posSide <net|long|short>] [--autoCxl]\",\n description: \"Close a swap position\",\n },\n leverage: {\n usage: \"okx swap leverage --instId <id> --lever <n> --mgnMode <cross|isolated> [--posSide <side>]\",\n description: \"Set leverage for a swap instrument\",\n },\n \"get-leverage\": {\n usage: \"okx swap get-leverage --instId <id> --mgnMode <cross|isolated>\",\n description: \"Get current leverage setting for a swap instrument\",\n },\n batch: {\n usage: \"okx swap batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel swap orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Perpetual swap algo orders (trailing stop, conditional, OCO)\",\n commands: {\n orders: {\n usage: \"okx swap algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List swap algo orders\",\n },\n trail: {\n usage: \"okx swap algo trail --instId <id> --side <buy|sell> --sz <n> --callbackRatio <ratio>\\n [--activePx <price>] [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a trailing stop algo order for perpetual swap\",\n },\n place: {\n usage: \"okx swap algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>]\\n [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a swap algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx swap algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending swap algo order\",\n },\n cancel: {\n usage: \"okx swap algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending swap algo order\",\n },\n },\n },\n },\n },\n\n futures: {\n description: \"Futures trading (orders, positions, algo orders, leverage)\",\n commands: {\n orders: {\n usage: \"okx futures orders [--instId <id>] [--history] [--archive]\",\n description: \"List open or historical futures orders\",\n },\n positions: {\n usage: \"okx futures positions [--instId <id>]\",\n description: \"Get current futures positions\",\n },\n fills: {\n usage: \"okx futures fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for futures orders\",\n },\n place: {\n usage: \"okx futures place --instId <id> --side <buy|sell> --ordType <type> --sz <n>\\n [--tdMode <cross|isolated>] [--posSide <net|long|short>] [--px <price>] [--reduceOnly]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>] [--slTriggerPx <price>] [--slOrdPx <price|-1>]\",\n description: \"Place a new futures order (supports attached TP/SL)\",\n },\n cancel: {\n usage: \"okx futures cancel <instId> --ordId <id>\",\n description: \"Cancel a pending futures order\",\n },\n amend: {\n usage: \"okx futures amend --instId <id> [--ordId <id>] [--clOrdId <id>] [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending futures order\",\n },\n get: {\n usage: \"okx futures get --instId <id> --ordId <id>\",\n description: \"Get details of a specific futures order\",\n },\n close: {\n usage: \"okx futures close --instId <id> --mgnMode <cross|isolated> [--posSide <net|long|short>] [--autoCxl]\",\n description: \"Close a futures position\",\n },\n \"get-leverage\": {\n usage: \"okx futures get-leverage --instId <id> --mgnMode <cross|isolated>\",\n description: \"Get current leverage for a futures instrument\",\n },\n leverage: {\n usage: \"okx futures leverage --instId <id> --lever <n> --mgnMode <cross|isolated> [--posSide <net|long|short>]\",\n description: \"Set leverage for a futures instrument\",\n },\n batch: {\n usage: \"okx futures batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel futures orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Futures algo orders (trailing stop, conditional, OCO)\",\n commands: {\n orders: {\n usage: \"okx futures algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List futures algo orders\",\n },\n trail: {\n usage: \"okx futures algo trail --instId <id> --side <buy|sell> --sz <n> --callbackRatio <ratio>\\n [--activePx <price>] [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a trailing stop algo order for futures\",\n },\n place: {\n usage: \"okx futures algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>]\\n [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a futures algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx futures algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending futures algo order\",\n },\n cancel: {\n usage: \"okx futures algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending futures algo order\",\n },\n },\n },\n },\n },\n\n option: {\n description: \"Options trading (orders, positions, greeks)\",\n commands: {\n orders: {\n usage: \"okx option orders [--instId <id>] [--uly <uly>] [--history] [--archive]\",\n description: \"List open or historical option orders\",\n },\n get: {\n usage: \"okx option get --instId <id> [--ordId <id>] [--clOrdId <id>]\",\n description: \"Get details of a specific option order\",\n },\n positions: {\n usage: \"okx option positions [--instId <id>] [--uly <uly>]\",\n description: \"Get current option positions\",\n },\n fills: {\n usage: \"okx option fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for option orders\",\n },\n instruments: {\n usage: \"okx option instruments --uly <uly> [--expTime <date>]\",\n description: \"List tradable option instruments for an underlying\",\n },\n greeks: {\n usage: \"okx option greeks --uly <uly> [--expTime <date>]\",\n description: \"Get option greeks (delta, gamma, theta, vega)\",\n },\n place: {\n usage: \"okx option place --instId <id> --tdMode <cash|cross|isolated> --side <buy|sell> --ordType <type> --sz <n>\\n [--px <price>] [--reduceOnly] [--clOrdId <id>]\",\n description: \"Place a new option order\",\n },\n cancel: {\n usage: \"okx option cancel --instId <id> [--ordId <id>] [--clOrdId <id>]\",\n description: \"Cancel a pending option order\",\n },\n amend: {\n usage: \"okx option amend --instId <id> [--ordId <id>] [--clOrdId <id>] [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending option order\",\n },\n \"batch-cancel\": {\n usage: \"okx option batch-cancel --orders '<json>'\",\n description: \"Batch cancel option orders\",\n },\n },\n },\n\n earn: {\n description: \"Earn products — Simple Earn, On-chain Earn, and DCD (Dual Currency Deposit)\",\n subgroups: {\n savings: {\n description: \"Simple Earn — flexible savings and lending\",\n commands: {\n balance: {\n usage: \"okx earn savings balance [<ccy>]\",\n description: \"Get savings balance (optionally filter by currency)\",\n },\n purchase: {\n usage: \"okx earn savings purchase --ccy <ccy> --amt <n> [--rate <rate>]\",\n description: \"Purchase Simple Earn (flexible savings). Rate defaults to 0.01 (1%)\",\n },\n redeem: {\n usage: \"okx earn savings redeem --ccy <ccy> --amt <n>\",\n description: \"Redeem Simple Earn (flexible savings)\",\n },\n \"set-rate\": {\n usage: \"okx earn savings set-rate --ccy <ccy> --rate <rate>\",\n description: \"Set lending rate for a currency\",\n },\n \"lending-history\": {\n usage: \"okx earn savings lending-history [--ccy <ccy>] [--limit <n>]\",\n description: \"Get personal lending records (requires auth)\",\n },\n \"rate-history\": {\n usage: \"okx earn savings rate-history [--ccy <ccy>] [--limit <n>]\",\n description: \"Query Simple Earn lending rates (public, no auth needed)\",\n },\n },\n },\n onchain: {\n description: \"On-chain Earn — staking and DeFi products\",\n commands: {\n offers: {\n usage: \"okx earn onchain offers [--productId <id>] [--protocolType <type>] [--ccy <ccy>]\",\n description: \"Browse available on-chain earn products (staking, DeFi)\",\n },\n purchase: {\n usage: \"okx earn onchain purchase --productId <id> --ccy <ccy> --amt <n> [--term <term>] [--tag <tag>]\",\n description: \"Purchase an on-chain earn product (stake/deposit)\",\n },\n redeem: {\n usage: \"okx earn onchain redeem --ordId <id> --protocolType <type> [--allowEarlyRedeem]\",\n description: \"Redeem an on-chain earn position\",\n },\n cancel: {\n usage: \"okx earn onchain cancel --ordId <id> --protocolType <type>\",\n description: \"Cancel a pending on-chain earn order\",\n },\n orders: {\n usage: \"okx earn onchain orders [--productId <id>] [--protocolType <type>] [--ccy <ccy>] [--state <state>]\",\n description: \"List active on-chain earn orders\",\n },\n history: {\n usage: \"okx earn onchain history [--productId <id>] [--protocolType <type>] [--ccy <ccy>]\",\n description: \"Get on-chain earn order history\",\n },\n },\n },\n \"auto-earn\": {\n description: \"Auto-earn — automatically lend, stake, or earn on idle assets\",\n commands: {\n status: {\n usage: \"okx earn auto-earn status [<ccy>]\",\n description: \"Query auto-earn status for all or a specific currency\",\n },\n on: {\n usage: \"okx earn auto-earn on <ccy>\",\n description: \"Enable auto-earn for a currency (auto-detects lend/stake vs USDG earn)\",\n },\n off: {\n usage: \"okx earn auto-earn off <ccy>\",\n description: \"Disable auto-earn for a currency\",\n },\n },\n },\n dcd: {\n description: \"DCD (Dual Currency Deposit) — structured products with fixed yield\",\n commands: {\n pairs: {\n usage: \"okx earn dcd pairs\",\n description: \"List available DCD currency pairs\",\n },\n products: {\n usage: \"okx earn dcd products --baseCcy <ccy> --quoteCcy <ccy> --optType <C|P>\\n [--minYield <n>] [--strikeNear <price>]\\n [--termDays <n>] [--minTermDays <n>] [--maxTermDays <n>]\\n [--expDate <YYYY-MM-DD|YYYY-MM-DDTHH:mm>]\",\n description: \"List active DCD products (baseCcy, quoteCcy, optType required). Client-side filters: minYield (e.g. 0.05=5%), strikeNear (±10%), term range, expDate\",\n },\n \"quote-and-buy\": {\n usage: \"okx earn dcd quote-and-buy --productId <id> --sz <n> --notionalCcy <ccy> [--clOrdId <id>] [--minAnnualizedYield <pct>]\",\n description: \"[CAUTION] Subscribe to a DCD product atomically (quote + execute in one step)\",\n },\n \"redeem-execute\": {\n usage: \"okx earn dcd redeem-execute --ordId <id>\",\n description: \"[CAUTION] Re-quote and execute early redemption in one step (recommended for AI agent use)\",\n },\n order: {\n usage: \"okx earn dcd order --ordId <id>\",\n description: \"Query current state of a DCD order\",\n },\n orders: {\n usage: \"okx earn dcd orders [--ordId <id>] [--productId <id>] [--uly <uly>] [--state <state>] [--limit <n>]\",\n description: \"Get DCD order history. State: initial|live|pending_settle|settled|pending_redeem|redeemed|rejected\",\n },\n },\n },\n },\n },\n\n bot: {\n description: \"Trading bot strategies (grid, dca)\",\n subgroups: {\n grid: {\n description: \"Grid trading bot — create, monitor, and stop grid orders\",\n commands: {\n orders: {\n usage: \"okx bot grid orders --algoOrdType <grid|contract_grid|moon_grid> [--instId <id>] [--algoId <id>] [--history]\",\n description: \"List active or historical grid bot orders\",\n },\n details: {\n usage: \"okx bot grid details --algoOrdType <type> --algoId <id>\",\n description: \"Get details of a specific grid bot order\",\n },\n \"sub-orders\": {\n usage: \"okx bot grid sub-orders --algoOrdType <type> --algoId <id> [--live]\",\n description: \"List sub-orders of a grid bot (filled or live)\",\n },\n create: {\n usage: \"okx bot grid create --instId <id> --algoOrdType <grid|contract_grid> --maxPx <px> --minPx <px> --gridNum <n>\\n [--runType <1|2>] [--quoteSz <n>] [--baseSz <n>]\\n [--direction <long|short|neutral>] [--lever <n>] [--sz <n>] [--basePos] [--no-basePos]\\n [--tpTriggerPx <px>] [--slTriggerPx <px>] [--tpRatio <n>] [--slRatio <n>] [--algoClOrdId <id>]\",\n description: \"Create a new grid bot order (contract grid opens base position by default)\",\n },\n stop: {\n usage: \"okx bot grid stop --algoId <id> --algoOrdType <type> --instId <id> [--stopType <1|2|3|5|6>]\",\n description: \"Stop a running grid bot order\",\n },\n },\n },\n dca: {\n description: \"DCA (Martingale) bot — spot or contract recurring buys\",\n commands: {\n orders: {\n usage: \"okx bot dca orders [--algoOrdType <spot_dca|contract_dca>] [--algoId <id>] [--instId <id>] [--history]\",\n description: \"List DCA bots (spot and/or contract)\",\n },\n details: {\n usage: \"okx bot dca details --algoOrdType <spot_dca|contract_dca> --algoId <id>\",\n description: \"Get DCA bot details (spot or contract)\",\n },\n \"sub-orders\": {\n usage: \"okx bot dca sub-orders --algoOrdType <spot_dca|contract_dca> --algoId <id> [--cycleId <id>]\",\n description: \"Get DCA cycles/orders (spot or contract)\",\n },\n create: {\n usage: \"okx bot dca create --algoOrdType <spot_dca|contract_dca> --instId <id> --direction <long|short>\\n --initOrdAmt <n> --maxSafetyOrds <n> --tpPct <n>\\n [--lever <n>] [--safetyOrdAmt <n>] [--pxSteps <n>] [--pxStepsMult <n>] [--volMult <n>]\\n [--slPct <n>] [--slMode <limit|market>] [--allowReinvest <true|false>]\\n [--triggerStrategy <instant|price|rsi>] [--triggerPx <price>]\\n [--algoClOrdId <id>] [--reserveFunds <true|false>] [--tradeQuoteCcy <ccy>]\\n Note: --lever required for contract_dca; safetyOrdAmt, pxSteps, pxStepsMult, volMult required when maxSafetyOrds > 0\",\n description: \"Create a DCA (Martingale) bot (spot or contract)\",\n },\n stop: {\n usage: \"okx bot dca stop --algoOrdType <spot_dca|contract_dca> --algoId <id> [--stopType <1|2>]\\n Note: --stopType required for spot_dca (1=sell all, 2=keep tokens)\",\n description: \"Stop a DCA bot (spot or contract)\",\n },\n },\n },\n },\n },\n\n config: {\n description: \"Manage CLI configuration profiles\",\n commands: {\n init: {\n usage: \"okx config init [--lang zh]\",\n description: \"Initialize a new configuration profile interactively\",\n },\n show: {\n usage: \"okx config show\",\n description: `Show current configuration (file: ${configFilePath()})`,\n },\n set: {\n usage: \"okx config set <key> <value>\",\n description: \"Set a configuration value\",\n },\n \"setup-clients\": {\n usage: \"okx config setup-clients\",\n description: \"Set up MCP client integrations (Cursor, Windsurf, etc.)\",\n },\n },\n },\n\n setup: {\n description: \"Set up client integrations (Cursor, Windsurf, Claude, etc.)\",\n usage: `okx setup --client <${SUPPORTED_CLIENTS.join(\"|\")}> [--profile <name>] [--modules <list>]`,\n },\n\n diagnose: {\n description: \"Run network / MCP server diagnostics\",\n usage: \"okx diagnose [--cli | --mcp | --all] [--profile <name>] [--demo] [--output <file>]\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Rendering helpers\n// ---------------------------------------------------------------------------\n\n/** Render the global overview (no path arguments). */\nfunction printGlobalHelp(): void {\n const lines: string[] = [\n \"\",\n `Usage: okx [--profile <name>] [--demo] [--json] <module> <action> [args...]`,\n \"\",\n \"Global Options:\",\n ` --profile <name> Use a named profile from ${configFilePath()}`,\n \" --demo Use simulated trading (demo) mode\",\n \" --json Output raw JSON\",\n \" --verbose Show detailed network request/response info (stderr)\",\n \" --version, -v Show version\",\n \" --help Show this help\",\n \"\",\n \"Modules:\",\n ];\n\n const colWidth = 12;\n for (const [name, group] of Object.entries(HELP_TREE)) {\n lines.push(` ${name.padEnd(colWidth)}${group.description}`);\n }\n\n lines.push(\"\", 'Run \"okx <module> --help\" for module details.', \"\");\n output(lines.join(EOL));\n}\n\n/** Render module-level help (one path argument, e.g. \"spot\"). */\nfunction printModuleHelp(moduleName: string): void {\n const group = HELP_TREE[moduleName];\n if (!group) {\n errorLine(`Unknown module: ${moduleName}`);\n process.exitCode = 1;\n return;\n }\n\n const hasSubgroups = group.subgroups && Object.keys(group.subgroups).length > 0;\n const hasCommands = group.commands && Object.keys(group.commands).length > 0;\n\n const lines: string[] = [\"\"];\n\n if (hasSubgroups && !hasCommands) {\n // Pure subgroup module (e.g. bot)\n const subgroupNames = Object.keys(group.subgroups!);\n lines.push(`Usage: okx ${moduleName} <strategy> <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\");\n lines.push(\"Strategies:\");\n const colWidth = Math.max(...subgroupNames.map((n) => n.length)) + 4;\n for (const [sgName, sg] of Object.entries(group.subgroups!)) {\n lines.push(` ${sgName.padEnd(colWidth)}${sg.description}`);\n }\n lines.push(\"\", `Run \"okx ${moduleName} <strategy> --help\" for details.`);\n } else if (hasSubgroups && hasCommands) {\n // Mixed: has both direct commands and subgroups (e.g. spot, swap)\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n lines.push(\"\", \"Subgroups:\");\n const subgroupEntries = Object.entries(group.subgroups!);\n const colWidth = Math.max(...subgroupEntries.map(([n]) => n.length)) + 4;\n for (const [sgName, sg] of subgroupEntries) {\n lines.push(` ${sgName.padEnd(colWidth)}${sg.description}`);\n }\n lines.push(\"\", `Run \"okx ${moduleName} <subgroup> --help\" for subgroup details.`);\n } else if (hasCommands) {\n // Plain module with direct commands only (e.g. market, account)\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n } else if (group.usage) {\n // Module with no sub-commands (e.g. setup)\n lines.push(`Usage: ${group.usage}`);\n lines.push(\"\", `${group.description}.`);\n if (group.commands) {\n lines.push(\"\");\n for (const cmd of Object.values(group.commands)) {\n lines.push(` ${cmd.description}`);\n lines.push(` Usage: ${cmd.usage}`);\n }\n }\n }\n\n lines.push(\"\");\n output(lines.join(EOL));\n}\n\n/** Render subgroup-level help (two path arguments, e.g. \"bot\", \"grid\"). */\nfunction printSubgroupHelp(moduleName: string, subgroupName: string): void {\n const group = HELP_TREE[moduleName];\n if (!group) {\n errorLine(`Unknown module: ${moduleName}`);\n process.exitCode = 1;\n return;\n }\n const subgroup = group.subgroups?.[subgroupName];\n if (!subgroup) {\n errorLine(`Unknown subgroup: ${moduleName} ${subgroupName}`);\n process.exitCode = 1;\n return;\n }\n\n const lines: string[] = [\n \"\",\n `Usage: okx ${moduleName} ${subgroupName} <action> [args...]`,\n \"\",\n `${subgroup.description}.`,\n \"\",\n \"Commands:\",\n ];\n\n if (subgroup.commands) {\n printCommandList(lines, subgroup.commands);\n }\n\n lines.push(\"\");\n output(lines.join(EOL));\n}\n\n/** Append a formatted command list to the lines array. */\nfunction printCommandList(lines: string[], commands: Record<string, CommandInfo>): void {\n const names = Object.keys(commands);\n const colWidth = Math.max(...names.map((n) => n.length)) + 4;\n\n for (const [name, cmd] of Object.entries(commands)) {\n lines.push(` ${name.padEnd(colWidth)}${cmd.description}`);\n // Indent usage lines to align with the description column\n const usageLines = cmd.usage.split(\"\\n\");\n lines.push(` ${\" \".repeat(colWidth)}Usage: ${usageLines[0]}`);\n for (const extra of usageLines.slice(1)) {\n lines.push(` ${\" \".repeat(colWidth)} ${extra.trimStart()}`);\n }\n lines.push(\"\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Print help text to stdout.\n *\n * - `printHelp()` — global module overview\n * - `printHelp(\"market\")` — module detail with all commands\n * - `printHelp(\"bot\")` — module overview listing sub-strategies\n * - `printHelp(\"bot\", \"grid\")` — subgroup detail with all commands\n * - `printHelp(\"spot\", \"algo\")` — subgroup detail with all commands\n */\nexport function printHelp(...path: string[]): void {\n const [moduleName, subgroupName] = path;\n if (!moduleName) {\n printGlobalHelp();\n } else if (!subgroupName) {\n printModuleHelp(moduleName);\n } else {\n printSubgroupHelp(moduleName, subgroupName);\n }\n}\n","import * as fs from \"node:fs\";\nimport { runSetup, printSetupUsage, getConfigPath, SUPPORTED_CLIENTS } from \"@agent-tradekit/core\";\nimport { outputLine } from \"../formatter.js\";\nimport type { ClientId, SetupOptions } from \"@agent-tradekit/core\";\n\nexport type { ClientId, SetupOptions };\nexport { runSetup, printSetupUsage, SUPPORTED_CLIENTS };\n\n/** Clients whose config files can be auto-detected on disk. */\nconst DETECTABLE_CLIENTS: ClientId[] = [\"claude-desktop\", \"cursor\", \"windsurf\"];\n\n/**\n * Non-interactive setup for a specific client.\n */\nexport function cmdSetupClient(options: SetupOptions): void {\n runSetup(options);\n}\n\n/**\n * Auto-detect installed clients and print what was found.\n * Kept for backward compatibility with `okx config setup-clients`.\n */\nexport function cmdSetupClients(): void {\n const detected: { id: ClientId; path: string }[] = [];\n for (const id of DETECTABLE_CLIENTS) {\n const p = getConfigPath(id);\n if (p && fs.existsSync(p)) {\n detected.push({ id, path: p });\n }\n }\n\n if (detected.length > 0) {\n outputLine(\"Detected clients:\");\n for (const { id, path } of detected) {\n outputLine(` ${id.padEnd(16)} ${path}`);\n }\n outputLine(\"\");\n }\n\n printSetupUsage();\n}\n","import { parseArgs } from \"node:util\";\n\nexport interface CliValues {\n profile?: string;\n demo?: boolean;\n json?: boolean;\n help?: boolean;\n version?: boolean;\n client?: string;\n modules?: string;\n bar?: string;\n limit?: string;\n sz?: string;\n instId?: string;\n history?: boolean;\n ordId?: string;\n side?: string;\n ordType?: string;\n px?: string;\n posSide?: string;\n tdMode?: string;\n tgtCcy?: string;\n lever?: string;\n mgnMode?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n algoId?: string;\n reduceOnly?: boolean;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n algoOrdType?: string;\n gridNum?: string;\n maxPx?: string;\n minPx?: string;\n runType?: string;\n quoteSz?: string;\n baseSz?: string;\n direction?: string;\n basePos?: boolean;\n tpRatio?: string;\n slRatio?: string;\n algoClOrdId?: string;\n stopType?: string;\n live?: boolean;\n instType?: string;\n quoteCcy?: string;\n archive?: boolean;\n posMode?: string;\n ccy?: string;\n from?: string;\n to?: string;\n transferType?: string;\n subAcct?: string;\n amt?: string;\n autoCxl?: boolean;\n clOrdId?: string;\n newPx?: string;\n // dca bot (spot & contract)\n initOrdAmt?: string;\n safetyOrdAmt?: string;\n maxSafetyOrds?: string;\n pxSteps?: string;\n pxStepsMult?: string;\n volMult?: string;\n tpPct?: string;\n slPct?: string;\n slMode?: string;\n allowReinvest?: string;\n triggerStrategy?: string;\n triggerPx?: string;\n cycleId?: string;\n reserveFunds?: string;\n tradeQuoteCcy?: string;\n lang?: string;\n // option\n uly?: string;\n expTime?: string;\n // batch\n action?: string;\n orders?: string;\n // earn\n rate?: string;\n // audit\n since?: string;\n tool?: string;\n // config profile\n force?: boolean;\n // onchain-earn\n productId?: string;\n protocolType?: string;\n term?: string;\n tag?: string;\n allowEarlyRedeem?: boolean;\n state?: string;\n // dcd\n quoteId?: string;\n notionalCcy?: string;\n optType?: string;\n baseCcy?: string;\n beginId?: string;\n endId?: string;\n begin?: string;\n end?: string;\n minYield?: string;\n strikeNear?: string;\n termDays?: string;\n minTermDays?: string;\n maxTermDays?: string;\n expDate?: string;\n minAnnualizedYield?: string;\n // indicator\n params?: string;\n list?: boolean;\n \"backtest-time\"?: string;\n // diagnostics (diagnose-specific flags)\n verbose?: boolean;\n mcp?: boolean; // diagnose --mcp: run MCP server checks only\n cli?: boolean; // diagnose --cli: run CLI/general checks only (explicit alias for default)\n all?: boolean; // diagnose --all: run CLI checks then MCP checks\n output?: string; // diagnose --output: save diagnostic report to file\n}\n\nexport const CLI_OPTIONS = {\n profile: { type: \"string\" },\n demo: { type: \"boolean\", default: false },\n json: { type: \"boolean\", default: false },\n help: { type: \"boolean\", default: false },\n version: { type: \"boolean\", short: \"v\", default: false },\n // setup command\n client: { type: \"string\" },\n modules: { type: \"string\" },\n // market candles\n bar: { type: \"string\" },\n limit: { type: \"string\" },\n sz: { type: \"string\" },\n // orders\n instId: { type: \"string\" },\n history: { type: \"boolean\", default: false },\n ordId: { type: \"string\" },\n // trade\n side: { type: \"string\" },\n ordType: { type: \"string\" },\n px: { type: \"string\" },\n posSide: { type: \"string\" },\n tdMode: { type: \"string\" },\n tgtCcy: { type: \"string\" },\n // leverage\n lever: { type: \"string\" },\n mgnMode: { type: \"string\" },\n // algo orders\n tpTriggerPx: { type: \"string\" },\n tpOrdPx: { type: \"string\" },\n slTriggerPx: { type: \"string\" },\n slOrdPx: { type: \"string\" },\n algoId: { type: \"string\" },\n reduceOnly: { type: \"boolean\", default: false },\n // algo amend\n newSz: { type: \"string\" },\n newTpTriggerPx: { type: \"string\" },\n newTpOrdPx: { type: \"string\" },\n newSlTriggerPx: { type: \"string\" },\n newSlOrdPx: { type: \"string\" },\n // trailing stop\n callbackRatio: { type: \"string\" },\n callbackSpread: { type: \"string\" },\n activePx: { type: \"string\" },\n // grid bot\n algoOrdType: { type: \"string\" },\n gridNum: { type: \"string\" },\n maxPx: { type: \"string\" },\n minPx: { type: \"string\" },\n runType: { type: \"string\" },\n quoteSz: { type: \"string\" },\n baseSz: { type: \"string\" },\n direction: { type: \"string\" },\n basePos: { type: \"boolean\", default: true },\n tpRatio: { type: \"string\" },\n slRatio: { type: \"string\" },\n algoClOrdId: { type: \"string\" },\n stopType: { type: \"string\" },\n live: { type: \"boolean\", default: false },\n // market extras\n instType: { type: \"string\" },\n quoteCcy: { type: \"string\" },\n // account extras\n archive: { type: \"boolean\", default: false },\n posMode: { type: \"string\" },\n ccy: { type: \"string\" },\n from: { type: \"string\" },\n to: { type: \"string\" },\n transferType: { type: \"string\" },\n subAcct: { type: \"string\" },\n amt: { type: \"string\" },\n // swap/order extras\n autoCxl: { type: \"boolean\", default: false },\n clOrdId: { type: \"string\" },\n newPx: { type: \"string\" },\n // dca bot (spot & contract)\n initOrdAmt: { type: \"string\" },\n safetyOrdAmt: { type: \"string\" },\n maxSafetyOrds: { type: \"string\" },\n pxSteps: { type: \"string\" },\n pxStepsMult: { type: \"string\" },\n volMult: { type: \"string\" },\n tpPct: { type: \"string\" },\n slPct: { type: \"string\" },\n slMode: { type: \"string\" },\n allowReinvest: { type: \"string\" },\n triggerStrategy: { type: \"string\" },\n triggerPx: { type: \"string\" },\n cycleId: { type: \"string\" },\n reserveFunds: { type: \"string\" },\n tradeQuoteCcy: { type: \"string\" },\n // i18n\n lang: { type: \"string\" },\n // option\n uly: { type: \"string\" },\n expTime: { type: \"string\" },\n // batch\n action: { type: \"string\" },\n orders: { type: \"string\" },\n // earn\n rate: { type: \"string\" },\n // audit\n since: { type: \"string\" },\n tool: { type: \"string\" },\n // config profile\n force: { type: \"boolean\", default: false },\n // onchain-earn\n productId: { type: \"string\" },\n protocolType: { type: \"string\" },\n term: { type: \"string\" },\n tag: { type: \"string\" },\n allowEarlyRedeem: { type: \"boolean\", default: false },\n state: { type: \"string\" },\n // dcd\n quoteId: { type: \"string\" },\n notionalCcy: { type: \"string\" },\n optType: { type: \"string\" },\n baseCcy: { type: \"string\" },\n beginId: { type: \"string\" },\n endId: { type: \"string\" },\n begin: { type: \"string\" },\n end: { type: \"string\" },\n minYield: { type: \"string\" },\n strikeNear: { type: \"string\" },\n termDays: { type: \"string\" },\n minTermDays: { type: \"string\" },\n maxTermDays: { type: \"string\" },\n expDate: { type: \"string\" },\n minAnnualizedYield: { type: \"string\" },\n // indicator\n params: { type: \"string\" },\n list: { type: \"boolean\", default: false },\n \"backtest-time\": { type: \"string\" },\n // diagnostics — cli/mcp/all/output are diagnose-specific; verbose is shared\n verbose: { type: \"boolean\", default: false },\n mcp: { type: \"boolean\", default: false }, // diagnose --mcp only: MCP server checks\n cli: { type: \"boolean\", default: false }, // diagnose --cli only: CLI/general checks (explicit alias for default)\n all: { type: \"boolean\", default: false }, // diagnose --all: run both CLI and MCP checks\n output: { type: \"string\" }, // diagnose --output only: save report to file\n} as const;\n\nexport function parseCli(argv: string[]): { values: CliValues; positionals: string[] } {\n // Pre-process --no-<flag> for boolean options (parseArgs doesn't support negation natively)\n const negated = new Set<string>();\n const filtered = argv.filter((arg) => {\n if (arg.startsWith(\"--no-\")) {\n const key = arg.slice(5);\n if (key in CLI_OPTIONS && (CLI_OPTIONS as Record<string, { type: string }>)[key].type === \"boolean\") {\n negated.add(key);\n return false;\n }\n }\n return true;\n });\n\n const { values, positionals } = parseArgs({\n args: filtered,\n options: CLI_OPTIONS,\n allowPositionals: true,\n });\n\n for (const key of negated) {\n (values as Record<string, unknown>)[key] = false;\n }\n\n return { values: values as CliValues, positionals };\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, printJson, printKv, printTable } from \"../formatter.js\";\nimport { resolveIndicatorCode } from \"@agent-tradekit/core\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdMarketInstruments(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_instruments\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).slice(0, 50).map((t) => ({\n instId: t[\"instId\"],\n ctVal: t[\"ctVal\"],\n lotSz: t[\"lotSz\"],\n minSz: t[\"minSz\"],\n tickSz: t[\"tickSz\"],\n state: t[\"state\"],\n })),\n );\n}\n\nexport async function cmdMarketFundingRate(\n run: ToolRunner,\n instId: string,\n opts: { history: boolean; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_funding_rate\", { instId, history: opts.history, limit: opts.limit });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (opts.history) {\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n fundingRate: r[\"fundingRate\"],\n realizedRate: r[\"realizedRate\"],\n fundingTime: new Date(Number(r[\"fundingTime\"])).toLocaleString(),\n })),\n );\n } else {\n const r = items?.[0];\n if (!r) { outputLine(\"No data\"); return; }\n printKv({\n instId: r[\"instId\"],\n fundingRate: r[\"fundingRate\"],\n nextFundingRate: r[\"nextFundingRate\"],\n fundingTime: new Date(Number(r[\"fundingTime\"])).toLocaleString(),\n nextFundingTime: new Date(Number(r[\"nextFundingTime\"])).toLocaleString(),\n });\n }\n}\n\nexport async function cmdMarketMarkPrice(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_mark_price\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n instType: r[\"instType\"],\n markPx: r[\"markPx\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketTrades(\n run: ToolRunner,\n instId: string,\n opts: { limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_trades\", { instId, limit: opts.limit });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n tradeId: t[\"tradeId\"],\n px: t[\"px\"],\n sz: t[\"sz\"],\n side: t[\"side\"],\n ts: new Date(Number(t[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketIndexTicker(\n run: ToolRunner,\n opts: { instId?: string; quoteCcy?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_ticker\", { instId: opts.instId, quoteCcy: opts.quoteCcy });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n instId: t[\"instId\"],\n idxPx: t[\"idxPx\"],\n high24h: t[\"high24h\"],\n low24h: t[\"low24h\"],\n ts: new Date(Number(t[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketIndexCandles(\n run: ToolRunner,\n instId: string,\n opts: { bar?: string; limit?: number; history: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_candles\", { instId, bar: opts.bar, limit: opts.limit, history: opts.history });\n const candles = getData(result) as string[][];\n if (opts.json) return printJson(candles);\n printTable(\n (candles ?? []).map(([ts, o, h, l, c]) => ({\n time: new Date(Number(ts)).toLocaleString(),\n open: o, high: h, low: l, close: c,\n })),\n );\n}\n\nexport async function cmdMarketPriceLimit(\n run: ToolRunner,\n instId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_price_limit\", { instId });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n const r = items?.[0];\n if (!r) { outputLine(\"No data\"); return; }\n printKv({\n instId: r[\"instId\"],\n buyLmt: r[\"buyLmt\"],\n sellLmt: r[\"sellLmt\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdMarketOpenInterest(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_open_interest\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n oi: r[\"oi\"],\n oiCcy: r[\"oiCcy\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketTicker(\n run: ToolRunner,\n instId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_ticker\", { instId });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { outputLine(\"No data\"); return; }\n const t = items[0];\n printKv({\n instId: t[\"instId\"],\n last: t[\"last\"],\n \"24h open\": t[\"open24h\"],\n \"24h high\": t[\"high24h\"],\n \"24h low\": t[\"low24h\"],\n \"24h vol\": t[\"vol24h\"],\n \"24h change %\": (() => {\n const last = Number(t[\"last\"]);\n const open24h = Number(t[\"open24h\"]);\n return open24h !== 0 ? (((last - open24h) / open24h) * 100).toFixed(2) + \"%\" : \"N/A\";\n })(),\n time: new Date(Number(t[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdMarketTickers(\n run: ToolRunner,\n instType: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_tickers\", { instType });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n instId: t[\"instId\"],\n last: t[\"last\"],\n \"24h high\": t[\"high24h\"],\n \"24h low\": t[\"low24h\"],\n \"24h vol\": t[\"vol24h\"],\n })),\n );\n}\n\nexport async function cmdMarketOrderbook(\n run: ToolRunner,\n instId: string,\n sz: number | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_orderbook\", { instId, sz });\n const data = getData(result);\n if (json) return printJson(data);\n const book = (data as Record<string, unknown>[])[0];\n if (!book) { outputLine(\"No data\"); return; }\n const asks = (book[\"asks\"] as string[][]).slice(0, 5);\n const bids = (book[\"bids\"] as string[][]).slice(0, 5);\n outputLine(\"Asks (price / size):\");\n asks.reverse();\n for (const [p, s] of asks) outputLine(` ${p.padStart(16)} ${s}`);\n outputLine(\"Bids (price / size):\");\n for (const [p, s] of bids) outputLine(` ${p.padStart(16)} ${s}`);\n}\n\nexport async function cmdMarketCandles(\n run: ToolRunner,\n instId: string,\n opts: { bar?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_candles\", { instId, bar: opts.bar, limit: opts.limit });\n const candles = getData(result) as string[][];\n if (opts.json) return printJson(candles);\n printTable(\n (candles ?? []).map(([ts, o, h, l, c, vol]) => ({\n time: new Date(Number(ts)).toLocaleString(),\n open: o, high: h, low: l, close: c, vol,\n })),\n );\n}\n\nexport async function cmdMarketIndicator(\n run: ToolRunner,\n indicator: string,\n instId: string,\n opts: {\n bar?: string;\n params?: string;\n list?: boolean;\n limit?: number;\n backtestTime?: number;\n json: boolean;\n },\n): Promise<void> {\n const params = opts.params\n ? opts.params.split(\",\").map((p) => Number(p.trim())).filter((n) => !Number.isNaN(n))\n : undefined;\n\n const result = await run(\"market_get_indicator\", {\n instId,\n indicator,\n bar: opts.bar,\n params: params && params.length > 0 ? params : undefined,\n returnList: opts.list ?? false,\n limit: opts.limit,\n backtestTime: opts.backtestTime,\n });\n\n // Response shape: data = Array<{ data: [{instId, timeframes}], mode, summary, timestamp }>\n const outerArray = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(outerArray);\n\n if (!outerArray?.length) { process.stdout.write(\"No data\\n\"); return; }\n\n const apiCode = resolveIndicatorCode(indicator);\n const response = outerArray[0];\n const innerArray = response[\"data\"] as Record<string, unknown>[] | undefined;\n const instData = innerArray?.[0];\n const timeframes = instData?.[\"timeframes\"] as Record<string, unknown> | undefined;\n\n if (!timeframes) {\n process.stdout.write(JSON.stringify(outerArray, null, 2) + \"\\n\");\n return;\n }\n\n for (const [tf, tfData] of Object.entries(timeframes)) {\n const indicators = (tfData as Record<string, unknown>)?.[\"indicators\"] as Record<string, unknown> | undefined;\n const values = indicators?.[apiCode] as Record<string, unknown>[] | undefined;\n if (!values?.length) continue;\n\n process.stdout.write(`${instId} · ${apiCode} · ${tf}\\n`);\n process.stdout.write(\"─\".repeat(40) + \"\\n\");\n\n if (opts.list) {\n const tableRows = values.map((entry) => ({\n ts: new Date(Number(entry[\"ts\"])).toLocaleString(),\n ...entry[\"values\"] as Record<string, unknown>,\n }));\n printTable(tableRows);\n } else {\n const latest = values[0];\n printKv({\n ts: new Date(Number(latest[\"ts\"])).toLocaleString(),\n ...latest[\"values\"] as Record<string, unknown>,\n });\n }\n }\n}\n\nexport async function cmdMarketStockTokens(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_stock_tokens\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).slice(0, 50).map((t) => ({\n instId: t[\"instId\"],\n instCategory: t[\"instCategory\"],\n ctVal: t[\"ctVal\"],\n lotSz: t[\"lotSz\"],\n minSz: t[\"minSz\"],\n tickSz: t[\"tickSz\"],\n state: t[\"state\"],\n })),\n );\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { ToolRunner } from \"@agent-tradekit/core\";\nimport {outputLine, printJson, printKv, printTable} from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdAccountBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_balance\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const details = (data?.[0]?.[\"details\"] as Record<string, unknown>[]) ?? [];\n printTable(\n details\n .filter((d) => Number(d[\"eq\"]) > 0)\n .map((d) => ({\n currency: d[\"ccy\"],\n equity: d[\"eq\"],\n available: d[\"availEq\"],\n frozen: d[\"frozenBal\"],\n })),\n );\n}\n\nexport async function cmdAccountAssetBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_asset_balance\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n printTable(\n (data ?? [])\n .filter((r) => Number(r[\"bal\"]) > 0)\n .map((r) => ({\n ccy: r[\"ccy\"],\n bal: r[\"bal\"],\n availBal: r[\"availBal\"],\n frozenBal: r[\"frozenBal\"],\n })),\n );\n}\n\nexport async function cmdAccountPositions(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_positions\", { instType: opts.instType, instId: opts.instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { outputLine(\"No open positions\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n instType: p[\"instType\"],\n side: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdAccountBills(\n run: ToolRunner,\n opts: { archive: boolean; instType?: string; ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const toolName = opts.archive ? \"account_get_bills_archive\" : \"account_get_bills\";\n const result = await run(toolName, { instType: opts.instType, ccy: opts.ccy, limit: opts.limit });\n const bills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(bills);\n printTable(\n (bills ?? []).map((b) => ({\n billId: b[\"billId\"],\n instId: b[\"instId\"],\n type: b[\"type\"],\n ccy: b[\"ccy\"],\n balChg: b[\"balChg\"],\n bal: b[\"bal\"],\n ts: new Date(Number(b[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdAccountFees(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_trade_fee\", { instType: opts.instType, instId: opts.instId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const fee = data?.[0];\n if (!fee) { outputLine(\"No data\"); return; }\n printKv({\n level: fee[\"level\"],\n maker: fee[\"maker\"],\n taker: fee[\"taker\"],\n makerU: fee[\"makerU\"],\n takerU: fee[\"takerU\"],\n ts: new Date(Number(fee[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdAccountConfig(\n run: ToolRunner,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_config\", {});\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const cfg = data?.[0];\n if (!cfg) { outputLine(\"No data\"); return; }\n printKv({\n uid: cfg[\"uid\"],\n acctLv: cfg[\"acctLv\"],\n posMode: cfg[\"posMode\"],\n autoLoan: cfg[\"autoLoan\"],\n greeksType: cfg[\"greeksType\"],\n level: cfg[\"level\"],\n levelTmp: cfg[\"levelTmp\"],\n });\n}\n\nexport async function cmdAccountSetPositionMode(\n run: ToolRunner,\n posMode: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_set_position_mode\", { posMode });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n outputLine(`Position mode set: ${r?.[\"posMode\"]}`);\n}\n\nexport async function cmdAccountMaxSize(\n run: ToolRunner,\n opts: { instId: string; tdMode: string; px?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_max_size\", { instId: opts.instId, tdMode: opts.tdMode, px: opts.px });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n if (!r) { outputLine(\"No data\"); return; }\n printKv({ instId: r[\"instId\"], maxBuy: r[\"maxBuy\"], maxSell: r[\"maxSell\"] });\n}\n\nexport async function cmdAccountMaxAvailSize(\n run: ToolRunner,\n opts: { instId: string; tdMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_max_avail_size\", { instId: opts.instId, tdMode: opts.tdMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n if (!r) { outputLine(\"No data\"); return; }\n printKv({ instId: r[\"instId\"], availBuy: r[\"availBuy\"], availSell: r[\"availSell\"] });\n}\n\nexport async function cmdAccountMaxWithdrawal(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_max_withdrawal\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n ccy: r[\"ccy\"],\n maxWd: r[\"maxWd\"],\n maxWdEx: r[\"maxWdEx\"],\n })),\n );\n}\n\nexport async function cmdAccountPositionsHistory(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_positions_history\", { instType: opts.instType, instId: opts.instId, limit: opts.limit });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((p) => ({\n instId: p[\"instId\"],\n direction: p[\"direction\"],\n openAvgPx: p[\"openAvgPx\"],\n closeAvgPx: p[\"closeAvgPx\"],\n realizedPnl: p[\"realizedPnl\"],\n uTime: new Date(Number(p[\"uTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdAccountTransfer(\n run: ToolRunner,\n opts: {\n ccy: string;\n amt: string;\n from: string;\n to: string;\n transferType?: string;\n subAcct?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"account_transfer\", {\n ccy: opts.ccy,\n amt: opts.amt,\n from: opts.from,\n to: opts.to,\n type: opts.transferType,\n subAcct: opts.subAcct,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Transfer: ${r?.[\"transId\"]} (${r?.[\"ccy\"]} ${r?.[\"amt\"]})`);\n}\n\ninterface LogEntry {\n timestamp: string;\n tool: string;\n level: string;\n durationMs?: number;\n error?: boolean;\n}\n\nfunction readAuditLogs(logDir: string, days = 7): LogEntry[] {\n const entries: LogEntry[] = [];\n const now = new Date();\n for (let i = 0; i < days; i++) {\n const d = new Date(now);\n d.setUTCDate(now.getUTCDate() - i);\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n const filePath = path.join(logDir, `trade-${yyyy}-${mm}-${dd}.log`);\n let content: string;\n try { content = fs.readFileSync(filePath, \"utf8\"); } catch { continue; }\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try { entries.push(JSON.parse(trimmed) as LogEntry); } catch { /* skip */ }\n }\n }\n return entries;\n}\n\nexport function cmdAccountAudit(\n opts: { limit?: string; tool?: string; since?: string; json: boolean },\n): void {\n const logDir = path.join(os.homedir(), \".okx\", \"logs\");\n const limit = Math.min(Number(opts.limit) || 20, 100);\n\n let entries = readAuditLogs(logDir);\n\n if (opts.tool) entries = entries.filter((e) => e.tool === opts.tool);\n if (opts.since) {\n const sinceTime = new Date(opts.since).getTime();\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= sinceTime);\n }\n\n entries.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n entries = entries.slice(0, limit);\n\n if (opts.json) return printJson(entries);\n if (!entries.length) { outputLine(\"No audit log entries\"); return; }\n printTable(\n entries.map((e) => ({\n timestamp: e.timestamp,\n tool: e.tool,\n level: e.level,\n duration: e.durationMs != null ? `${e.durationMs}ms` : \"-\",\n status: e.error ? \"ERROR\" : \"OK\",\n })),\n );\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { errorLine, outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction emitBatchResults(items: Record<string, unknown>[]): void {\n for (const r of items) {\n const isError = r[\"sCode\"] !== \"0\" && r[\"sCode\"] !== 0;\n const id = r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\";\n if (isError) {\n errorLine(`${id}: ${r[\"sMsg\"]} (sCode ${r[\"sCode\"]})`);\n } else {\n outputLine(`${id}: OK`);\n }\n }\n}\n\nexport async function cmdSpotOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\"; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n filled: o[\"fillSz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSpotPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode?: string;\n side: string;\n ordType: string;\n sz: string;\n tgtCcy?: string;\n px?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n px: opts.px,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order placed\", \"ordId\");\n}\n\nexport async function cmdSpotCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const { instId, ordId, clOrdId, json } = opts;\n if (!ordId && !clOrdId) throw new Error(\"Either --ordId or --clOrdId is required\");\n const result = await run(\"spot_cancel_order\", { instId, ...(ordId ? { ordId } : { clOrdId }) });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Cancelled\", \"ordId\");\n}\n\nexport async function cmdSpotAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode?: string;\n side: string;\n ordType: string;\n sz: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order placed\", \"algoId\");\n}\n\nexport async function cmdSpotAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order amended\", \"algoId\");\n}\n\nexport async function cmdSpotAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"spot_cancel_algo_order\", { instId, algoId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order cancelled\", \"algoId\");\n}\n\nexport async function cmdSpotGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_order\", { instId: opts.instId, ordId: opts.ordId, clOrdId: opts.clOrdId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { outputLine(\"No data\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdSpotAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order amended\", \"ordId\");\n}\n\nexport async function cmdSpotAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { outputLine(\"No algo orders\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSpotFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_fills\", { instId: opts.instId, ordId: opts.ordId });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdSpotAlgoTrailPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n sz: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n tdMode?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: \"move_order_stop\",\n sz: opts.sz,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Trailing stop placed\", \"algoId\");\n}\n\nexport async function cmdSpotBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n errorLine(\"Error: --orders must be a valid JSON array\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n errorLine(\"Error: --orders must be a non-empty JSON array\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"spot_batch_orders\",\n amend: \"spot_batch_amend\",\n cancel: \"spot_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n errorLine(\"Error: --action must be one of: place, amend, cancel\");\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"spot_batch_orders\" ? { action: opts.action, orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitBatchResults(data ?? []);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { errorLine, outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction emitBatchResults(items: Record<string, unknown>[]): void {\n for (const r of items) {\n const isError = r[\"sCode\"] !== \"0\" && r[\"sCode\"] !== 0;\n const id = r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\";\n if (isError) {\n errorLine(`${id}: ${r[\"sMsg\"]} (sCode ${r[\"sCode\"]})`);\n } else {\n outputLine(`${id}: OK`);\n }\n }\n}\n\nexport async function cmdSwapPositions(\n run: ToolRunner,\n instId: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_get_positions\", { instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { outputLine(\"No open positions\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n side: p[\"posSide\"],\n size: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n uplRatio: p[\"uplRatio\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdSwapOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\"; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSwapPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n px?: string;\n tdMode: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n posSide: opts.posSide,\n px: opts.px,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order placed\", \"ordId\");\n}\n\nexport async function cmdSwapCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const { instId, ordId, clOrdId, json } = opts;\n if (!ordId && !clOrdId) throw new Error(\"Either --ordId or --clOrdId is required\");\n const result = await run(\"swap_cancel_order\", { instId, ...(ordId ? { ordId } : { clOrdId }) });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Cancelled\", \"ordId\");\n}\n\nexport async function cmdSwapAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n tdMode: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n reduceOnly?: boolean;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n posSide: opts.posSide,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n reduceOnly: opts.reduceOnly,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order placed\", \"algoId\");\n}\n\nexport async function cmdSwapAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order amended\", \"algoId\");\n}\n\nexport async function cmdSwapAlgoTrailPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n sz: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n posSide?: string;\n tdMode: string;\n reduceOnly?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_move_stop_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n sz: opts.sz,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n posSide: opts.posSide,\n reduceOnly: opts.reduceOnly,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Trailing stop placed\", \"algoId\");\n}\n\nexport async function cmdSwapAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_cancel_algo_orders\", { orders: [{ instId, algoId }] });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order cancelled\", \"algoId\");\n}\n\nexport async function cmdSwapAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { outputLine(\"No algo orders\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSwapFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_fills\", { instId: opts.instId, ordId: opts.ordId, archive: opts.archive });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdSwapGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_order\", { instId: opts.instId, ordId: opts.ordId, clOrdId: opts.clOrdId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { outputLine(\"No data\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdSwapClose(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; posSide?: string; autoCxl?: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_close_position\", {\n instId: opts.instId,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n autoCxl: opts.autoCxl,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Position closed: ${r?.[\"instId\"]} ${r?.[\"posSide\"] ?? \"\"}`);\n}\n\nexport async function cmdSwapGetLeverage(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_leverage\", { instId: opts.instId, mgnMode: opts.mgnMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n instId: r[\"instId\"],\n mgnMode: r[\"mgnMode\"],\n posSide: r[\"posSide\"],\n lever: r[\"lever\"],\n })),\n );\n}\n\nexport async function cmdSwapAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order amended\", \"ordId\");\n}\n\nexport async function cmdSwapSetLeverage(\n run: ToolRunner,\n opts: { instId: string; lever: string; mgnMode: string; posSide?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_set_leverage\", {\n instId: opts.instId,\n lever: opts.lever,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Leverage set: ${r?.[\"lever\"]}x ${r?.[\"instId\"]}`);\n}\n\nexport async function cmdSwapBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n errorLine(\"Error: --orders must be a valid JSON array\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n errorLine(\"Error: --orders must be a non-empty JSON array\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"swap_batch_orders\",\n amend: \"swap_batch_amend\",\n cancel: \"swap_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n errorLine(\"Error: --action must be one of: place, amend, cancel\");\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"swap_batch_orders\" ? { action: opts.action, orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitBatchResults(data ?? []);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { errorLine, outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction emitBatchResults(items: Record<string, unknown>[]): void {\n for (const r of items) {\n const isError = r[\"sCode\"] !== \"0\" && r[\"sCode\"] !== 0;\n const id = r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\";\n if (isError) {\n errorLine(`${id}: ${r[\"sMsg\"]} (sCode ${r[\"sCode\"]})`);\n } else {\n outputLine(`${id}: OK`);\n }\n }\n}\n\nexport async function cmdFuturesOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\" | \"archive\"; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdFuturesPositions(\n run: ToolRunner,\n instId: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"futures_get_positions\", { instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { outputLine(\"No open positions\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n side: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdFuturesFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_fills\", { instId: opts.instId, ordId: opts.ordId, archive: opts.archive });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdFuturesPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n tdMode: string;\n tgtCcy?: string;\n posSide?: string;\n px?: string;\n reduceOnly?: boolean;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n posSide: opts.posSide,\n px: opts.px,\n reduceOnly: opts.reduceOnly,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order placed\", \"ordId\");\n}\n\nexport async function cmdFuturesCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const { instId, ordId, clOrdId, json } = opts;\n if (!ordId && !clOrdId) throw new Error(\"Either --ordId or --clOrdId is required\");\n const result = await run(\"futures_cancel_order\", { instId, ...(ordId ? { ordId } : { clOrdId }) });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Cancelled\", \"ordId\");\n}\n\nexport async function cmdFuturesGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_order\", { instId: opts.instId, ordId: opts.ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { outputLine(\"No data\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdFuturesAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order amended\", \"ordId\");\n}\n\nexport async function cmdFuturesClose(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; posSide?: string; autoCxl?: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_close_position\", {\n instId: opts.instId,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n autoCxl: opts.autoCxl,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Position closed: ${r?.[\"instId\"]} ${r?.[\"posSide\"] ?? \"\"}`);\n}\n\nexport async function cmdFuturesSetLeverage(\n run: ToolRunner,\n opts: { instId: string; lever: string; mgnMode: string; posSide?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_set_leverage\", {\n instId: opts.instId,\n lever: opts.lever,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Leverage set: ${r?.[\"lever\"]}x ${r?.[\"instId\"]}`);\n}\n\nexport async function cmdFuturesGetLeverage(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_leverage\", { instId: opts.instId, mgnMode: opts.mgnMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n instId: r[\"instId\"],\n mgnMode: r[\"mgnMode\"],\n posSide: r[\"posSide\"],\n lever: r[\"lever\"],\n })),\n );\n}\n\nexport async function cmdFuturesBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n errorLine(\"Error: --orders must be a valid JSON array\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n errorLine(\"Error: --orders must be a non-empty JSON array\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"futures_batch_orders\",\n amend: \"futures_batch_amend\",\n cancel: \"futures_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n errorLine(\"Error: --action must be one of: place, amend, cancel\");\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"futures_batch_orders\" ? { orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitBatchResults(data ?? []);\n}\n\nexport async function cmdFuturesAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n tdMode: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n reduceOnly?: boolean;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n posSide: opts.posSide,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n reduceOnly: opts.reduceOnly,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order placed\", \"algoId\");\n}\n\nexport async function cmdFuturesAlgoTrailPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n sz: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n posSide?: string;\n tdMode: string;\n reduceOnly?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_place_move_stop_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n sz: opts.sz,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n posSide: opts.posSide,\n reduceOnly: opts.reduceOnly,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Trailing stop placed\", \"algoId\");\n}\n\nexport async function cmdFuturesAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order amended\", \"algoId\");\n}\n\nexport async function cmdFuturesAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"futures_cancel_algo_orders\", { orders: [{ instId, algoId }] });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order cancelled\", \"algoId\");\n}\n\nexport async function cmdFuturesAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { outputLine(\"No algo orders\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { errorLine, outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction emitBatchResults(items: Record<string, unknown>[]): void {\n for (const r of items) {\n const isError = r[\"sCode\"] !== \"0\" && r[\"sCode\"] !== 0;\n const id = r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\";\n if (isError) {\n errorLine(`${id}: ${r[\"sMsg\"]} (sCode ${r[\"sCode\"]})`);\n } else {\n outputLine(`${id}: OK`);\n }\n }\n}\n\nexport async function cmdOptionOrders(\n run: ToolRunner,\n opts: { instId?: string; uly?: string; status: \"live\" | \"history\" | \"archive\"; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_orders\", {\n instId: opts.instId,\n uly: opts.uly,\n status: opts.status,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdOptionGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { outputLine(\"No data\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdOptionPositions(\n run: ToolRunner,\n opts: { instId?: string; uly?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_positions\", {\n instId: opts.instId,\n uly: opts.uly,\n });\n const positions = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { outputLine(\"No open positions\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n posSide: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n delta: p[\"deltaPA\"],\n gamma: p[\"gammaPA\"],\n theta: p[\"thetaPA\"],\n vega: p[\"vegaPA\"],\n })),\n );\n}\n\nexport async function cmdOptionFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_fills\", {\n instId: opts.instId,\n ordId: opts.ordId,\n archive: opts.archive,\n });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdOptionInstruments(\n run: ToolRunner,\n opts: { uly: string; expTime?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_instruments\", {\n uly: opts.uly,\n expTime: opts.expTime,\n });\n const instruments = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(instruments);\n printTable(\n (instruments ?? []).map((i) => ({\n instId: i[\"instId\"],\n uly: i[\"uly\"],\n expTime: i[\"expTime\"],\n stk: i[\"stk\"],\n optType: i[\"optType\"],\n state: i[\"state\"],\n })),\n );\n}\n\nexport async function cmdOptionGreeks(\n run: ToolRunner,\n opts: { uly: string; expTime?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_greeks\", {\n uly: opts.uly,\n expTime: opts.expTime,\n });\n const greeks = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(greeks);\n printTable(\n (greeks ?? []).map((g) => ({\n instId: g[\"instId\"],\n delta: g[\"deltaBS\"],\n gamma: g[\"gammaBS\"],\n theta: g[\"thetaBS\"],\n vega: g[\"vegaBS\"],\n iv: g[\"markVol\"],\n markPx: g[\"markPx\"],\n })),\n );\n}\n\nexport async function cmdOptionPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode: string;\n side: string;\n ordType: string;\n sz: string;\n px?: string;\n reduceOnly?: boolean;\n clOrdId?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"option_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n px: opts.px,\n reduceOnly: opts.reduceOnly,\n clOrdId: opts.clOrdId,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order placed\", \"ordId\");\n}\n\nexport async function cmdOptionCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_cancel_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Cancelled\", \"ordId\");\n}\n\nexport async function cmdOptionAmend(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; newSz?: string; newPx?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Amended\", \"ordId\");\n}\n\nexport async function cmdOptionBatchCancel(\n run: ToolRunner,\n opts: { orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n errorLine(\"Error: --orders must be a valid JSON array\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n errorLine(\"Error: --orders must be a non-empty JSON array\");\n process.exitCode = 1;\n return;\n }\n const result = await run(\"option_batch_cancel\", { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitBatchResults(data ?? []);\n}\n\nexport async function cmdOptionAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode: string;\n side: string;\n ordType: string;\n sz: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n reduceOnly?: boolean;\n clOrdId?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"option_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n reduceOnly: opts.reduceOnly,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order placed\", \"algoId\");\n}\n\nexport async function cmdOptionAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"option_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order amended\", \"algoId\");\n}\n\nexport async function cmdOptionAlgoCancel(\n run: ToolRunner,\n opts: { instId: string; algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_cancel_algo_orders\", { orders: [{ instId: opts.instId, algoId: opts.algoId }] });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order cancelled\", \"algoId\");\n}\n\nexport async function cmdOptionAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { outputLine(\"No algo orders\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n","import { writeFullConfig } from \"@agent-tradekit/core\";\nimport type { OkxTomlConfig } from \"@agent-tradekit/core\";\n\nexport function writeCliConfig(config: OkxTomlConfig): void {\n writeFullConfig(config);\n}\n","import { readFullConfig, configFilePath, OKX_SITES, SITE_IDS, tomlStringify } from \"@agent-tradekit/core\";\nimport type { SiteId } from \"@agent-tradekit/core\";\nimport { writeCliConfig } from \"../config/toml.js\";\nimport { output, errorOutput, outputLine, errorLine, printJson, printKv } from \"../formatter.js\";\nimport type { OkxTomlConfig, OkxProfile } from \"@agent-tradekit/core\";\nimport { createInterface } from \"node:readline\";\nimport { spawnSync } from \"node:child_process\";\n\nexport type Lang = \"en\" | \"zh\";\n\nconst messages = {\n en: {\n title: \"OKX Trade CLI — Configuration Wizard\",\n selectSite: \"Select site:\",\n sitePrompt: \"Site (1/2/3, default: 1): \",\n demoPrompt: \"Use demo trading? (Y/n) \",\n hintDemo: \"The page will redirect to demo trading API management\",\n hintLive: \"The page will redirect to live trading API management\",\n createApiKey: (url: string) => `\\nGo to ${url} to create an API Key (trade permission required)\\n`,\n hint: (h: string) => `Tip: ${h}\\n\\n`,\n profilePrompt: (name: string) => `Profile name (default: ${name}): `,\n profileExists: (name: string) => `Profile \"${name}\" already exists. Overwrite? (y/N) `,\n cancelled: \"Cancelled.\",\n emptyApiKey: \"Error: API Key cannot be empty\",\n emptySecretKey: \"Error: Secret Key cannot be empty\",\n emptyPassphrase: \"Error: Passphrase cannot be empty\",\n demoSelected: \"Demo trading mode selected. Switch to live anytime via okx config set.\",\n saved: (p: string) => `\\nConfig saved to ${p}\\n`,\n defaultProfile: (name: string) => `Default profile set to: ${name}\\n`,\n usage: \"Usage: okx account balance\\n\",\n writeFailed: (msg: string) => `Failed to write config: ${msg}\\n`,\n permissionDenied: (p: string) => `Permission denied. Check read/write access for ${p} and its parent directory.\\n`,\n manualWrite: (p: string) => `Please manually write the following to ${p}:\\n\\n`,\n },\n zh: {\n title: \"OKX Trade CLI — 配置向导\",\n selectSite: \"请选择站点:\",\n sitePrompt: \"站点 (1/2/3, 默认: 1): \",\n demoPrompt: \"使用模拟盘?(Y/n) \",\n hintDemo: \"页面会自动跳转到模拟盘 API 管理\",\n hintLive: \"页面会自动跳转到实盘 API 管理\",\n createApiKey: (url: string) => `\\n请前往 ${url} 创建 API Key(需要 trade 权限)\\n`,\n hint: (h: string) => `提示:${h}\\n\\n`,\n profilePrompt: (name: string) => `Profile 名称 (默认: ${name}): `,\n profileExists: (name: string) => `Profile \"${name}\" 已存在,是否覆盖?(y/N) `,\n cancelled: \"已取消。\",\n emptyApiKey: \"错误: API Key 不能为空\",\n emptySecretKey: \"错误: Secret Key 不能为空\",\n emptyPassphrase: \"错误: Passphrase 不能为空\",\n demoSelected: \"已选择模拟盘模式,可随时通过 okx config set 切换为实盘。\",\n saved: (p: string) => `\\n配置已保存到 ${p}\\n`,\n defaultProfile: (name: string) => `已设为默认 profile: ${name}\\n`,\n usage: \"使用方式: okx account balance\\n\",\n writeFailed: (msg: string) => `写入配置文件失败: ${msg}\\n`,\n permissionDenied: (p: string) => `权限不足,请检查 ${p} 及其父目录的读写权限。\\n`,\n manualWrite: (p: string) => `请手动将以下内容写入 ${p}:\\n\\n`,\n },\n} as const;\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string): Promise<string> {\n return new Promise((resolve) => rl.question(question, resolve));\n}\n\nexport function cmdConfigShow(json: boolean): void {\n const config = readFullConfig();\n if (json) return printJson(config);\n outputLine(`Config: ${configFilePath()}`);\n outputLine(\"\");\n outputLine(`default_profile: ${config.default_profile ?? \"(not set)\"}`);\n outputLine(\"\");\n for (const [name, profile] of Object.entries(config.profiles)) {\n outputLine(`[${name}]`);\n printKv({\n api_key: profile.api_key ? maskSecret(profile.api_key) : \"(not set)\",\n demo: profile.demo ?? false,\n base_url: profile.base_url ?? \"(default)\",\n }, 2);\n outputLine(\"\");\n }\n}\n\nexport function cmdConfigSet(key: string, value: string): void {\n const config = readFullConfig();\n if (key === \"default_profile\") {\n config.default_profile = value;\n writeCliConfig(config);\n outputLine(`default_profile set to \"${value}\"`);\n } else {\n errorLine(`Unknown config key: ${key}`);\n process.exitCode = 1;\n }\n}\n\nexport type SiteKey = SiteId;\n\n/** Maps raw user input (\"1\"/\"2\"/\"3\", site names like \"global\"/\"eea\"/\"us\", or empty) to a site key. */\nexport function parseSiteKey(raw: string): SiteKey {\n const lower = raw.toLowerCase();\n if (lower === \"eea\" || raw === \"2\") return \"eea\";\n if (lower === \"us\" || raw === \"3\") return \"us\";\n if (lower === \"global\" || raw === \"1\") return \"global\";\n return \"global\";\n}\n\n/** Infers site key from a base_url value (for backward-compat with old profiles lacking a site field). */\nexport function inferSiteFromBaseUrl(baseUrl?: string): SiteKey {\n if (!baseUrl) return \"global\";\n for (const id of SITE_IDS) {\n const site = OKX_SITES[id];\n if (baseUrl === site.apiBaseUrl || baseUrl === site.webUrl) return id;\n }\n return \"global\";\n}\n\n/** Masks a secret value, showing only the last 4 characters. */\nexport function maskSecret(value?: string): string {\n if (!value || value.length < 4) return \"****\";\n return \"***\" + value.slice(-4);\n}\n\n/** Builds the targeted API creation URL for the given site and trading mode. */\nexport function buildApiUrl(siteKey: SiteKey, demo: boolean): string {\n const query = demo ? \"?go-demo-trading=1\" : \"?go-live-trading=1\";\n return `${OKX_SITES[siteKey].webUrl}/account/my-api${query}`;\n}\n\n/** Builds a profile entry, omitting base_url for the global site. */\nexport function buildProfileEntry(\n siteKey: SiteKey,\n apiKey: string,\n secretKey: string,\n passphrase: string,\n demo: boolean,\n): OkxProfile {\n const entry: OkxProfile = { api_key: apiKey, secret_key: secretKey, passphrase, demo };\n if (siteKey !== \"global\") {\n entry.base_url = OKX_SITES[siteKey].webUrl;\n }\n return entry;\n}\n\nexport async function cmdConfigInit(lang: Lang = \"en\"): Promise<void> {\n const t = messages[lang];\n outputLine(t.title);\n outputLine(\"\");\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n // Step 1: site selection\n outputLine(t.selectSite);\n outputLine(\" 1) Global (www.okx.com) [default]\");\n outputLine(\" 2) EEA (my.okx.com)\");\n outputLine(\" 3) US (app.okx.com)\");\n const siteRaw = (await prompt(rl, t.sitePrompt)).trim();\n const siteKey = parseSiteKey(siteRaw);\n\n // Step 2: demo / live selection — must happen before URL construction\n const demoRaw = (await prompt(rl, t.demoPrompt)).trim().toLowerCase();\n const demo = demoRaw !== \"n\";\n\n // Step 3: open targeted API creation page\n const apiUrl = buildApiUrl(siteKey, demo);\n const hintText = demo ? t.hintDemo : t.hintLive;\n output(t.createApiKey(apiUrl));\n output(t.hint(hintText));\n\n // Try to open the URL; silently ignore failures\n try {\n const opener = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n spawnSync(opener, [apiUrl], { stdio: \"ignore\", shell: process.platform === \"win32\" });\n } catch {\n // silently ignore\n }\n\n const defaultProfileName = demo ? \"okx-demo\" : \"okx-prod\";\n const profileNameRaw = await prompt(rl, t.profilePrompt(defaultProfileName));\n const profileName = profileNameRaw.trim() || defaultProfileName;\n\n // Check if profile already exists\n const config = readFullConfig();\n if (config.profiles[profileName]) {\n const overwrite = (await prompt(rl, t.profileExists(profileName))).trim().toLowerCase();\n if (overwrite !== \"y\") {\n outputLine(t.cancelled);\n return;\n }\n }\n\n const apiKey = (await prompt(rl, \"API Key: \")).trim();\n if (!apiKey) {\n errorLine(t.emptyApiKey);\n process.exitCode = 1;\n return;\n }\n\n const secretKey = (await prompt(rl, \"Secret Key: \")).trim();\n if (!secretKey) {\n errorLine(t.emptySecretKey);\n process.exitCode = 1;\n return;\n }\n\n const passphrase = (await prompt(rl, \"Passphrase: \")).trim();\n if (!passphrase) {\n errorLine(t.emptyPassphrase);\n process.exitCode = 1;\n return;\n }\n\n if (demo) {\n outputLine(t.demoSelected);\n }\n\n const profileEntry = buildProfileEntry(siteKey, apiKey, secretKey, passphrase, demo);\n config.profiles[profileName] = profileEntry;\n\n // Auto-set as default_profile\n if (!config.default_profile || config.default_profile !== profileName) {\n config.default_profile = profileName;\n }\n\n const configPath = configFilePath();\n try {\n writeCliConfig(config);\n output(t.saved(configPath));\n output(t.defaultProfile(profileName));\n output(t.usage);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const isPermission = err instanceof Error && \"code\" in err && (err.code === \"EACCES\" || err.code === \"EPERM\");\n errorOutput(t.writeFailed(message));\n if (isPermission) {\n errorOutput(t.permissionDenied(configPath));\n }\n errorOutput(t.manualWrite(configPath));\n outputLine(tomlStringify(config as unknown as Record<string, unknown>));\n process.exitCode = 1;\n }\n } finally {\n rl.close();\n }\n}\n\n/**\n * Non-interactive profile creation / update.\n * Usage: okx config add-profile AK=xxx SK=yyy PP=zzz [site=global|eea|us] [demo=true|false] [name=xxx] [--force]\n */\nexport function cmdConfigAddProfile(kvPairs: string[], force: boolean): void {\n // Parse key=value pairs (split on first '=' only to handle values containing '=')\n const params: Record<string, string> = {};\n for (const pair of kvPairs) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1);\n params[key.toUpperCase()] = value;\n }\n\n const ak = params[\"AK\"];\n const sk = params[\"SK\"];\n const pp = params[\"PP\"];\n\n // Validate required fields\n const missing: string[] = [];\n if (!ak) missing.push(\"AK\");\n if (!sk) missing.push(\"SK\");\n if (!pp) missing.push(\"PP\");\n if (missing.length > 0) {\n errorLine(`Error: missing required parameter(s): ${missing.join(\", \")}`);\n errorLine(\"Usage: okx config add-profile AK=<key> SK=<secret> PP=<passphrase> [site=global|eea|us] [demo=true|false] [name=<name>] [--force]\");\n process.exitCode = 1;\n return;\n }\n\n const siteKey = parseSiteKey(params[\"SITE\"] ?? \"\");\n const demo = params[\"DEMO\"] !== undefined ? params[\"DEMO\"].toLowerCase() !== \"false\" : true;\n const defaultName = demo ? \"demo\" : \"live\";\n const profileName = params[\"NAME\"] ?? defaultName;\n\n const config = readFullConfig();\n\n // Check for conflict\n if (config.profiles[profileName] && !force) {\n errorLine(`Error: profile \"${profileName}\" already exists. Use --force to overwrite.`);\n process.exitCode = 1;\n return;\n }\n\n // Build profile entry and set site field\n const entry = buildProfileEntry(siteKey, ak, sk, pp, demo);\n entry.site = siteKey;\n config.profiles[profileName] = entry;\n config.default_profile = profileName;\n\n writeCliConfig(config);\n outputLine(`Profile \"${profileName}\" saved to ${configFilePath()}`);\n outputLine(`Default profile set to: ${profileName}`);\n}\n\n/**\n * Lists all profiles, masking sensitive fields.\n * Default profile is marked with *.\n */\nexport function cmdConfigListProfile(): void {\n const config = readFullConfig();\n const entries = Object.entries(config.profiles);\n if (entries.length === 0) {\n outputLine(\"No profiles found. Run: okx config add-profile AK=<key> SK=<secret> PP=<passphrase>\");\n return;\n }\n outputLine(`Config: ${configFilePath()}`);\n outputLine(\"\");\n for (const [name, profile] of entries) {\n const isDefault = name === config.default_profile;\n const marker = isDefault ? \" *\" : \"\";\n const site = profile.site ?? inferSiteFromBaseUrl(profile.base_url);\n const mode = profile.demo !== false ? \"demo (模拟盘)\" : \"live (实盘)\";\n outputLine(`[${name}]${marker}`);\n outputLine(` api_key: ${maskSecret(profile.api_key)}`);\n outputLine(` secret_key: ${maskSecret(profile.secret_key)}`);\n outputLine(` passphrase: ${maskSecret(profile.passphrase)}`);\n outputLine(` site: ${site}`);\n outputLine(` mode: ${mode}`);\n outputLine(\"\");\n }\n}\n\n/**\n * Switches the default profile.\n * Usage: okx config use <profile-name>\n */\nexport function cmdConfigUse(profileName: string): void {\n if (!profileName) {\n errorLine(\"Error: profile name is required.\");\n errorLine(\"Usage: okx config use <profile-name>\");\n process.exitCode = 1;\n return;\n }\n\n const config = readFullConfig();\n const available = Object.keys(config.profiles);\n\n if (!config.profiles[profileName]) {\n errorLine(`Error: profile \"${profileName}\" does not exist.`);\n if (available.length > 0) {\n errorLine(`Available profiles: ${available.join(\", \")}`);\n } else {\n errorLine(\"No profiles configured. Run: okx config add-profile AK=<key> SK=<secret> PP=<passphrase>\");\n }\n process.exitCode = 1;\n return;\n }\n\n config.default_profile = profileName;\n writeCliConfig(config);\n outputLine(`Default profile set to: \"${profileName}\"`);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction extractData(result: unknown): Record<string, unknown>[] {\n if (result && typeof result === \"object\") {\n const data = (result as Record<string, unknown>)[\"data\"];\n if (Array.isArray(data)) return data as Record<string, unknown>[];\n }\n return [];\n}\n\nfunction printDataList(\n data: Record<string, unknown>[],\n json: boolean,\n emptyMsg: string,\n mapper: (r: Record<string, unknown>) => Record<string, unknown>,\n): void {\n if (json) { printJson(data); return; }\n if (!data.length) { outputLine(emptyMsg); return; }\n printTable(data.map(mapper));\n}\n\nexport async function cmdEarnSavingsBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const data = extractData(await run(\"earn_get_savings_balance\", { ccy }));\n printDataList(data, json, \"No savings balance\", (r) => ({\n ccy: r[\"ccy\"], amt: r[\"amt\"], earnings: r[\"earnings\"],\n rate: r[\"rate\"], loanAmt: r[\"loanAmt\"], pendingAmt: r[\"pendingAmt\"],\n }));\n}\n\nexport async function cmdEarnSavingsPurchase(\n run: ToolRunner,\n opts: { ccy: string; amt: string; rate?: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_savings_purchase\", { ccy: opts.ccy, amt: opts.amt, rate: opts.rate }));\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { outputLine(\"No response data\"); return; }\n printKv({ ccy: r[\"ccy\"], amt: r[\"amt\"], side: r[\"side\"], rate: r[\"rate\"] });\n}\n\nexport async function cmdEarnSavingsRedeem(\n run: ToolRunner,\n opts: { ccy: string; amt: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_savings_redeem\", { ccy: opts.ccy, amt: opts.amt }));\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { outputLine(\"No response data\"); return; }\n printKv({ ccy: r[\"ccy\"], amt: r[\"amt\"], side: r[\"side\"] });\n}\n\nexport async function cmdEarnSetLendingRate(\n run: ToolRunner,\n opts: { ccy: string; rate: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_set_lending_rate\", { ccy: opts.ccy, rate: opts.rate }));\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n outputLine(`Lending rate set: ${r?.[\"ccy\"]} → ${r?.[\"rate\"]}`);\n}\n\nexport async function cmdEarnLendingHistory(\n run: ToolRunner,\n opts: { ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_get_lending_history\", { ccy: opts.ccy, limit: opts.limit }));\n printDataList(data, opts.json, \"No lending history\", (r) => ({\n ccy: r[\"ccy\"], amt: r[\"amt\"], earnings: r[\"earnings\"],\n rate: r[\"rate\"], ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n }));\n}\n\nexport async function cmdEarnLendingRateHistory(\n run: ToolRunner,\n opts: { ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_get_lending_rate_history\", { ccy: opts.ccy, limit: opts.limit }));\n printDataList(data, opts.json, \"No rate history data\", (r) => ({\n ccy: r[\"ccy\"], lendingRate: r[\"lendingRate\"],\n rate: r[\"rate\"], ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n }));\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, errorLine, printJson, printTable } from \"../formatter.js\";\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface BalanceDetail {\n ccy: string;\n eq?: string; // equity — used as invested amount for USDG earn currencies\n autoLendStatus: string; // \"unsupported\" | \"off\" | \"pending\" | \"active\"\n autoStakingStatus: string; // \"unsupported\" | \"off\" | \"pending\" | \"active\"\n autoLendAmt: string;\n autoLendMtAmt: string;\n autoLendApr: string;\n [key: string]: unknown;\n}\n\ntype EarnType = \"0\" | \"1\";\n\n/**\n * Known currencies that use earnType=\"1\" (USDG earn).\n * Source: OKX API docs for POST /api/v5/account/set-auto-earn.\n * Update this list when OKX adds new USDG earn currencies.\n */\nconst USDG_EARN_CURRENCIES = new Set([\"USDG\", \"BUIDL\"]);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction isSupported(status: string | undefined): boolean {\n return !!status && status !== \"unsupported\";\n}\n\n/**\n * Infer earnType from balance detail.\n *\n * - autoLendStatus or autoStakingStatus != \"unsupported\" → earnType \"0\" (lend+stake)\n * - Known USDG-earn currencies (USDG, BUIDL) → earnType \"1\"\n * - Otherwise → null (not supported)\n */\nexport function inferEarnType(detail: BalanceDetail): EarnType | null {\n if (isSupported(detail.autoLendStatus) || isSupported(detail.autoStakingStatus)) return \"0\";\n if (USDG_EARN_CURRENCIES.has(detail.ccy)) return \"1\";\n return null;\n}\n\nasync function getBalanceDetails(\n run: ToolRunner,\n ccy?: string,\n): Promise<BalanceDetail[]> {\n const result = await run(\"account_get_balance\", ccy ? { ccy } : {});\n const data = result.data as Record<string, unknown>[] | undefined;\n const first = data?.[0] as Record<string, unknown> | undefined;\n return (first?.details as BalanceDetail[]) ?? [];\n}\n\nfunction earnTypeLabel(et: EarnType): string {\n return et === \"1\" ? \"USDG earn\" : \"lend+stake\";\n}\n\n/* ------------------------------------------------------------------ */\n/* Commands */\n/* ------------------------------------------------------------------ */\n\nexport async function cmdAutoEarnStatus(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const details = await getBalanceDetails(run, ccy);\n\n const relevant = details.filter((d) => inferEarnType(d) !== null);\n\n if (json) { printJson(relevant); return; }\n\n if (!relevant.length) {\n outputLine(ccy ? `${ccy} does not support auto-earn` : \"No currencies support auto-earn\");\n return;\n }\n\n printTable(relevant.map((d) => {\n const et = inferEarnType(d)!;\n return {\n ccy: d.ccy,\n earnType: earnTypeLabel(et),\n autoLend: d.autoLendStatus,\n autoStaking: d.autoStakingStatus,\n invested: et === \"1\" ? (d.eq || \"-\") : (d.autoLendAmt || \"-\"),\n matched: d.autoLendMtAmt || \"-\",\n apr: d.autoLendApr ? `${(Number(d.autoLendApr) * 100).toFixed(2)}%` : \"-\",\n };\n }));\n}\n\nexport async function cmdAutoEarnOn(\n run: ToolRunner,\n ccy: string,\n json: boolean,\n): Promise<void> {\n const details = await getBalanceDetails(run, ccy);\n const detail = details.find((d) => d.ccy === ccy);\n if (!detail) {\n errorLine(`Currency ${ccy} not found in account balance`);\n process.exitCode = 1;\n return;\n }\n\n const earnType = inferEarnType(detail);\n if (earnType === null) {\n errorLine(`${ccy} does not support auto-earn`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(\"earn_auto_set\", { ccy, action: \"turn_on\", earnType });\n\n if (json) { printJson(result.data); return; }\n outputLine(`Auto-earn enabled for ${ccy} (${earnTypeLabel(earnType)})`);\n}\n\nexport async function cmdAutoEarnOff(\n run: ToolRunner,\n ccy: string,\n json: boolean,\n): Promise<void> {\n const details = await getBalanceDetails(run, ccy);\n const detail = details.find((d) => d.ccy === ccy);\n if (!detail) {\n errorLine(`Currency ${ccy} not found in account balance`);\n process.exitCode = 1;\n return;\n }\n\n const earnType = inferEarnType(detail);\n if (earnType === null) {\n errorLine(`${ccy} does not support auto-earn`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(\"earn_auto_set\", { ccy, action: \"turn_off\", earnType });\n\n if (json) { printJson(result.data); return; }\n outputLine(`Auto-earn disabled for ${ccy} (${earnTypeLabel(earnType)})`);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, errorLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdGridOrders(\n run: ToolRunner,\n opts: {\n algoOrdType: string;\n instId?: string;\n algoId?: string;\n status: \"active\" | \"history\";\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_get_orders\", {\n algoOrdType: opts.algoOrdType,\n instId: opts.instId,\n algoId: opts.algoId,\n status: opts.status,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { outputLine(\"No grid bots\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"algoOrdType\"],\n state: o[\"state\"],\n pnl: o[\"pnlRatio\"],\n gridNum: o[\"gridNum\"],\n maxPx: o[\"maxPx\"],\n minPx: o[\"minPx\"],\n createdAt: new Date(Number(o[\"cTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdGridDetails(\n run: ToolRunner,\n opts: { algoOrdType: string; algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"grid_get_order_details\", {\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n });\n const detail = ((getData(result) as Record<string, unknown>[]) ?? [])[0];\n if (!detail) { outputLine(\"Bot not found\"); return; }\n if (opts.json) return printJson(detail);\n printKv({\n algoId: detail[\"algoId\"],\n instId: detail[\"instId\"],\n type: detail[\"algoOrdType\"],\n state: detail[\"state\"],\n maxPx: detail[\"maxPx\"],\n minPx: detail[\"minPx\"],\n gridNum: detail[\"gridNum\"],\n runType: detail[\"runType\"] === \"1\" ? \"arithmetic\" : \"geometric\",\n pnl: detail[\"pnl\"],\n pnlRatio: detail[\"pnlRatio\"],\n investAmt: detail[\"investAmt\"],\n totalAnnRate: detail[\"totalAnnRate\"],\n createdAt: new Date(Number(detail[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdGridSubOrders(\n run: ToolRunner,\n opts: {\n algoOrdType: string;\n algoId: string;\n type: \"filled\" | \"live\";\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_get_sub_orders\", {\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n type: opts.type,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { outputLine(\"No sub-orders\"); return; }\n printTable(\n orders.map((o) => ({\n ordId: o[\"ordId\"],\n side: o[\"side\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillPx: o[\"fillPx\"],\n fillSz: o[\"fillSz\"],\n state: o[\"state\"],\n fee: o[\"fee\"],\n })),\n );\n}\n\nexport async function cmdGridCreate(\n run: ToolRunner,\n opts: {\n instId: string;\n algoOrdType: string;\n maxPx: string;\n minPx: string;\n gridNum: string;\n runType?: string;\n quoteSz?: string;\n baseSz?: string;\n direction?: string;\n lever?: string;\n sz?: string;\n basePos?: boolean;\n tpTriggerPx?: string;\n slTriggerPx?: string;\n tpRatio?: string;\n slRatio?: string;\n algoClOrdId?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_create_order\", {\n instId: opts.instId,\n algoOrdType: opts.algoOrdType,\n maxPx: opts.maxPx,\n minPx: opts.minPx,\n gridNum: opts.gridNum,\n runType: opts.runType,\n quoteSz: opts.quoteSz,\n baseSz: opts.baseSz,\n direction: opts.direction,\n lever: opts.lever,\n sz: opts.sz,\n basePos: opts.basePos,\n tpTriggerPx: opts.tpTriggerPx,\n slTriggerPx: opts.slTriggerPx,\n tpRatio: opts.tpRatio,\n slRatio: opts.slRatio,\n algoClOrdId: opts.algoClOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n emitWriteResult(data?.[0], \"Grid bot created\", \"algoId\");\n}\n\nexport async function cmdGridStop(\n run: ToolRunner,\n opts: {\n algoId: string;\n algoOrdType: string;\n instId: string;\n stopType?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_stop_order\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n instId: opts.instId,\n stopType: opts.stopType,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n emitWriteResult(data?.[0], \"Grid bot stopped\", \"algoId\");\n}\n\n// ---------------------------------------------------------------------------\n// DCA (Spot & Contract) commands\n// ---------------------------------------------------------------------------\n\nexport async function cmdDcaCreate(\n run: ToolRunner,\n opts: {\n instId: string;\n algoOrdType: string;\n lever?: string;\n direction: string;\n initOrdAmt: string;\n maxSafetyOrds: string;\n tpPct: string;\n safetyOrdAmt?: string;\n pxSteps?: string;\n pxStepsMult?: string;\n volMult?: string;\n slPct?: string;\n slMode?: string;\n allowReinvest?: string;\n triggerStrategy?: string;\n triggerPx?: string;\n algoClOrdId?: string;\n reserveFunds?: string;\n tradeQuoteCcy?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"dca_create_order\", {\n instId: opts.instId,\n algoOrdType: opts.algoOrdType,\n lever: opts.lever,\n direction: opts.direction,\n initOrdAmt: opts.initOrdAmt,\n maxSafetyOrds: opts.maxSafetyOrds,\n tpPct: opts.tpPct,\n safetyOrdAmt: opts.safetyOrdAmt,\n pxSteps: opts.pxSteps,\n pxStepsMult: opts.pxStepsMult,\n volMult: opts.volMult,\n slPct: opts.slPct,\n slMode: opts.slMode,\n allowReinvest: opts.allowReinvest,\n triggerStrategy: opts.triggerStrategy,\n triggerPx: opts.triggerPx,\n algoClOrdId: opts.algoClOrdId,\n reserveFunds: opts.reserveFunds,\n tradeQuoteCcy: opts.tradeQuoteCcy,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"DCA bot created\", \"algoId\");\n}\n\nexport async function cmdDcaStop(\n run: ToolRunner,\n opts: { algoId: string; algoOrdType: string; stopType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_stop_order\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n stopType: opts.stopType,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"DCA bot stopped\", \"algoId\");\n}\n\nexport async function cmdDcaOrders(\n run: ToolRunner,\n opts: { algoOrdType?: string; algoId?: string; instId?: string; history: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_orders\", {\n status: opts.history ? \"history\" : \"active\",\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n instId: opts.instId,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { outputLine(\"No DCA bots\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"algoOrdType\"],\n state: o[\"state\"],\n pnl: o[\"pnl\"],\n pnlRatio: o[\"pnlRatio\"],\n createdAt: new Date(Number(o[\"cTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdDcaDetails(\n run: ToolRunner,\n opts: { algoId: string; algoOrdType: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_order_details\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n });\n const detail = ((getData(result) as Record<string, unknown>[]) ?? [])[0];\n if (!detail) { outputLine(\"DCA bot not found\"); return; }\n if (opts.json) return printJson(detail);\n printKv({\n algoId: detail[\"algoId\"],\n algoOrdType: detail[\"algoOrdType\"],\n instId: detail[\"instId\"],\n sz: detail[\"sz\"],\n avgPx: detail[\"avgPx\"],\n initPx: detail[\"initPx\"],\n tpPx: detail[\"tpPx\"],\n slPx: detail[\"slPx\"] || \"-\",\n upl: detail[\"upl\"],\n fee: detail[\"fee\"],\n fundingFee: detail[\"fundingFee\"],\n curCycleId: detail[\"curCycleId\"],\n fillSafetyOrds: detail[\"fillSafetyOrds\"],\n createdAt: new Date(Number(detail[\"startTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdDcaSubOrders(\n run: ToolRunner,\n opts: { algoId: string; algoOrdType: string; cycleId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_sub_orders\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n cycleId: opts.cycleId,\n });\n const rows = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(rows);\n if (!rows.length) { outputLine(\"No sub-orders\"); return; }\n\n if (opts.cycleId) {\n // Orders within a cycle — fields from /orders endpoint\n printTable(\n rows.map((o) => ({\n ordId: o[\"ordId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n filledSz: o[\"filledSz\"],\n avgFillPx: o[\"avgFillPx\"],\n state: o[\"state\"],\n fee: o[\"fee\"],\n })),\n );\n } else {\n // Cycle list — fields from /cycle-list endpoint\n printTable(\n rows.map((o) => ({\n cycleId: o[\"cycleId\"],\n status: o[\"cycleStatus\"],\n current: o[\"currentCycle\"] ? \"yes\" : \"\",\n avgPx: o[\"avgPx\"],\n tpPx: o[\"tpPx\"],\n realizedPnl: o[\"realizedPnl\"],\n fee: o[\"fee\"],\n startTime: o[\"startTime\"] ? new Date(Number(o[\"startTime\"] as string)).toLocaleString() : \"\",\n })),\n );\n }\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport type { CliValues } from \"../parser.js\";\n\nexport function cmdOnchainEarnOffers(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_get_offers\", {\n productId: v.productId,\n protocolType: v.protocolType,\n ccy: v.ccy,\n });\n}\n\nexport function cmdOnchainEarnPurchase(run: ToolRunner, v: CliValues) {\n // Parse investData from ccy + amt flags\n const investData = v.ccy && v.amt ? [{ ccy: v.ccy, amt: v.amt }] : undefined;\n return run(\"onchain_earn_purchase\", {\n productId: v.productId,\n investData,\n term: v.term,\n tag: v.tag,\n });\n}\n\nexport function cmdOnchainEarnRedeem(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_redeem\", {\n ordId: v.ordId,\n protocolType: v.protocolType,\n allowEarlyRedeem: v.allowEarlyRedeem,\n });\n}\n\nexport function cmdOnchainEarnCancel(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_cancel\", {\n ordId: v.ordId,\n protocolType: v.protocolType,\n });\n}\n\nexport function cmdOnchainEarnActiveOrders(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_get_active_orders\", {\n productId: v.productId,\n protocolType: v.protocolType,\n ccy: v.ccy,\n state: v.state,\n });\n}\n\nexport function cmdOnchainEarnOrderHistory(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_get_order_history\", {\n productId: v.productId,\n protocolType: v.protocolType,\n ccy: v.ccy,\n });\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction extractArray(result: unknown): Record<string, unknown>[] {\n if (result && typeof result === \"object\") {\n const data = (result as Record<string, unknown>)[\"data\"];\n if (Array.isArray(data)) return data as Record<string, unknown>[];\n }\n return [];\n}\n\nfunction extractProducts(result: unknown): Record<string, unknown>[] {\n if (result && typeof result === \"object\") {\n const data = (result as Record<string, unknown>)[\"data\"];\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const products = (data as Record<string, unknown>)[\"products\"];\n if (Array.isArray(products)) return products as Record<string, unknown>[];\n }\n }\n return [];\n}\n\nexport async function cmdDcdPairs(run: ToolRunner, json: boolean): Promise<void> {\n const result = await run(\"dcd_get_currency_pairs\", {});\n const data = extractArray(result);\n if (json) { printJson(data); return; }\n if (!data.length) { outputLine(\"No currency pairs available\"); return; }\n printTable(data.map((r) => ({\n baseCcy: r[\"baseCcy\"],\n quoteCcy: r[\"quoteCcy\"],\n optType: r[\"optType\"],\n })));\n}\n\ntype ProductFilterOpts = {\n minYield?: number;\n strikeNear?: number;\n termDays?: number;\n minTermDays?: number;\n maxTermDays?: number;\n expDate?: string;\n};\n\nfunction filterByYield(data: Record<string, unknown>[], minYield: number): Record<string, unknown>[] {\n return data.filter((r) => {\n const y = parseFloat(r[\"annualizedYield\"] as string);\n return !isNaN(y) && y >= minYield;\n });\n}\n\nfunction filterByStrike(data: Record<string, unknown>[], ref: number): Record<string, unknown>[] {\n return data.filter((r) => {\n const strike = parseFloat(r[\"strike\"] as string);\n return !isNaN(strike) && Math.abs(strike - ref) / ref <= 0.1;\n });\n}\n\nfunction filterByTerm(\n data: Record<string, unknown>[],\n termDays?: number,\n minTermDays?: number,\n maxTermDays?: number,\n): Record<string, unknown>[] {\n const MS_PER_DAY = 86400_000;\n return data.filter((r) => {\n const exp = Number(r[\"expTime\"]);\n const start = Number(r[\"interestAccrualTime\"]);\n if (!exp || !start) return false;\n const days = Math.round((exp - start) / MS_PER_DAY);\n if (termDays !== undefined && days !== termDays) return false;\n if (minTermDays !== undefined && days < minTermDays) return false;\n if (maxTermDays !== undefined && days > maxTermDays) return false;\n return true;\n });\n}\n\nfunction filterByExpDate(data: Record<string, unknown>[], expDate: string): Record<string, unknown>[] {\n // Accept YYYY-MM-DD (day precision) or YYYY-MM-DDTHH:mm (hour precision)\n const hasTime = expDate.includes(\"T\") || expDate.includes(\" \");\n const precision = hasTime ? 13 : 10;\n const target = new Date(expDate).toISOString().slice(0, precision);\n return data.filter((r) => {\n const exp = Number(r[\"expTime\"]);\n if (!exp) return false;\n return new Date(exp).toISOString().slice(0, precision) === target;\n });\n}\n\nfunction applyProductFilters(data: Record<string, unknown>[], opts: ProductFilterOpts): Record<string, unknown>[] {\n if (opts.minYield !== undefined) data = filterByYield(data, opts.minYield);\n if (opts.strikeNear !== undefined) data = filterByStrike(data, opts.strikeNear);\n if (opts.termDays !== undefined || opts.minTermDays !== undefined || opts.maxTermDays !== undefined) {\n data = filterByTerm(data, opts.termDays, opts.minTermDays, opts.maxTermDays);\n }\n if (opts.expDate !== undefined) data = filterByExpDate(data, opts.expDate);\n return data;\n}\n\nexport async function cmdDcdProducts(\n run: ToolRunner,\n opts: { baseCcy?: string; quoteCcy?: string; optType?: string; json: boolean } & ProductFilterOpts,\n): Promise<void> {\n const result = await run(\"dcd_get_products\", {\n baseCcy: opts.baseCcy,\n quoteCcy: opts.quoteCcy,\n optType: opts.optType,\n });\n const data = applyProductFilters(extractProducts(result), opts);\n\n if (opts.json) { printJson(data); return; }\n if (!data.length) { outputLine(\"No products matched\"); return; }\n printTable(data.map((r) => ({\n productId: r[\"productId\"],\n baseCcy: r[\"baseCcy\"],\n quoteCcy: r[\"quoteCcy\"],\n optType: r[\"optType\"],\n strike: r[\"strike\"],\n // products endpoint returns decimal (e.g. 0.3423 = 34.23%) — multiply by 100\n annualizedYield: r[\"annualizedYield\"] ? `${(parseFloat(r[\"annualizedYield\"] as string) * 100).toFixed(2)}%` : \"—\",\n minSize: r[\"minSize\"],\n expTime: r[\"expTime\"] ? new Date(Number(r[\"expTime\"])).toLocaleDateString() : \"\",\n })));\n}\n\nexport async function cmdDcdRedeemExecute(\n run: ToolRunner,\n opts: { ordId: string; json: boolean },\n): Promise<void> {\n // Step 1: get redeem quote via dcd_redeem preview (no quoteId)\n const quoteResult = await run(\"dcd_redeem\", { ordId: opts.ordId });\n const quoteData = extractArray(quoteResult);\n const q = quoteData[0];\n if (!q) { outputLine(\"Failed to get redeem quote\"); return; }\n\n // Step 2: execute immediately via dcd_redeem with quoteId\n const redeemResult = await run(\"dcd_redeem\", {\n ordId: opts.ordId,\n quoteId: q[\"quoteId\"] as string,\n });\n const redeemData = extractArray(redeemResult);\n const r = redeemData[0];\n if (!r) { outputLine(\"No response data\"); return; }\n\n if (opts.json) {\n printJson({ quote: q, redeem: r });\n return;\n }\n\n printKv({\n ordId: r[\"ordId\"],\n state: r[\"state\"],\n redeemSz: q[\"redeemSz\"] ? `${parseFloat(q[\"redeemSz\"] as string).toFixed(8)} ${q[\"redeemCcy\"]}` : \"—\",\n termRate: (q[\"termRate\"] as string) ? `${q[\"termRate\"]}%` : \"—\",\n });\n}\n\nexport async function cmdDcdOrderState(\n run: ToolRunner,\n opts: { ordId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dcd_get_order_state\", { ordId: opts.ordId });\n const data = extractArray(result);\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { outputLine(\"Order not found\"); return; }\n printKv({\n ordId: r[\"ordId\"],\n state: r[\"state\"],\n productId: r[\"productId\"],\n strike: r[\"strike\"],\n notionalSz: r[\"notionalSz\"],\n settleTime: r[\"settleTime\"] ? new Date(Number(r[\"settleTime\"])).toLocaleDateString() : \"\",\n });\n}\n\nexport async function cmdDcdOrders(\n run: ToolRunner,\n opts: {\n ordId?: string;\n productId?: string;\n uly?: string;\n state?: string;\n beginId?: string;\n endId?: string;\n begin?: string;\n end?: string;\n limit?: number;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"dcd_get_orders\", {\n ordId: opts.ordId,\n productId: opts.productId,\n uly: opts.uly,\n state: opts.state,\n beginId: opts.beginId,\n endId: opts.endId,\n begin: opts.begin,\n end: opts.end,\n limit: opts.limit,\n });\n const data = extractArray(result);\n if (opts.json) { printJson(data); return; }\n if (!data.length) { outputLine(\"No orders found\"); return; }\n printTable(data.map((r) => ({\n ordId: r[\"ordId\"],\n productId: r[\"productId\"],\n state: r[\"state\"],\n baseCcy: r[\"baseCcy\"],\n quoteCcy: r[\"quoteCcy\"],\n strike: r[\"strike\"],\n notionalSz: r[\"notionalSz\"],\n annualizedYield: r[\"annualizedYield\"],\n yieldSz: r[\"yieldSz\"],\n settleTime: r[\"settleTime\"] ? new Date(Number(r[\"settleTime\"])).toLocaleDateString() : \"\", // scheduled settlement time\n settledTime: r[\"settledTime\"] ? new Date(Number(r[\"settledTime\"])).toLocaleDateString() : \"\", // actual settled time (non-empty only after settlement)\n })));\n}\n\nexport async function cmdDcdQuoteAndBuy(\n run: ToolRunner,\n opts: { productId: string; notionalSz: string; notionalCcy: string; clOrdId?: string; minAnnualizedYield?: number; json: boolean },\n): Promise<void> {\n // Atomic subscribe via dcd_subscribe (quote + execute in one step)\n const result = await run(\"dcd_subscribe\", {\n productId: opts.productId,\n notionalSz: opts.notionalSz,\n notionalCcy: opts.notionalCcy,\n clOrdId: opts.clOrdId,\n minAnnualizedYield: opts.minAnnualizedYield,\n }) as unknown as Record<string, unknown>;\n\n const tradeData = extractArray(result);\n const r = tradeData[0];\n const q = result[\"quote\"] as Record<string, unknown> | undefined;\n\n if (!r) { outputLine(\"No quote returned\"); return; }\n\n // Auto-query full order detail via dcd_get_orders (richer than dcd_get_order_state).\n // Wrapped in try/catch: a failure here must NOT mask the successful order placement.\n const ordId = r[\"ordId\"] as string | undefined;\n let stateRow: Record<string, unknown> | undefined;\n if (ordId) {\n try {\n const stateResult = await run(\"dcd_get_orders\", { ordId });\n stateRow = extractArray(stateResult)[0];\n } catch {\n // Secondary query failed — order was already placed, do not propagate\n }\n }\n\n if (opts.json) {\n printJson({ quote: q ?? null, order: r, state: stateRow ?? null });\n return;\n }\n\n if (q) {\n outputLine(\"Quote:\");\n printKv({\n quoteId: q[\"quoteId\"],\n annualizedYield: q[\"annualizedYield\"] ? `${q[\"annualizedYield\"]}%` : \"—\",\n absYield: q[\"absYield\"],\n notionalSz: q[\"notionalSz\"],\n notionalCcy: q[\"notionalCcy\"],\n });\n outputLine(\"\");\n }\n outputLine(\"Order placed:\");\n printKv({ ordId: r[\"ordId\"], quoteId: r[\"quoteId\"], state: r[\"state\"] ?? r[\"status\"] });\n if (stateRow) {\n outputLine(\"\");\n outputLine(\"Order state:\");\n printKv({\n ordId: stateRow[\"ordId\"],\n state: stateRow[\"state\"],\n productId: stateRow[\"productId\"],\n strike: stateRow[\"strike\"],\n notionalSz: stateRow[\"notionalSz\"],\n settleTime: stateRow[\"settleTime\"] ? new Date(Number(stateRow[\"settleTime\"])).toLocaleDateString() : \"\",\n });\n }\n}\n"],"mappings":"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","names":["createRequire","endPtr","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","fs","path","os","elapsed","path","messages","normalizeWrite","response","path","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","parse","os","fs","fs","fs","path","os","createRequire","_require","createRequire","path","fs","os","appData","maskKey","os","path","EOL","fs","path","EOL","path","fs","path","os","getData","getData","getData","emitWriteResult","emitBatchResults","getData","emitWriteResult","emitBatchResults","getData","emitWriteResult","emitBatchResults","spawnSync","emitWriteResult","getData","_require","createRequire","CLI_VERSION","GIT_HASH","CLI_VERSION","GIT_HASH","config"]}
1
+ {"version":3,"sources":["../src/index.ts","../../core/src/client/rest-client.ts","../../core/src/utils/signature.ts","../../core/src/utils/errors.ts","../../core/src/utils/rate-limiter.ts","../../core/src/tools/helpers.ts","../../core/src/tools/common.ts","../../core/src/tools/indicator.ts","../../core/src/constants.ts","../../core/src/tools/account.ts","../../core/src/tools/algo-trade.ts","../../core/src/tools/audit.ts","../../core/src/tools/bot/grid.ts","../../core/src/tools/bot/dca.ts","../../core/src/tools/bot/index.ts","../../core/src/tools/earn/savings.ts","../../core/src/tools/earn/onchain.ts","../../core/src/tools/earn/dcd.ts","../../core/src/tools/earn/autoearn.ts","../../core/src/tools/earn/index.ts","../../core/src/tools/contract-trade.ts","../../core/src/tools/futures-trade.ts","../../core/src/tools/market.ts","../../core/src/tools/option-algo-trade.ts","../../core/src/tools/option-trade.ts","../../core/src/tools/spot-trade.ts","../../core/src/tools/swap-trade.ts","../../core/src/tools/index.ts","../../core/src/tools/types.ts","../../core/src/config/toml.ts","../../core/src/config.ts","../../core/src/utils/update-check.ts","../../core/src/utils/logger.ts","../../core/src/setup.ts","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js","../src/commands/diagnose.ts","../src/commands/diagnose-utils.ts","../src/formatter.ts","../src/commands/diagnose-mcp.ts","../src/config/loader.ts","../src/help.ts","../src/commands/client-setup.ts","../src/parser.ts","../src/commands/market.ts","../src/commands/account.ts","../src/commands/spot.ts","../src/commands/swap.ts","../src/commands/futures.ts","../src/commands/option.ts","../src/config/toml.ts","../src/commands/config.ts","../src/commands/earn.ts","../src/commands/auto-earn.ts","../src/commands/bot.ts","../src/commands/onchain-earn.ts","../src/commands/dcd.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { OkxRestClient, toToolErrorPayload, checkForUpdates, createToolRunner, allToolSpecs } from \"@agent-tradekit/core\";\nimport type { ToolRunner } from \"@agent-tradekit/core\";\n\ndeclare const __GIT_HASH__: string;\n\nconst _require = createRequire(import.meta.url);\nconst CLI_VERSION = (_require(\"../package.json\") as { version: string }).version;\nconst GIT_HASH: string = typeof __GIT_HASH__ !== \"undefined\" ? __GIT_HASH__ : \"dev\";\nimport { cmdDiagnose } from \"./commands/diagnose.js\";\nimport { loadProfileConfig } from \"./config/loader.js\";\nimport { printHelp } from \"./help.js\";\nimport { parseCli } from \"./parser.js\";\nimport type { CliValues } from \"./parser.js\";\nimport {\n cmdMarketTicker,\n cmdMarketTickers,\n cmdMarketOrderbook,\n cmdMarketCandles,\n cmdMarketInstruments,\n cmdMarketFundingRate,\n cmdMarketMarkPrice,\n cmdMarketTrades,\n cmdMarketIndexTicker,\n cmdMarketIndexCandles,\n cmdMarketPriceLimit,\n cmdMarketOpenInterest,\n cmdMarketStockTokens,\n cmdMarketIndicator,\n} from \"./commands/market.js\";\nimport {\n cmdAccountBalance,\n cmdAccountAssetBalance,\n cmdAccountPositions,\n cmdAccountBills,\n cmdAccountFees,\n cmdAccountConfig,\n cmdAccountSetPositionMode,\n cmdAccountMaxSize,\n cmdAccountMaxAvailSize,\n cmdAccountMaxWithdrawal,\n cmdAccountPositionsHistory,\n cmdAccountTransfer,\n cmdAccountAudit,\n} from \"./commands/account.js\";\nimport {\n cmdSpotOrders,\n cmdSpotPlace,\n cmdSpotCancel,\n cmdSpotFills,\n cmdSpotGet,\n cmdSpotAmend,\n cmdSpotAlgoPlace,\n cmdSpotAlgoAmend,\n cmdSpotAlgoCancel,\n cmdSpotAlgoOrders,\n cmdSpotAlgoTrailPlace,\n cmdSpotBatch,\n} from \"./commands/spot.js\";\nimport {\n cmdSwapPositions,\n cmdSwapOrders,\n cmdSwapPlace,\n cmdSwapCancel,\n cmdSwapFills,\n cmdSwapGet,\n cmdSwapClose,\n cmdSwapGetLeverage,\n cmdSwapSetLeverage,\n cmdSwapAlgoPlace,\n cmdSwapAlgoAmend,\n cmdSwapAlgoCancel,\n cmdSwapAlgoOrders,\n cmdSwapAlgoTrailPlace,\n cmdSwapAmend,\n cmdSwapBatch,\n} from \"./commands/swap.js\";\nimport {\n cmdFuturesOrders,\n cmdFuturesPositions,\n cmdFuturesFills,\n cmdFuturesPlace,\n cmdFuturesCancel,\n cmdFuturesGet,\n cmdFuturesAmend,\n cmdFuturesAlgoPlace,\n cmdFuturesAlgoAmend,\n cmdFuturesAlgoCancel,\n cmdFuturesAlgoOrders,\n cmdFuturesAlgoTrailPlace,\n cmdFuturesBatch,\n cmdFuturesClose,\n cmdFuturesGetLeverage,\n cmdFuturesSetLeverage,\n} from \"./commands/futures.js\";\nimport {\n cmdOptionOrders,\n cmdOptionGet,\n cmdOptionPositions,\n cmdOptionFills,\n cmdOptionInstruments,\n cmdOptionGreeks,\n cmdOptionPlace,\n cmdOptionCancel,\n cmdOptionAmend,\n cmdOptionBatchCancel,\n cmdOptionAlgoPlace,\n cmdOptionAlgoAmend,\n cmdOptionAlgoCancel,\n cmdOptionAlgoOrders,\n} from \"./commands/option.js\";\nimport { cmdConfigShow, cmdConfigSet, cmdConfigInit, cmdConfigAddProfile, cmdConfigListProfile, cmdConfigUse } from \"./commands/config.js\";\nimport type { Lang } from \"./commands/config.js\";\nimport {\n cmdSetupClients,\n cmdSetupClient,\n printSetupUsage,\n SUPPORTED_CLIENTS,\n} from \"./commands/client-setup.js\";\nimport type { ClientId } from \"./commands/client-setup.js\";\nimport {\n cmdEarnSavingsBalance,\n cmdEarnSavingsPurchase,\n cmdEarnSavingsRedeem,\n cmdEarnSetLendingRate,\n cmdEarnLendingHistory,\n cmdEarnLendingRateHistory,\n} from \"./commands/earn.js\";\nimport {\n cmdAutoEarnStatus,\n cmdAutoEarnOn,\n cmdAutoEarnOff,\n} from \"./commands/auto-earn.js\";\nimport {\n cmdGridOrders,\n cmdGridDetails,\n cmdGridSubOrders,\n cmdGridCreate,\n cmdGridStop,\n cmdDcaCreate,\n cmdDcaStop,\n cmdDcaOrders,\n cmdDcaDetails,\n cmdDcaSubOrders,\n} from \"./commands/bot.js\";\nimport {\n cmdOnchainEarnOffers,\n cmdOnchainEarnPurchase,\n cmdOnchainEarnRedeem,\n cmdOnchainEarnCancel,\n cmdOnchainEarnActiveOrders,\n cmdOnchainEarnOrderHistory,\n} from \"./commands/onchain-earn.js\";\nimport {\n cmdDcdPairs,\n cmdDcdProducts,\n cmdDcdRedeemExecute,\n cmdDcdOrderState,\n cmdDcdOrders,\n cmdDcdQuoteAndBuy,\n} from \"./commands/dcd.js\";\nimport { markFailedIfSCodeError, output, outputLine, errorOutput, errorLine, setOutput } from \"./formatter.js\";\n\n// Re-export for tests and external consumers\nexport { printHelp } from \"./help.js\";\nexport type { CliValues } from \"./parser.js\";\n\n// ---------------------------------------------------------------------------\n// Command handlers\n// ---------------------------------------------------------------------------\n\nexport function handleConfigCommand(action: string, rest: string[], json: boolean, lang?: string, force?: boolean): Promise<void> | void {\n if (action === \"init\") return cmdConfigInit((lang === \"zh\" ? \"zh\" : \"en\") as Lang);\n if (action === \"show\") return cmdConfigShow(json);\n if (action === \"set\") return cmdConfigSet(rest[0], rest[1]);\n if (action === \"setup-clients\") return cmdSetupClients();\n if (action === \"add-profile\") return cmdConfigAddProfile(rest, force ?? false);\n if (action === \"list-profile\") return cmdConfigListProfile();\n if (action === \"use\") return cmdConfigUse(rest[0]);\n errorLine(`Unknown config command: ${action}`);\n process.exitCode = 1;\n}\n\nexport function handleSetupCommand(v: CliValues): void {\n if (!v.client) {\n printSetupUsage();\n return;\n }\n if (!SUPPORTED_CLIENTS.includes(v.client as ClientId)) {\n errorLine(`Unknown client: \"${v.client}\"`);\n errorLine(`Supported: ${SUPPORTED_CLIENTS.join(\", \")}`);\n process.exitCode = 1;\n return;\n }\n cmdSetupClient({\n client: v.client as ClientId,\n profile: v.profile,\n modules: v.modules,\n });\n}\n\nexport function handleMarketPublicCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"ticker\") return cmdMarketTicker(run, rest[0], json);\n if (action === \"tickers\") return cmdMarketTickers(run, rest[0], json);\n if (action === \"instruments\")\n return cmdMarketInstruments(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"mark-price\")\n return cmdMarketMarkPrice(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"index-ticker\")\n return cmdMarketIndexTicker(run, { instId: v.instId, quoteCcy: v.quoteCcy, json });\n if (action === \"price-limit\") return cmdMarketPriceLimit(run, rest[0], json);\n if (action === \"open-interest\")\n return cmdMarketOpenInterest(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"stock-tokens\")\n return cmdMarketStockTokens(run, { instType: v.instType, instId: v.instId, json });\n if (action === \"indicator\") {\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n const backtestTime = v[\"backtest-time\"] !== undefined ? Number(v[\"backtest-time\"]) : undefined;\n return cmdMarketIndicator(run, rest[0], rest[1], {\n bar: v.bar,\n params: v.params,\n list: v.list,\n limit,\n backtestTime,\n json,\n });\n }\n}\n\nexport function handleMarketDataCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"orderbook\")\n return cmdMarketOrderbook(run, rest[0], v.sz !== undefined ? Number(v.sz) : undefined, json);\n if (action === \"candles\")\n return cmdMarketCandles(run, rest[0], { bar: v.bar, limit, json });\n if (action === \"funding-rate\")\n return cmdMarketFundingRate(run, rest[0], { history: v.history ?? false, limit, json });\n if (action === \"trades\")\n return cmdMarketTrades(run, rest[0], { limit, json });\n if (action === \"index-candles\")\n return cmdMarketIndexCandles(run, rest[0], { bar: v.bar, limit, history: v.history ?? false, json });\n}\n\nexport function handleMarketCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n return (\n handleMarketPublicCommand(run, action, rest, v, json) ??\n handleMarketDataCommand(run, action, rest, v, json)\n );\n}\n\nexport function handleAccountWriteCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"set-position-mode\")\n return cmdAccountSetPositionMode(run, v.posMode!, json);\n if (action === \"max-size\")\n return cmdAccountMaxSize(run, { instId: v.instId!, tdMode: v.tdMode!, px: v.px, json });\n if (action === \"max-avail-size\")\n return cmdAccountMaxAvailSize(run, { instId: v.instId!, tdMode: v.tdMode!, json });\n if (action === \"max-withdrawal\") return cmdAccountMaxWithdrawal(run, v.ccy, json);\n if (action === \"transfer\")\n return cmdAccountTransfer(run, {\n ccy: v.ccy!,\n amt: v.amt!,\n from: v.from!,\n to: v.to!,\n transferType: v.transferType,\n subAcct: v.subAcct,\n json,\n });\n}\n\nfunction handleAccountCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"audit\")\n return cmdAccountAudit({ limit: v.limit, tool: v.tool, since: v.since, json });\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"balance\") return cmdAccountBalance(run, rest[0], json);\n if (action === \"asset-balance\") return cmdAccountAssetBalance(run, v.ccy, json);\n if (action === \"positions\")\n return cmdAccountPositions(run, { instType: v.instType, instId: v.instId, json });\n if (action === \"positions-history\")\n return cmdAccountPositionsHistory(run, {\n instType: v.instType,\n instId: v.instId,\n limit,\n json,\n });\n if (action === \"bills\")\n return cmdAccountBills(run, {\n archive: v.archive ?? false,\n instType: v.instType,\n ccy: v.ccy,\n limit,\n json,\n });\n if (action === \"fees\")\n return cmdAccountFees(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"config\") return cmdAccountConfig(run, json);\n return handleAccountWriteCommand(run, action, v, json);\n}\n\nexport function handleSpotAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"trail\")\n return cmdSpotAlgoTrailPlace(run, {\n instId: v.instId!,\n side: v.side!,\n sz: v.sz!,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n tdMode: v.tdMode,\n json,\n });\n if (subAction === \"place\")\n return cmdSpotAlgoPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n json,\n });\n if (subAction === \"amend\")\n return cmdSpotAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdSpotAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdSpotAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nexport function handleSpotCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\")\n return cmdSpotOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"open\",\n json,\n });\n if (action === \"get\")\n return cmdSpotGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"fills\")\n return cmdSpotFills(run, { instId: v.instId, ordId: v.ordId, json });\n if (action === \"amend\")\n return cmdSpotAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"place\")\n return cmdSpotPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n tgtCcy: v.tgtCcy,\n px: v.px,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdSpotCancel(run, { instId: (v.instId ?? rest[0])!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"algo\")\n return handleSpotAlgoCommand(run, rest[0], v, json);\n if (action === \"batch\")\n return cmdSpotBatch(run, { action: v.action!, orders: v.orders!, json });\n}\n\nexport function handleSwapAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"trail\")\n return cmdSwapAlgoTrailPlace(run, {\n instId: v.instId!,\n side: v.side!,\n sz: v.sz!,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n reduceOnly: v.reduceOnly,\n json,\n });\n if (subAction === \"place\")\n return cmdSwapAlgoPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n reduceOnly: v.reduceOnly,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n json,\n });\n if (subAction === \"amend\")\n return cmdSwapAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdSwapAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdSwapAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nfunction handleSwapQuery(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void | undefined {\n if (action === \"positions\")\n return cmdSwapPositions(run, v.instId ?? rest[0], json);\n if (action === \"orders\")\n return cmdSwapOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"open\",\n json,\n });\n if (action === \"get\")\n return cmdSwapGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"fills\")\n return cmdSwapFills(run, {\n instId: v.instId,\n ordId: v.ordId,\n archive: v.archive ?? false,\n json,\n });\n if (action === \"get-leverage\")\n return cmdSwapGetLeverage(run, { instId: v.instId!, mgnMode: v.mgnMode!, json });\n return undefined;\n}\n\nexport function handleSwapCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const queryResult = handleSwapQuery(run, action, rest, v, json);\n if (queryResult !== undefined) return queryResult;\n if (action === \"close\")\n return cmdSwapClose(run, {\n instId: v.instId!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n autoCxl: v.autoCxl,\n json,\n });\n if (action === \"place\")\n return cmdSwapPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n posSide: v.posSide,\n px: v.px,\n tdMode: v.tdMode ?? \"cross\",\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdSwapCancel(run, { instId: (v.instId ?? rest[0])!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"amend\")\n return cmdSwapAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"leverage\")\n return cmdSwapSetLeverage(run, {\n instId: v.instId!,\n lever: v.lever!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n json,\n });\n if (action === \"algo\")\n return handleSwapAlgoCommand(run, rest[0], v, json);\n if (action === \"batch\")\n return cmdSwapBatch(run, { action: v.action!, orders: v.orders!, json });\n}\n\nexport function handleOptionAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"place\")\n return cmdOptionAlgoPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode!,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n reduceOnly: v.reduceOnly,\n clOrdId: v.clOrdId,\n json,\n });\n if (subAction === \"amend\")\n return cmdOptionAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdOptionAlgoCancel(run, { instId: v.instId!, algoId: v.algoId!, json });\n if (subAction === \"orders\")\n return cmdOptionAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nexport function handleOptionCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\") {\n let status: \"live\" | \"history\" | \"archive\" = \"live\";\n if (v.archive) status = \"archive\";\n else if (v.history) status = \"history\";\n return cmdOptionOrders(run, { instId: v.instId, uly: v.uly, status, json });\n }\n if (action === \"get\")\n return cmdOptionGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"positions\")\n return cmdOptionPositions(run, { instId: v.instId, uly: v.uly, json });\n if (action === \"fills\")\n return cmdOptionFills(run, { instId: v.instId, ordId: v.ordId, archive: v.archive ?? false, json });\n if (action === \"instruments\")\n return cmdOptionInstruments(run, { uly: v.uly!, expTime: v.expTime, json });\n if (action === \"greeks\")\n return cmdOptionGreeks(run, { uly: v.uly!, expTime: v.expTime, json });\n if (action === \"place\")\n return cmdOptionPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n px: v.px,\n reduceOnly: v.reduceOnly,\n clOrdId: v.clOrdId,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdOptionCancel(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"amend\")\n return cmdOptionAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"batch-cancel\")\n return cmdOptionBatchCancel(run, { orders: v.orders!, json });\n if (action === \"algo\")\n return handleOptionAlgoCommand(run, rest[0], v, json);\n}\n\nexport function handleFuturesAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"trail\")\n return cmdFuturesAlgoTrailPlace(run, {\n instId: v.instId!,\n side: v.side!,\n sz: v.sz!,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n reduceOnly: v.reduceOnly,\n json,\n });\n if (subAction === \"place\")\n return cmdFuturesAlgoPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n tgtCcy: v.tgtCcy,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n reduceOnly: v.reduceOnly,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n json,\n });\n if (subAction === \"amend\")\n return cmdFuturesAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdFuturesAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdFuturesAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nfunction resolveFuturesOrdersStatus(v: CliValues): \"archive\" | \"history\" | \"open\" {\n if (v.archive) return \"archive\";\n if (v.history) return \"history\";\n return \"open\";\n}\n\nfunction handleFuturesQuery(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void | undefined {\n if (action === \"orders\")\n return cmdFuturesOrders(run, { instId: v.instId, status: resolveFuturesOrdersStatus(v), json });\n if (action === \"positions\") return cmdFuturesPositions(run, v.instId, json);\n if (action === \"fills\")\n return cmdFuturesFills(run, {\n instId: v.instId,\n ordId: v.ordId,\n archive: v.archive ?? false,\n json,\n });\n if (action === \"get\")\n return cmdFuturesGet(run, { instId: v.instId!, ordId: v.ordId, json });\n if (action === \"get-leverage\")\n return cmdFuturesGetLeverage(run, { instId: v.instId!, mgnMode: v.mgnMode!, json });\n return undefined;\n}\n\nexport function handleFuturesCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const queryResult = handleFuturesQuery(run, action, v, json);\n if (queryResult !== undefined) return queryResult;\n if (action === \"place\")\n return cmdFuturesPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n tdMode: v.tdMode ?? \"cross\",\n tgtCcy: v.tgtCcy,\n posSide: v.posSide,\n px: v.px,\n reduceOnly: v.reduceOnly,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdFuturesCancel(run, { instId: (v.instId ?? rest[0])!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"amend\")\n return cmdFuturesAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"close\")\n return cmdFuturesClose(run, {\n instId: v.instId!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n autoCxl: v.autoCxl,\n json,\n });\n if (action === \"leverage\")\n return cmdFuturesSetLeverage(run, {\n instId: v.instId!,\n lever: v.lever!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n json,\n });\n if (action === \"batch\")\n return cmdFuturesBatch(run, { action: v.action!, orders: v.orders!, json });\n if (action === \"algo\")\n return handleFuturesAlgoCommand(run, rest[0], v, json);\n}\n\nexport function handleBotGridCommand(\n run: ToolRunner,\n v: CliValues,\n rest: string[],\n json: boolean\n): Promise<void> | void {\n const subAction = rest[0];\n if (subAction === \"orders\")\n return cmdGridOrders(run, {\n algoOrdType: v.algoOrdType!,\n instId: v.instId,\n algoId: v.algoId,\n status: v.history ? \"history\" : \"active\",\n json,\n });\n if (subAction === \"details\")\n return cmdGridDetails(run, {\n algoOrdType: v.algoOrdType!,\n algoId: v.algoId!,\n json,\n });\n if (subAction === \"sub-orders\")\n return cmdGridSubOrders(run, {\n algoOrdType: v.algoOrdType!,\n algoId: v.algoId!,\n type: v.live ? \"live\" : \"filled\",\n json,\n });\n if (subAction === \"create\")\n return cmdGridCreate(run, {\n instId: v.instId!,\n algoOrdType: v.algoOrdType!,\n maxPx: v.maxPx!,\n minPx: v.minPx!,\n gridNum: v.gridNum!,\n runType: v.runType,\n quoteSz: v.quoteSz,\n baseSz: v.baseSz,\n direction: v.direction,\n lever: v.lever,\n sz: v.sz,\n basePos: v.basePos,\n tpTriggerPx: v.tpTriggerPx,\n slTriggerPx: v.slTriggerPx,\n tpRatio: v.tpRatio,\n slRatio: v.slRatio,\n algoClOrdId: v.algoClOrdId,\n json,\n });\n if (subAction === \"stop\")\n return cmdGridStop(run, {\n algoId: v.algoId!,\n algoOrdType: v.algoOrdType!,\n instId: v.instId!,\n stopType: v.stopType,\n json,\n });\n}\n\nexport function handleBotDcaCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n // CLI backward compatibility: default algoOrdType to contract_dca if not provided\n const algoOrdType = v.algoOrdType ?? \"contract_dca\";\n\n if (subAction === \"orders\")\n return cmdDcaOrders(run, { algoOrdType, algoId: v.algoId, instId: v.instId, history: v.history ?? false, json });\n if (subAction === \"details\")\n return cmdDcaDetails(run, { algoId: v.algoId!, algoOrdType, json });\n if (subAction === \"sub-orders\")\n return cmdDcaSubOrders(run, { algoId: v.algoId!, algoOrdType, cycleId: v.cycleId, json });\n if (subAction === \"create\")\n return cmdDcaCreate(run, {\n instId: v.instId!,\n algoOrdType,\n lever: v.lever,\n direction: v.direction!,\n initOrdAmt: v.initOrdAmt!,\n maxSafetyOrds: v.maxSafetyOrds!,\n tpPct: v.tpPct!,\n safetyOrdAmt: v.safetyOrdAmt,\n pxSteps: v.pxSteps,\n pxStepsMult: v.pxStepsMult,\n volMult: v.volMult,\n slPct: v.slPct,\n slMode: v.slMode,\n allowReinvest: v.allowReinvest,\n triggerStrategy: v.triggerStrategy,\n triggerPx: v.triggerPx,\n triggerCond: v.triggerCond,\n thold: v.thold,\n timeframe: v.timeframe,\n timePeriod: v.timePeriod,\n algoClOrdId: v.algoClOrdId,\n reserveFunds: v.reserveFunds,\n tradeQuoteCcy: v.tradeQuoteCcy,\n json,\n });\n if (subAction === \"stop\")\n return cmdDcaStop(run, { algoId: v.algoId!, algoOrdType, stopType: v.stopType, json });\n}\n\nexport function handleBotCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"grid\") return handleBotGridCommand(run, v, rest, json);\n if (action === \"dca\") return handleBotDcaCommand(run, rest[0], v, json);\n}\n\nexport function handleEarnCommand(\n run: ToolRunner,\n submodule: string,\n rest: string[],\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n const action = rest[0];\n const innerRest = rest.slice(1);\n if (submodule === \"savings\") return handleEarnSavingsCommand(run, action, innerRest, v, json);\n if (submodule === \"onchain\") return handleEarnOnchainCommand(run, action, v, json);\n if (submodule === \"dcd\") return handleEarnDcdCommand(run, action, v, json);\n if (submodule === \"auto-earn\") return handleEarnAutoEarnCommand(run, action, innerRest, v, json);\n errorLine(`Unknown earn sub-module: ${submodule}`);\n errorLine(\"Valid: savings, onchain, dcd, auto-earn\");\n process.exitCode = 1;\n}\n\nfunction handleEarnAutoEarnCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n const ccy = rest[0] ?? v.ccy;\n if (action === \"status\") return cmdAutoEarnStatus(run, ccy, json);\n if (action === \"on\") {\n if (!ccy) { errorLine(\"Currency required: okx earn auto-earn on <ccy>\"); process.exitCode = 1; return; }\n return cmdAutoEarnOn(run, ccy, json);\n }\n if (action === \"off\") {\n if (!ccy) { errorLine(\"Currency required: okx earn auto-earn off <ccy>\"); process.exitCode = 1; return; }\n return cmdAutoEarnOff(run, ccy, json);\n }\n errorLine(`Unknown auto-earn command: ${action}`);\n errorLine(\"Valid: status, on, off\");\n process.exitCode = 1;\n}\n\nfunction handleEarnSavingsCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"balance\") return cmdEarnSavingsBalance(run, rest[0] ?? v.ccy, json);\n if (action === \"purchase\") return cmdEarnSavingsPurchase(run, { ccy: v.ccy!, amt: v.amt!, rate: v.rate, json });\n if (action === \"redeem\") return cmdEarnSavingsRedeem(run, { ccy: v.ccy!, amt: v.amt!, json });\n if (action === \"set-rate\") return cmdEarnSetLendingRate(run, { ccy: v.ccy!, rate: v.rate!, json });\n if (action === \"lending-history\") return cmdEarnLendingHistory(run, { ccy: v.ccy, limit, json });\n if (action === \"rate-history\") return cmdEarnLendingRateHistory(run, { ccy: v.ccy, limit, json });\n errorLine(`Unknown earn savings command: ${action}`);\n process.exitCode = 1;\n}\n\nfunction handleEarnOnchainCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"offers\") return cmdOnchainEarnOffers(run, v).then((r) => outputResult(r, json));\n if (action === \"purchase\") return cmdOnchainEarnPurchase(run, v).then((r) => outputResult(r, json));\n if (action === \"redeem\") return cmdOnchainEarnRedeem(run, v).then((r) => outputResult(r, json));\n if (action === \"cancel\") return cmdOnchainEarnCancel(run, v).then((r) => outputResult(r, json));\n if (action === \"orders\") return cmdOnchainEarnActiveOrders(run, v).then((r) => outputResult(r, json));\n if (action === \"history\") return cmdOnchainEarnOrderHistory(run, v).then((r) => outputResult(r, json));\n errorLine(`Unknown earn onchain command: ${action}`);\n process.exitCode = 1;\n}\n\nfunction parseDcdOpts(v: CliValues) {\n return {\n limit: v.limit !== undefined ? Number(v.limit) : undefined,\n minYield: v.minYield !== undefined ? parseFloat(v.minYield) : undefined,\n strikeNear: v.strikeNear !== undefined ? parseFloat(v.strikeNear) : undefined,\n termDays: v.termDays !== undefined ? parseInt(v.termDays, 10) : undefined,\n minTermDays: v.minTermDays !== undefined ? parseInt(v.minTermDays, 10) : undefined,\n maxTermDays: v.maxTermDays !== undefined ? parseInt(v.maxTermDays, 10) : undefined,\n };\n}\n\nfunction handleEarnDcdCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n const { limit, minYield, strikeNear, termDays, minTermDays, maxTermDays } = parseDcdOpts(v);\n if (action === \"pairs\") return cmdDcdPairs(run, json);\n if (action === \"products\")\n return cmdDcdProducts(run, {\n baseCcy: v.baseCcy,\n quoteCcy: v.quoteCcy,\n optType: v.optType,\n minYield,\n strikeNear,\n termDays,\n minTermDays,\n maxTermDays,\n expDate: v.expDate,\n json,\n });\n if (action === \"quote-and-buy\")\n return cmdDcdQuoteAndBuy(run, {\n productId: v.productId!,\n notionalSz: v.sz!,\n notionalCcy: v.notionalCcy!,\n clOrdId: v.clOrdId,\n minAnnualizedYield: v.minAnnualizedYield !== undefined ? parseFloat(v.minAnnualizedYield) : undefined,\n json,\n });\n if (action === \"redeem-execute\")\n return cmdDcdRedeemExecute(run, { ordId: v.ordId!, json });\n if (action === \"order\")\n return cmdDcdOrderState(run, { ordId: v.ordId!, json });\n if (action === \"orders\")\n return cmdDcdOrders(run, {\n ordId: v.ordId,\n productId: v.productId,\n uly: v.uly,\n state: v.state,\n beginId: v.beginId,\n endId: v.endId,\n begin: v.begin,\n end: v.end,\n limit,\n json,\n });\n errorLine(`Unknown earn dcd command: ${action}`);\n errorLine(\"Valid: pairs, products, quote-and-buy, redeem-execute, order, orders\");\n process.exitCode = 1;\n}\n\nfunction outputResult(result: { endpoint: string; requestTime: string; data: unknown }, json: boolean): void {\n if (json) {\n outputLine(JSON.stringify(result, null, 2));\n } else {\n outputLine(JSON.stringify(result.data, null, 2));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main entry point\n// ---------------------------------------------------------------------------\n\nfunction printHelpForLevel(positionals: string[]): void {\n const [module, subgroup] = positionals;\n if (!module) printHelp();\n else if (!subgroup) printHelp(module);\n else printHelp(module, subgroup);\n}\n\nfunction printVerboseConfigSummary(config: import(\"@agent-tradekit/core\").OkxConfig, profile?: string): void {\n let authLabel = \"\\u2717\";\n if (config.hasAuth && config.apiKey) {\n authLabel = `\\u2713(${config.apiKey.slice(0, 3)}***${config.apiKey.slice(-3)})`;\n } else if (config.hasAuth) {\n authLabel = \"\\u2713\";\n }\n errorLine(`[verbose] config: profile=${profile ?? \"default\"} site=${config.site} base=${config.baseUrl} auth=${authLabel} demo=${config.demo ? \"on\" : \"off\"} modules=${config.modules.join(\",\")}`);\n}\n\nasync function main(): Promise<void> {\n setOutput({\n out: (m) => process.stdout.write(m),\n err: (m) => process.stderr.write(m),\n });\n\n checkForUpdates(\"@okx_ai/okx-trade-cli\", CLI_VERSION);\n\n const { values, positionals } = parseCli(process.argv.slice(2));\n\n if (values.version) {\n outputLine(`${CLI_VERSION} (${GIT_HASH})`);\n return;\n }\n\n if (values.help || positionals.length === 0) {\n printHelpForLevel(positionals);\n return;\n }\n\n const [module, action, ...rest] = positionals;\n const v = values;\n const json = v.json ?? false;\n\n if (module === \"config\") return handleConfigCommand(action, rest, json, v.lang, v.force);\n if (module === \"setup\") return handleSetupCommand(v);\n\n // diagnose runs before loadConfig — it must handle config parse errors itself\n if (module === \"diagnose\") {\n let config: ReturnType<typeof loadProfileConfig> | undefined;\n try {\n config = loadProfileConfig({ profile: v.profile, demo: v.demo, verbose: v.verbose, userAgent: `okx-trade-cli/${CLI_VERSION}`, sourceTag: \"CLI\" });\n } catch {\n // Config parse failed — diagnose will detect and report it\n }\n return cmdDiagnose(config, v.profile ?? \"default\", { mcp: v.mcp, cli: v.cli, all: v.all, output: v.output });\n }\n\n const config = loadProfileConfig({ profile: v.profile, demo: v.demo, verbose: v.verbose, userAgent: `okx-trade-cli/${CLI_VERSION}`, sourceTag: \"CLI\" });\n\n const client = new OkxRestClient(config);\n const baseRunner = createToolRunner(client, config);\n const writeToolNames = new Set(allToolSpecs().filter((t) => t.isWrite).map((t) => t.name));\n const run: ToolRunner = async (toolName, args) => {\n const result = await baseRunner(toolName, args);\n if (writeToolNames.has(toolName)) {\n markFailedIfSCodeError(result.data);\n }\n return result;\n };\n\n const moduleHandlers: Record<string, () => Promise<void> | void> = {\n market: () => handleMarketCommand(run, action, rest, v, json),\n account: () => handleAccountCommand(run, action, rest, v, json),\n spot: () => handleSpotCommand(run, action, rest, v, json),\n swap: () => handleSwapCommand(run, action, rest, v, json),\n futures: () => handleFuturesCommand(run, action, rest, v, json),\n option: () => handleOptionCommand(run, action, rest, v, json),\n bot: () => handleBotCommand(run, action, rest, v, json),\n earn: () => handleEarnCommand(run, action, rest, v, json),\n };\n const handler = moduleHandlers[module];\n if (handler) return handler();\n errorLine(`Unknown command: ${module} ${action ?? \"\"}`);\n process.exitCode = 1;\n}\n\nmain().catch((error: unknown) => {\n const payload = toToolErrorPayload(error);\n errorLine(`Error: ${payload.message}`);\n if (payload.traceId) errorLine(`TraceId: ${payload.traceId}`);\n if (payload.suggestion) errorLine(`Hint: ${payload.suggestion}`);\n errorLine(`Version: @okx_ai/okx-trade-cli@${CLI_VERSION}`);\n process.exitCode = 1;\n});\n","import { ProxyAgent } from \"undici\";\nimport { getNow, signOkxPayload } from \"../utils/signature.js\";\nimport {\n AuthenticationError,\n ConfigError,\n NetworkError,\n OkxApiError,\n RateLimitError,\n} from \"../utils/errors.js\";\n\ntype CodeBehavior =\n | { retry: true; suggestion: string }\n | { retry: false; suggestion: string };\n\nconst OKX_CODE_BEHAVIORS: Record<string, CodeBehavior> = {\n // Rate limit → throw RateLimitError\n \"50011\": { retry: true, suggestion: \"Rate limited. Back off and retry after a delay.\" },\n \"50061\": { retry: true, suggestion: \"Too many connections. Reduce request frequency and retry.\" },\n\n // Server temporarily unavailable → retryable\n \"50001\": { retry: true, suggestion: \"OKX system upgrade in progress. Retry in a few minutes.\" },\n \"50004\": { retry: true, suggestion: \"Endpoint temporarily unavailable. Retry later.\" },\n \"50013\": { retry: true, suggestion: \"System busy. Retry after 1-2 seconds.\" },\n \"50026\": { retry: true, suggestion: \"Order book system upgrading. Retry in a few minutes.\" },\n\n // Region / compliance restriction → do not retry\n \"51155\": { retry: false, suggestion: \"Feature unavailable in your region (site: {site}). Verify your site setting matches your account registration region. Available sites: global, eea, us. Do not retry.\" },\n \"51734\": { retry: false, suggestion: \"Feature not supported for your KYC country (site: {site}). Verify your site setting matches your account registration region. Available sites: global, eea, us. Do not retry.\" },\n\n // Account issues → do not retry\n \"50007\": { retry: false, suggestion: \"Account suspended. Contact OKX support. Do not retry.\" },\n \"50009\": { retry: false, suggestion: \"Account blocked by risk control. Contact OKX support. Do not retry.\" },\n \"51009\": { retry: false, suggestion: \"Account mode not supported for this operation. Check account settings.\" },\n\n // API key permission / expiry → do not retry\n \"50100\": { retry: false, suggestion: \"API key lacks required permissions. Update API key permissions.\" },\n \"50110\": { retry: false, suggestion: \"API key expired. Generate a new API key.\" },\n\n // Insufficient funds / margin → do not retry\n \"51008\": { retry: false, suggestion: \"Insufficient balance in trading account. Check funding account via account_get_asset_balance — funds may be there. Use account_transfer (from=18, to=6) to move funds to trading account, then retry.\" },\n \"51119\": { retry: false, suggestion: \"Insufficient margin. Add margin or check funding account (account_get_asset_balance). Transfer via account_transfer (from=18, to=6) if needed.\" },\n \"51127\": { retry: false, suggestion: \"Insufficient available margin. Reduce position, add margin, or transfer from funding account (account_transfer from=18 to=6).\" },\n\n // Instrument unavailable → do not retry\n \"51021\": { retry: false, suggestion: \"Instrument does not exist. Check instId.\" },\n \"51022\": { retry: false, suggestion: \"Instrument not available for trading.\" },\n \"51027\": { retry: false, suggestion: \"Contract has expired.\" },\n};\nimport { RateLimiter } from \"../utils/rate-limiter.js\";\nimport type { OkxConfig } from \"../config.js\";\nimport type {\n OkxApiResponse,\n QueryParams,\n QueryValue,\n RequestConfig,\n RequestResult,\n} from \"./types.js\";\n\nfunction isDefined(value: unknown): boolean {\n return value !== undefined && value !== null;\n}\n\nfunction extractTraceId(headers: Headers): string | undefined {\n return (\n headers.get(\"x-trace-id\") ??\n headers.get(\"x-request-id\") ??\n headers.get(\"traceid\") ??\n undefined\n );\n}\n\nfunction stringifyQueryValue(value: QueryValue): string {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\",\");\n }\n return String(value);\n}\n\nfunction buildQueryString(query?: QueryParams): string {\n if (!query) {\n return \"\";\n }\n\n const entries = Object.entries(query).filter(([, value]) => isDefined(value));\n if (entries.length === 0) {\n return \"\";\n }\n\n const params = new URLSearchParams();\n for (const [key, value] of entries) {\n params.set(key, stringifyQueryValue(value));\n }\n return params.toString();\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return \"***\";\n return `${key.slice(0, 3)}***${key.slice(-3)}`;\n}\n\nfunction vlog(message: string): void {\n process.stderr.write(`[verbose] ${message}\\n`);\n}\n\nexport class OkxRestClient {\n private readonly config: OkxConfig;\n private readonly rateLimiter: RateLimiter;\n private readonly dispatcher?: ProxyAgent;\n\n public constructor(config: OkxConfig) {\n this.config = config;\n this.rateLimiter = new RateLimiter(30_000, config.verbose);\n if (config.proxyUrl) {\n this.dispatcher = new ProxyAgent(config.proxyUrl);\n }\n }\n\n private logRequest(method: string, url: string, auth: string): void {\n if (!this.config.verbose) return;\n vlog(`\\u2192 ${method} ${url}`);\n const authInfo = auth === \"private\" && this.config.apiKey\n ? `auth=\\u2713(${maskKey(this.config.apiKey)})` : `auth=${auth}`;\n vlog(` ${authInfo} demo=${this.config.demo} timeout=${this.config.timeoutMs}ms`);\n }\n\n private logResponse(\n status: number, rawLen: number, elapsed: number,\n traceId: string | undefined, code?: string, msg?: string,\n ): void {\n if (!this.config.verbose) return;\n if (code && code !== \"0\" && code !== \"1\") {\n vlog(`\\u2717 ${status} | code=${code} | msg=${msg ?? \"-\"} | ${rawLen}B | ${elapsed}ms | trace=${traceId ?? \"-\"}`);\n } else {\n vlog(`\\u2190 ${status} | code=${code ?? \"0\"} | ${rawLen}B | ${elapsed}ms | trace=${traceId ?? \"-\"}`);\n }\n }\n\n public async publicGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"public\",\n query,\n rateLimit,\n });\n }\n\n public async privateGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"private\",\n query,\n rateLimit,\n });\n }\n\n public async publicPost<TData = unknown>(\n path: string,\n body?: RequestConfig[\"body\"],\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"POST\",\n path,\n auth: \"public\",\n body,\n rateLimit,\n });\n }\n\n public async privatePost<TData = unknown>(\n path: string,\n body?: RequestConfig[\"body\"],\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"POST\",\n path,\n auth: \"private\",\n body,\n rateLimit,\n });\n }\n\n private setAuthHeaders(\n headers: Headers, method: string, requestPath: string, bodyJson: string, timestamp: string,\n ): void {\n if (!this.config.hasAuth) {\n throw new ConfigError(\n \"Private endpoint requires API credentials.\",\n \"Configure OKX_API_KEY, OKX_SECRET_KEY and OKX_PASSPHRASE.\",\n );\n }\n\n if (!this.config.apiKey || !this.config.secretKey || !this.config.passphrase) {\n throw new ConfigError(\n \"Invalid private API credentials state.\",\n \"Ensure all OKX credentials are set.\",\n );\n }\n\n // OKX signature: timestamp + METHOD + requestPath + body\n const payload = `${timestamp}${method.toUpperCase()}${requestPath}${bodyJson}`;\n const signature = signOkxPayload(payload, this.config.secretKey);\n headers.set(\"OK-ACCESS-KEY\", this.config.apiKey);\n headers.set(\"OK-ACCESS-SIGN\", signature);\n headers.set(\"OK-ACCESS-PASSPHRASE\", this.config.passphrase);\n headers.set(\"OK-ACCESS-TIMESTAMP\", timestamp);\n }\n\n private throwOkxError(\n code: string, msg: string | undefined, reqConfig: RequestConfig, traceId: string | undefined,\n ): never {\n const message = msg || \"OKX API request failed.\";\n const endpoint = `${reqConfig.method} ${reqConfig.path}`;\n\n if (code === \"50111\" || code === \"50112\" || code === \"50113\") {\n throw new AuthenticationError(\n message,\n \"Check API key, secret, passphrase and permissions.\",\n endpoint,\n traceId,\n );\n }\n\n const behavior = OKX_CODE_BEHAVIORS[code];\n const suggestion = behavior?.suggestion?.replace(\"{site}\", this.config.site);\n\n if (code === \"50011\" || code === \"50061\") {\n throw new RateLimitError(message, suggestion, endpoint, traceId);\n }\n\n throw new OkxApiError(message, {\n code,\n endpoint,\n suggestion,\n traceId,\n });\n }\n\n private processResponse<TData>(\n rawText: string,\n response: Response,\n elapsed: number,\n traceId: string | undefined,\n reqConfig: RequestConfig,\n requestPath: string,\n ): RequestResult<TData> {\n let parsed: OkxApiResponse<TData>;\n try {\n parsed = (rawText ? JSON.parse(rawText) : {}) as OkxApiResponse<TData>;\n } catch (error) {\n this.logResponse(response.status, rawText.length, elapsed, traceId, \"non-JSON\");\n if (!response.ok) {\n const messagePreview = rawText.slice(0, 160).replace(/\\s+/g, \" \").trim();\n throw new OkxApiError(\n `HTTP ${response.status} from OKX: ${messagePreview || \"Non-JSON response body\"}`,\n {\n code: String(response.status),\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n suggestion: \"Verify endpoint path and request parameters.\",\n traceId,\n },\n );\n }\n throw new NetworkError(\n `OKX returned non-JSON response for ${reqConfig.method} ${requestPath}.`,\n `${reqConfig.method} ${requestPath}`,\n error,\n );\n }\n\n if (!response.ok) {\n this.logResponse(response.status, rawText.length, elapsed, traceId, parsed.code ?? \"-\", parsed.msg);\n throw new OkxApiError(\n `HTTP ${response.status} from OKX: ${parsed.msg ?? \"Unknown error\"}`,\n {\n code: String(response.status),\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n suggestion: \"Retry later or verify endpoint parameters.\",\n traceId,\n },\n );\n }\n\n const responseCode = parsed.code;\n this.logResponse(response.status, rawText.length, elapsed, traceId, responseCode, parsed.msg);\n\n if (responseCode && responseCode !== \"0\" && responseCode !== \"1\") {\n this.throwOkxError(responseCode, parsed.msg, reqConfig, traceId);\n }\n\n return {\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n requestTime: new Date().toISOString(),\n data: (parsed.data ?? null) as TData,\n raw: parsed,\n };\n }\n\n private async request<TData = unknown>(\n reqConfig: RequestConfig,\n ): Promise<RequestResult<TData>> {\n const queryString = buildQueryString(reqConfig.query);\n const requestPath = queryString.length > 0 ? `${reqConfig.path}?${queryString}` : reqConfig.path;\n const url = `${this.config.baseUrl}${requestPath}`;\n const bodyJson = reqConfig.body ? JSON.stringify(reqConfig.body) : \"\";\n const timestamp = getNow();\n\n this.logRequest(reqConfig.method, url, reqConfig.auth);\n\n if (reqConfig.rateLimit) {\n await this.rateLimiter.consume(reqConfig.rateLimit);\n }\n\n const headers = new Headers({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n });\n\n if (this.config.userAgent) {\n headers.set(\"User-Agent\", this.config.userAgent);\n }\n\n if (reqConfig.auth === \"private\") {\n this.setAuthHeaders(headers, reqConfig.method, requestPath, bodyJson, timestamp);\n }\n\n if (this.config.demo) {\n headers.set(\"x-simulated-trading\", \"1\");\n }\n\n const t0 = Date.now();\n let response: Response;\n try {\n const fetchOptions: Record<string, unknown> = {\n method: reqConfig.method,\n headers,\n body: reqConfig.method === \"POST\" ? bodyJson : undefined,\n signal: AbortSignal.timeout(this.config.timeoutMs),\n };\n if (this.dispatcher) {\n fetchOptions.dispatcher = this.dispatcher;\n }\n response = await fetch(url, fetchOptions as RequestInit);\n } catch (error) {\n if (this.config.verbose) {\n const elapsed = Date.now() - t0;\n const cause = error instanceof Error ? error.message : String(error);\n vlog(`\\u2717 NetworkError after ${elapsed}ms: ${cause}`);\n }\n throw new NetworkError(\n `Failed to call OKX endpoint ${reqConfig.method} ${requestPath}.`,\n `${reqConfig.method} ${requestPath}`,\n error,\n );\n }\n\n const rawText = await response.text();\n const elapsed = Date.now() - t0;\n const traceId = extractTraceId(response.headers);\n return this.processResponse<TData>(rawText, response, elapsed, traceId, reqConfig, requestPath);\n }\n}\n","import { createHmac } from \"node:crypto\";\n\nexport function getNow(): string {\n return new Date().toISOString();\n}\n\nexport function signOkxPayload(payload: string, secretKey: string): string {\n return createHmac(\"sha256\", secretKey).update(payload).digest(\"base64\");\n}\n","export type ErrorType =\n | \"ConfigError\"\n | \"AuthenticationError\"\n | \"RateLimitError\"\n | \"ValidationError\"\n | \"OkxApiError\"\n | \"NetworkError\"\n | \"InternalError\";\n\nexport interface ToolErrorPayload {\n error: true;\n type: ErrorType;\n code?: string;\n message: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n timestamp: string;\n}\n\nexport class OkxMcpError extends Error {\n public readonly type: ErrorType;\n public readonly code?: string;\n public readonly suggestion?: string;\n public readonly endpoint?: string;\n public readonly traceId?: string;\n\n public constructor(\n type: ErrorType,\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n cause?: unknown;\n },\n ) {\n super(message, options?.cause ? { cause: options.cause } : undefined);\n this.name = type;\n this.type = type;\n this.code = options?.code;\n this.suggestion = options?.suggestion;\n this.endpoint = options?.endpoint;\n this.traceId = options?.traceId;\n }\n}\n\nexport class ConfigError extends OkxMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ConfigError\", message, { suggestion });\n }\n}\n\nexport class ValidationError extends OkxMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ValidationError\", message, { suggestion });\n }\n}\n\nexport class RateLimitError extends OkxMcpError {\n public constructor(\n message: string,\n suggestion?: string,\n endpoint?: string,\n traceId?: string,\n ) {\n super(\"RateLimitError\", message, { suggestion, endpoint, traceId });\n }\n}\n\nexport class AuthenticationError extends OkxMcpError {\n public constructor(\n message: string,\n suggestion?: string,\n endpoint?: string,\n traceId?: string,\n ) {\n super(\"AuthenticationError\", message, { suggestion, endpoint, traceId });\n }\n}\n\nexport class OkxApiError extends OkxMcpError {\n public constructor(\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n cause?: unknown;\n },\n ) {\n super(\"OkxApiError\", message, options);\n }\n}\n\nexport class NetworkError extends OkxMcpError {\n public constructor(message: string, endpoint?: string, cause?: unknown) {\n super(\"NetworkError\", message, {\n endpoint,\n cause,\n suggestion:\n \"Please check network connectivity and retry the request in a few seconds.\",\n });\n }\n}\n\nexport function toToolErrorPayload(\n error: unknown,\n fallbackEndpoint?: string,\n): ToolErrorPayload {\n if (error instanceof OkxMcpError) {\n return {\n error: true,\n type: error.type,\n code: error.code,\n message: error.message,\n suggestion: error.suggestion,\n endpoint: error.endpoint ?? fallbackEndpoint,\n traceId: error.traceId,\n timestamp: new Date().toISOString(),\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n error: true,\n type: \"InternalError\",\n message,\n suggestion:\n \"Unexpected server error. Check tool arguments and retry. If it persists, inspect server logs.\",\n endpoint: fallbackEndpoint,\n timestamp: new Date().toISOString(),\n };\n}\n","import { RateLimitError } from \"./errors.js\";\n\ntype Bucket = {\n tokens: number;\n lastRefillMs: number;\n capacity: number;\n refillPerSecond: number;\n};\n\nexport type RateLimitConfig = {\n key: string;\n capacity: number;\n refillPerSecond: number;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport class RateLimiter {\n private readonly buckets = new Map<string, Bucket>();\n private readonly maxWaitMs: number;\n private readonly verbose: boolean;\n\n public constructor(maxWaitMs = 30_000, verbose = false) {\n this.maxWaitMs = maxWaitMs;\n this.verbose = verbose;\n }\n\n public async consume(config: RateLimitConfig, amount = 1): Promise<void> {\n const bucket = this.getBucket(config);\n this.refill(bucket);\n\n if (bucket.tokens >= amount) {\n bucket.tokens -= amount;\n return;\n }\n\n const missing = amount - bucket.tokens;\n const secondsToWait = missing / bucket.refillPerSecond;\n const waitMs = Math.ceil(secondsToWait * 1000);\n\n if (waitMs > this.maxWaitMs) {\n throw new RateLimitError(\n `Client-side rate limit reached for ${config.key}. Required wait ${waitMs}ms exceeds allowed max ${this.maxWaitMs}ms.`,\n \"Reduce tool call frequency or retry later.\",\n );\n }\n\n if (this.verbose) {\n process.stderr.write(`[verbose] \\u23F3 rate-limit: waiting ${waitMs}ms for \"${config.key}\"\\n`);\n }\n await sleep(waitMs);\n this.refill(bucket);\n\n if (bucket.tokens < amount) {\n throw new RateLimitError(\n `Rate limiter failed to acquire enough tokens for ${config.key}.`,\n );\n }\n\n bucket.tokens -= amount;\n }\n\n private getBucket(config: RateLimitConfig): Bucket {\n const existing = this.buckets.get(config.key);\n if (existing) {\n if (\n existing.capacity !== config.capacity ||\n existing.refillPerSecond !== config.refillPerSecond\n ) {\n existing.capacity = config.capacity;\n existing.refillPerSecond = config.refillPerSecond;\n existing.tokens = Math.min(existing.tokens, config.capacity);\n }\n return existing;\n }\n\n const now = Date.now();\n const created: Bucket = {\n tokens: config.capacity,\n lastRefillMs: now,\n capacity: config.capacity,\n refillPerSecond: config.refillPerSecond,\n };\n this.buckets.set(config.key, created);\n return created;\n }\n\n private refill(bucket: Bucket): void {\n const now = Date.now();\n const elapsedMs = now - bucket.lastRefillMs;\n if (elapsedMs <= 0) {\n return;\n }\n\n const refillTokens = (elapsedMs / 1000) * bucket.refillPerSecond;\n bucket.tokens = Math.min(bucket.capacity, bucket.tokens + refillTokens);\n bucket.lastRefillMs = now;\n }\n}\n","import { ValidationError } from \"../utils/errors.js\";\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n return value as Record<string, unknown>;\n}\n\nexport function readString(\n args: Record<string, unknown>,\n key: string,\n): string | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new ValidationError(`Parameter \"${key}\" must be a string.`);\n }\n return value;\n}\n\nexport function readNumber(\n args: Record<string, unknown>,\n key: string,\n): number | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new ValidationError(`Parameter \"${key}\" must be a number.`);\n }\n return value;\n}\n\nexport function readBoolean(\n args: Record<string, unknown>,\n key: string,\n): boolean | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new ValidationError(`Parameter \"${key}\" must be a boolean.`);\n }\n return value;\n}\n\nexport function readStringArray(\n args: Record<string, unknown>,\n key: string,\n): string[] | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(`Parameter \"${key}\" must be an array of strings.`);\n }\n return value;\n}\n\nexport function requireString(\n args: Record<string, unknown>,\n key: string,\n): string {\n const value = readString(args, key);\n if (!value || value.length === 0) {\n throw new ValidationError(`Missing required parameter \"${key}\".`);\n }\n return value;\n}\n\nexport function assertEnum(\n value: string | undefined,\n key: string,\n values: readonly string[],\n): void {\n if (value === undefined) {\n return;\n }\n if (!values.includes(value)) {\n throw new ValidationError(\n `Parameter \"${key}\" must be one of: ${values.join(\", \")}.`,\n );\n }\n}\n\nexport function compactObject(\n object: Record<string, unknown>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(object)) {\n if (value !== undefined && value !== null) {\n next[key] = value;\n }\n }\n return next;\n}\n\nexport function normalizeResponse(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function buildAttachAlgoOrds(\n source: Record<string, unknown>,\n): Record<string, unknown>[] | undefined {\n const tpTriggerPx = readString(source, \"tpTriggerPx\");\n const tpOrdPx = readString(source, \"tpOrdPx\");\n const slTriggerPx = readString(source, \"slTriggerPx\");\n const slOrdPx = readString(source, \"slOrdPx\");\n const entry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n return Object.keys(entry).length > 0 ? [entry] : undefined;\n}\n","import type { RateLimitConfig } from \"../utils/rate-limiter.js\";\nimport { ConfigError } from \"../utils/errors.js\";\nimport type { OkxConfig } from \"../config.js\";\n\nexport const OKX_CANDLE_BARS = [\n \"1m\", \"3m\", \"5m\", \"15m\", \"30m\",\n \"1H\", \"2H\", \"4H\", \"6H\", \"12H\",\n \"1D\", \"2D\", \"3D\", \"1W\", \"1M\", \"3M\",\n] as const;\n\nexport const OKX_INST_TYPES = [\n \"SPOT\", \"SWAP\", \"FUTURES\", \"OPTION\", \"MARGIN\",\n] as const;\n\nexport function publicRateLimit(key: string, rps = 20): RateLimitConfig {\n return {\n key: `public:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n\nexport function privateRateLimit(key: string, rps = 10): RateLimitConfig {\n return {\n key: `private:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n\n/**\n * Throw a ConfigError if demo/simulated trading mode is active.\n * Use this for endpoints that OKX does not support in simulated trading.\n */\nexport function assertNotDemo(config: OkxConfig, endpoint: string): void {\n if (config.demo) {\n throw new ConfigError(\n `\"${endpoint}\" is not supported in simulated trading mode.`,\n \"Disable demo mode (remove OKX_DEMO=1 or --demo flag) to use this endpoint.\",\n );\n }\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { publicRateLimit } from \"./common.js\";\n\n// Valid timeframes accepted by the indicator API\nexport const INDICATOR_BARS = [\n \"3m\", \"5m\", \"15m\", \"1H\", \"4H\", \"12Hutc\", \"1Dutc\", \"3Dutc\", \"1Wutc\",\n] as const;\n\nexport type IndicatorBar = (typeof INDICATOR_BARS)[number];\n\n// Overrides for CLI names whose API code differs from simple uppercase + underscore\nconst INDICATOR_CODE_OVERRIDES: Record<string, string> = {\n \"rainbow\": \"BTCRAINBOW\",\n \"range-filter\": \"RANGEFILTER\",\n \"stoch-rsi\": \"STOCHRSI\",\n \"pi-cycle-top\": \"PI_CYCLE_TOP\",\n \"pi-cycle-bottom\": \"PI_CYCLE_BOTTOM\",\n // boll is an alias for bb; server supports BB not BOLL\n \"boll\": \"BB\",\n};\n\nexport function resolveIndicatorCode(name: string): string {\n const lower = name.toLowerCase();\n return INDICATOR_CODE_OVERRIDES[lower] ?? name.toUpperCase().replace(/-/g, \"_\");\n}\n\nfunction readNumberArray(\n args: Record<string, unknown>,\n key: string,\n): number[] | undefined {\n const value = args[key];\n if (value === undefined || value === null) return undefined;\n if (!Array.isArray(value)) return undefined;\n return value.map((item) => Number(item));\n}\n\nexport function registerIndicatorTools(): ToolSpec[] {\n return [\n {\n name: \"market_get_indicator\",\n module: \"market\",\n description:\n \"Get technical indicator values for an instrument (MA, EMA, RSI, MACD, BB, KDJ, SUPERTREND, AHR999, BTCRAINBOW, and more). No credentials required.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"Instrument ID, e.g. BTC-USDT\",\n },\n indicator: {\n type: \"string\",\n description:\n \"Indicator name (case-insensitive). Examples: ma, ema, rsi, macd, bb, kdj, supertrend, ahr999, rainbow, pi-cycle-top, pi-cycle-bottom, mayer, envelope, halftrend, alphatrend, pmax, waddah, tdi, qqe, range-filter\",\n },\n bar: {\n type: \"string\",\n enum: [...INDICATOR_BARS],\n description: \"Timeframe. Default: 1H\",\n },\n params: {\n type: \"array\",\n items: { type: \"number\" },\n description: \"Indicator parameters, e.g. [5, 20] for MA with periods 5 and 20\",\n },\n returnList: {\n type: \"boolean\",\n description: \"Return a historical list instead of the latest value only. Default: false\",\n },\n limit: {\n type: \"integer\",\n minimum: 1,\n maximum: 100,\n description: \"Number of historical records to return (only used when returnList=true). Default: 10\",\n },\n backtestTime: {\n type: \"integer\",\n description: \"Backtest timestamp in milliseconds. Omit for live (real-time) mode\",\n },\n },\n required: [\"instId\", \"indicator\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instId = requireString(args, \"instId\");\n const indicator = requireString(args, \"indicator\");\n const bar = readString(args, \"bar\") ?? \"1H\";\n const params = readNumberArray(args, \"params\");\n const returnList = readBoolean(args, \"returnList\") ?? false;\n const limit = readNumber(args, \"limit\") ?? 10;\n const backtestTime = readNumber(args, \"backtestTime\");\n\n const apiCode = resolveIndicatorCode(indicator);\n const indicatorConfig = compactObject({\n paramList: params && params.length > 0 ? params : undefined,\n returnList,\n limit: returnList ? limit : undefined,\n });\n\n const body = compactObject({\n instId,\n timeframes: [bar],\n indicators: { [apiCode]: indicatorConfig },\n backtestTime,\n });\n\n const response = await context.client.publicPost(\n \"/api/v5/aigc/mcp/indicators\",\n body,\n publicRateLimit(\"market_get_indicator\", 5),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","export const OKX_API_BASE_URL = \"https://www.okx.com\";\n\n/** Default source tag injected into all order placements for attribution. */\nexport const DEFAULT_SOURCE_TAG = \"MCP\";\n\n// ---------------------------------------------------------------------------\n// Site registry\n// ---------------------------------------------------------------------------\n\nexport interface OkxSite {\n label: string;\n apiBaseUrl: string;\n /** User-facing web URL for account/API key management pages */\n webUrl: string;\n}\n\nexport const OKX_SITES = {\n global: {\n label: \"Global\",\n apiBaseUrl: \"https://www.okx.com\",\n webUrl: \"https://www.okx.com\",\n },\n eea: {\n label: \"EEA\",\n apiBaseUrl: \"https://eea.okx.com\",\n webUrl: \"https://my.okx.com\",\n },\n us: {\n label: \"US\",\n apiBaseUrl: \"https://app.okx.com\",\n webUrl: \"https://app.okx.com\",\n },\n} as const satisfies Record<string, OkxSite>;\n\nexport type SiteId = keyof typeof OKX_SITES;\nexport const SITE_IDS = Object.keys(OKX_SITES) as SiteId[];\n\nexport const BOT_SUB_MODULE_IDS = [\n \"bot.grid\",\n \"bot.dca\",\n] as const;\n\nexport type BotSubModuleId = (typeof BOT_SUB_MODULE_IDS)[number];\n\nexport const BOT_DEFAULT_SUB_MODULES: BotSubModuleId[] = [\"bot.grid\"];\n\nexport const EARN_SUB_MODULE_IDS = [\n \"earn.savings\",\n \"earn.onchain\",\n \"earn.dcd\",\n \"earn.autoearn\",\n] as const;\n\nexport type EarnSubModuleId = (typeof EARN_SUB_MODULE_IDS)[number];\n\nexport const MODULES = [\n \"market\",\n \"spot\",\n \"swap\",\n \"futures\",\n \"option\",\n \"account\",\n ...EARN_SUB_MODULE_IDS,\n ...BOT_SUB_MODULE_IDS,\n] as const;\n\nexport type ModuleId = (typeof MODULES)[number];\n\nexport const DEFAULT_MODULES: ModuleId[] = [\"spot\", \"swap\", \"option\", \"account\", ...BOT_DEFAULT_SUB_MODULES];\n// Default: spot, swap, option, account, bot.grid\n// \"all\": every module including market, futures, bot.dca, earn.savings, earn.onchain, earn.dcd\n// \"bot\": bot.grid only; \"bot.all\": bot.grid + bot.dca\n// \"earn\" / \"earn.all\": all earn sub-modules (earn.savings + earn.onchain + earn.dcd)\n// \"earn.savings\": Simple Earn only; \"earn.onchain\": On-chain Earn only; \"earn.dcd\": Dual Currency Deposit only\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerAccountTools(): ToolSpec[] {\n return [\n {\n name: \"account_get_balance\",\n module: \"account\",\n description:\n \"Get account balance for trading account. Returns balances for all currencies or a specific one.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. BTC or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/balance\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_balance\", 10),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_transfer\",\n module: \"account\",\n description:\n \"Transfer funds between accounts (trading, funding, etc.). [CAUTION] Moves real funds.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Transfer amount\",\n },\n from: {\n type: \"string\",\n description: \"Source account: 6=funding, 18=trading (unified)\",\n },\n to: {\n type: \"string\",\n description: \"Destination account: 6=funding, 18=trading (unified)\",\n },\n type: {\n type: \"string\",\n description: \"0=main account (default), 1=main→sub, 2=sub→main, 3=sub→sub\",\n },\n subAcct: {\n type: \"string\",\n description: \"Sub-account name. Required when type=1/2/3\",\n },\n clientId: {\n type: \"string\",\n description: \"Client ID (max 32 chars)\",\n },\n },\n required: [\"ccy\", \"amt\", \"from\", \"to\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/asset/transfer\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n from: requireString(args, \"from\"),\n to: requireString(args, \"to\"),\n type: readString(args, \"type\"),\n subAcct: readString(args, \"subAcct\"),\n clientId: readString(args, \"clientId\"),\n }),\n privateRateLimit(\"account_transfer\", 2),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_max_size\",\n module: \"account\",\n description:\n \"Get max buy/sell order size for a SWAP/FUTURES instrument given current balance and leverage. Useful before placing orders.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n px: {\n type: \"string\",\n description: \"Limit order price (omit for market)\",\n },\n leverage: {\n type: \"string\",\n description: \"Leverage (defaults to account setting)\",\n },\n ccy: {\n type: \"string\",\n description: \"Margin currency. Required for isolated mode.\",\n },\n },\n required: [\"instId\", \"tdMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/max-size\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n px: readString(args, \"px\"),\n leverage: readString(args, \"leverage\"),\n ccy: readString(args, \"ccy\"),\n }),\n privateRateLimit(\"account_get_max_size\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_asset_balance\",\n module: \"account\",\n description:\n \"Get funding account balance (asset account). Different from account_get_balance which queries the trading account.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. BTC or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/asset/balances\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_asset_balance\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_bills\",\n module: \"account\",\n description:\n \"Get account ledger: fees paid, funding charges, realized PnL, transfers, etc. Default 20 records (last 7 days), max 100.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"isolated\", \"cross\"],\n },\n type: {\n type: \"string\",\n description: \"1=transfer,2=trade,3=delivery,4=auto convert,5=liquidation,6=margin transfer,7=interest,8=funding fee,9=adl,10=clawback,11=sys convert,12=strategy transfer,13=ddh\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/bills\",\n compactObject({\n instType: readString(args, \"instType\"),\n ccy: readString(args, \"ccy\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_bills\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_positions_history\",\n module: \"account\",\n description:\n \"Get closed position history for SWAP or FUTURES. Default 20 records, max 100.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\", \"MARGIN\", \"OPTION\"],\n description: \"Default SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n type: {\n type: \"string\",\n description: \"1=close long,2=close short,3=liq long,4=liq short,5=ADL long,6=ADL short\",\n },\n posId: {\n type: \"string\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions-history\",\n compactObject({\n instType: readString(args, \"instType\") ?? \"SWAP\",\n instId: readString(args, \"instId\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n posId: readString(args, \"posId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_positions_history\", 1),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_trade_fee\",\n module: \"account\",\n description:\n \"Get maker/taker fee rates for the account. Useful to understand your fee tier before trading.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/trade-fee\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n }),\n privateRateLimit(\"account_get_trade_fee\", 5),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_config\",\n module: \"account\",\n description:\n \"Get account configuration: position mode (net vs hedge), account level, auto-loan settings, etc.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/api/v5/account/config\",\n {},\n privateRateLimit(\"account_get_config\", 5),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_max_withdrawal\",\n module: \"account\",\n description:\n \"Get maximum withdrawable amount for a currency from the trading account. Useful before initiating a transfer or withdrawal.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/max-withdrawal\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_max_withdrawal\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_max_avail_size\",\n module: \"account\",\n description:\n \"Get maximum available size for opening or reducing a position. Different from account_get_max_size which calculates new order size.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP or BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\", \"cash\"],\n description: \"cash=spot\",\n },\n ccy: {\n type: \"string\",\n description: \"Margin currency. Required for isolated MARGIN mode.\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"true=calculate max size for closing position\",\n },\n },\n required: [\"instId\", \"tdMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = readBoolean(args, \"reduceOnly\");\n const response = await context.client.privateGet(\n \"/api/v5/account/max-avail-size\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n ccy: readString(args, \"ccy\"),\n reduceOnly: reduceOnly !== undefined ? String(reduceOnly) : undefined,\n }),\n privateRateLimit(\"account_get_max_avail_size\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_positions\",\n module: \"account\",\n description:\n \"Get current open positions across all instrument types (MARGIN, SWAP, FUTURES, OPTION). Use swap_get_positions for SWAP/FUTURES-only queries.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n posId: {\n type: \"string\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType: readString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(\"account_get_positions\", 10),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_get_bills_archive\",\n module: \"account\",\n description:\n \"Get archived account ledger (bills older than 7 days, up to 3 months). Use account_get_bills for recent 7-day records. Default 20 records, max 100.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"isolated\", \"cross\"],\n },\n type: {\n type: \"string\",\n description: \"1=transfer,2=trade,3=delivery,4=auto convert,5=liquidation,6=margin transfer,7=interest,8=funding fee,9=adl,10=clawback,11=sys convert,12=strategy transfer,13=ddh\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/bills-archive\",\n compactObject({\n instType: readString(args, \"instType\"),\n ccy: readString(args, \"ccy\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_bills_archive\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"account_set_position_mode\",\n module: \"account\",\n description:\n \"Switch between net position mode and long/short hedge mode. \" +\n \"net: one position per instrument (default). long_short_mode: separate long and short positions. \" +\n \"[CAUTION] Requires no open positions or pending orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n posMode: {\n type: \"string\",\n enum: [\"long_short_mode\", \"net_mode\"],\n description: \"long_short_mode=hedge; net_mode=one-way\",\n },\n },\n required: [\"posMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-position-mode\",\n { posMode: requireString(args, \"posMode\") },\n privateRateLimit(\"account_set_position_mode\", 5),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerAlgoTradeTools(): ToolSpec[] {\n return [\n {\n name: \"swap_place_algo_order\",\n module: \"swap\",\n description:\n \"Place a SWAP/FUTURES algo order: TP/SL (conditional/oco) or trailing stop (move_order_stop). [CAUTION] Executes real trades. \" +\n \"conditional: single TP, single SL, or both on one order. \" +\n \"oco: TP+SL simultaneously — first trigger cancels the other. \" +\n \"move_order_stop: provide callbackRatio (e.g. '0.01'=1%) OR callbackSpread, and optionally activePx. \" +\n \"Set tpOrdPx='-1' or slOrdPx='-1' for market execution.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"conditional=single TP/SL or both; oco=TP+SL pair (first trigger cancels other); move_order_stop=trailing stop\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts to close (NOT USDT amount). Use market_get_instruments to get ctVal for conversion.\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price (conditional/oco only)\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market (conditional/oco only)\",\n },\n tpTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark (conditional/oco only)\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price (conditional/oco only)\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market (recommended) (conditional/oco only)\",\n },\n slTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark (conditional/oco only)\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread (move_order_stop only)\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units; provide either ratio or spread (move_order_stop only)\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price; tracking starts after market reaches this level (move_order_stop only)\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in contracts, quote_ccy: sz in USDT\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n tpTriggerPxType: readString(args, \"tpTriggerPxType\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n slTriggerPxType: readString(args, \"slTriggerPxType\"),\n callBackRatio: readString(args, \"callbackRatio\"),\n callBackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"swap_place_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"swap_place_move_stop_order\",\n module: \"swap\",\n description:\n \"[DEPRECATED] Use swap_place_algo_order with ordType='move_order_stop' instead. \" +\n \"Place a SWAP/FUTURES trailing stop order. [CAUTION] Executes real trades. \" +\n \"Specify callbackRatio (e.g. '0.01'=1%) or callbackSpread (fixed price distance), not both. \" +\n \"Optionally set activePx so tracking starts once market reaches that price.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount). Use market_get_instruments to get ctVal for conversion.\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units; provide either ratio or spread\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price; tracking starts after market reaches this level\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: \"move_order_stop\",\n sz: requireString(args, \"sz\"),\n callBackRatio: readString(args, \"callbackRatio\"),\n callBackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"swap_place_move_stop_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"swap_cancel_algo_orders\",\n module: \"swap\",\n description:\n \"Cancel one or more pending SWAP/FUTURES algo orders (TP/SL). Accepts a list of {algoId, instId} objects.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"List of algo orders to cancel. Each item: {algoId, instId}.\",\n items: {\n type: \"object\",\n properties: {\n algoId: {\n type: \"string\",\n description: \"Algo order ID\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"algoId\", \"instId\"],\n },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n orders,\n privateRateLimit(\"swap_cancel_algo_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"swap_get_algo_orders\",\n module: \"swap\",\n description:\n \"Query pending or completed SWAP/FUTURES algo orders (TP/SL, OCO, trailing stop).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\"],\n description: \"SWAP (default) or FUTURES\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"Filter by type; omit for all\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n algoId: {\n type: \"string\",\n description: \"Filter by algo order ID\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description:\n \"Required when status=history. effective=triggered, canceled, order_failed. Defaults to effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n const baseParams = compactObject({\n instType,\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"swap_get_algo_orders\", 20),\n );\n return normalizeResponse(response);\n }\n\n // No filter: fetch all three types in parallel and merge\n const [r1, r2, r3] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"move_order_stop\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ...((r3.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n ];\n}\n\nexport function registerFuturesAlgoTools(): ToolSpec[] {\n return [\n {\n name: \"futures_place_algo_order\",\n module: \"futures\",\n description:\n \"Place a FUTURES delivery algo order: TP/SL (conditional/oco) or trailing stop (move_order_stop). [CAUTION] Executes real trades. \" +\n \"conditional: single TP, single SL, or both on one order. \" +\n \"oco: TP+SL simultaneously — first trigger cancels the other. \" +\n \"move_order_stop: provide callbackRatio (e.g. '0.01'=1%) OR callbackSpread, and optionally activePx. \" +\n \"Set tpOrdPx='-1' or slOrdPx='-1' for market execution.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"conditional=single TP/SL or both; oco=TP+SL pair; move_order_stop=trailing stop\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount).\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price (conditional/oco only)\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market (conditional/oco only)\",\n },\n tpTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark (conditional/oco only)\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price (conditional/oco only)\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market (conditional/oco only)\",\n },\n slTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark (conditional/oco only)\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread (move_order_stop only)\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units (move_order_stop only)\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price; tracking starts after market reaches this level (move_order_stop only)\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in contracts, quote_ccy: sz in USDT\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n tpTriggerPxType: readString(args, \"tpTriggerPxType\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n slTriggerPxType: readString(args, \"slTriggerPxType\"),\n callBackRatio: readString(args, \"callbackRatio\"),\n callBackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"futures_place_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"futures_place_move_stop_order\",\n module: \"futures\",\n description:\n \"[DEPRECATED] Use futures_place_algo_order with ordType='move_order_stop' instead. \" +\n \"Place a FUTURES delivery trailing stop order. [CAUTION] Executes real trades.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount).\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units; provide either ratio or spread\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: \"move_order_stop\",\n sz: requireString(args, \"sz\"),\n callBackRatio: readString(args, \"callbackRatio\"),\n callBackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"futures_place_move_stop_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"futures_amend_algo_order\",\n module: \"futures\",\n description:\n \"Amend a pending FUTURES delivery algo order (modify TP/SL prices or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT-240329\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\", description: \"New number of contracts\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"futures_amend_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"futures_cancel_algo_orders\",\n module: \"futures\",\n description:\n \"Cancel one or more pending FUTURES delivery algo orders (TP/SL). Accepts a list of {algoId, instId} objects.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"List of algo orders to cancel. Each item: {algoId, instId}.\",\n items: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID\" },\n instId: { type: \"string\", description: \"e.g. BTC-USDT-240329\" },\n },\n required: [\"algoId\", \"instId\"],\n },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n orders,\n privateRateLimit(\"futures_cancel_algo_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"futures_get_algo_orders\",\n module: \"futures\",\n description:\n \"Query pending or completed FUTURES delivery algo orders (TP/SL, OCO, trailing stop).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"Filter by type; omit for all\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n algoId: {\n type: \"string\",\n description: \"Filter by algo order ID\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description:\n \"Required when status=history. effective=triggered, canceled, order_failed. Defaults to effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"FUTURES\",\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"futures_get_algo_orders\", 20),\n );\n return normalizeResponse(response);\n }\n\n // No filter: fetch all three types in parallel and merge\n const [r1, r2, r3] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"futures_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"futures_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"move_order_stop\" }, privateRateLimit(\"futures_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ...((r3.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n ];\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { ToolSpec } from \"./types.js\";\nimport { asRecord, readNumber, readString } from \"./helpers.js\";\nimport type { LogEntry } from \"../utils/logger.js\";\n\nconst DEFAULT_LOG_DIR = path.join(os.homedir(), \".okx\", \"logs\");\n\nfunction getLogPaths(logDir: string, days = 7): string[] {\n const paths: string[] = [];\n const now = new Date();\n for (let i = 0; i < days; i++) {\n const d = new Date(now);\n d.setUTCDate(now.getUTCDate() - i);\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n paths.push(path.join(logDir, `trade-${yyyy}-${mm}-${dd}.log`));\n }\n return paths;\n}\n\nfunction readEntries(logDir: string): LogEntry[] {\n const entries: LogEntry[] = [];\n for (const filePath of getLogPaths(logDir)) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n entries.push(JSON.parse(trimmed) as LogEntry);\n } catch {\n // skip malformed lines\n }\n }\n }\n return entries;\n}\n\nexport function registerAuditTools(): ToolSpec[] {\n return [\n {\n name: \"trade_get_history\",\n module: \"account\",\n description:\n \"Query local audit log of tool calls made through this MCP server. \" +\n \"Returns recent operations with timestamps, duration, params, and results. \" +\n \"Use to review what trades or queries were executed in this session or past sessions.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n tool: {\n type: \"string\",\n description: \"e.g. swap_place_order\",\n },\n level: {\n type: \"string\",\n enum: [\"INFO\", \"WARN\", \"ERROR\", \"DEBUG\"],\n },\n since: {\n type: \"string\",\n description: \"ISO 8601 timestamp lower bound\",\n },\n },\n },\n handler: async (rawArgs) => {\n const args = asRecord(rawArgs);\n const limit = Math.min(readNumber(args, \"limit\") ?? 20, 100);\n const toolFilter = readString(args, \"tool\");\n const levelFilter = readString(args, \"level\")?.toUpperCase();\n const since = readString(args, \"since\");\n const sinceTime = since ? new Date(since).getTime() : undefined;\n\n let entries = readEntries(DEFAULT_LOG_DIR);\n\n if (toolFilter) {\n entries = entries.filter((e) => e.tool === toolFilter);\n }\n if (levelFilter) {\n entries = entries.filter((e) => e.level === levelFilter);\n }\n if (sinceTime !== undefined) {\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= sinceTime);\n }\n\n // most recent first\n entries.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n entries = entries.slice(0, limit);\n\n return { entries, total: entries.length };\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\nimport { OkxApiError } from \"../../utils/errors.js\";\n\n/** For write operations: surface any inner sCode/sMsg errors from data items. */\nfunction normalizeWrite(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n const data = response.data;\n if (Array.isArray(data) && data.length > 0) {\n const failed = data.filter(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n \"sCode\" in (item as object) &&\n (item as Record<string, unknown>)[\"sCode\"] !== \"0\",\n ) as Record<string, unknown>[];\n if (failed.length > 0) {\n const messages = failed.map(\n (item) => `[${item[\"sCode\"]}] ${item[\"sMsg\"] ?? \"Operation failed\"}`,\n );\n throw new OkxApiError(messages.join(\"; \"), {\n code: String(failed[0]![\"sCode\"] ?? \"\"),\n endpoint: response.endpoint,\n });\n }\n }\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data,\n };\n}\n\nexport function registerGridTools(): ToolSpec[] {\n return [\n {\n name: \"grid_get_orders\",\n module: \"bot.grid\",\n description:\n \"List grid bots. status='active' for running; 'history' for stopped.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n status: {\n type: \"string\",\n enum: [\"active\", \"history\"],\n description: \"active=running (default); history=stopped\",\n },\n instId: { type: \"string\", description: \"e.g. BTC-USDT, BTC-USD-SWAP\" },\n algoId: { type: \"string\", description: \"Grid bot algo order ID (not a trade ordId)\" },\n after: { type: \"string\", description: \"Cursor for older records\" },\n before: { type: \"string\", description: \"Cursor for newer records\" },\n limit: { type: \"number\", description: \"Default 100\" },\n },\n required: [\"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoOrdType = requireString(args, \"algoOrdType\");\n const status = readString(args, \"status\") ?? \"active\";\n const path =\n status === \"history\"\n ? \"/api/v5/tradingBot/grid/orders-algo-history\"\n : \"/api/v5/tradingBot/grid/orders-algo-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n algoOrdType,\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"grid_get_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"grid_get_order_details\",\n module: \"bot.grid\",\n description: \"Get grid bot detail by algo ID. Returns config, status, PnL, and position.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n algoId: { type: \"string\", description: \"Grid bot algo order ID (not a trade ordId)\" },\n },\n required: [\"algoOrdType\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/tradingBot/grid/orders-algo-details\",\n {\n algoOrdType: requireString(args, \"algoOrdType\"),\n algoId: requireString(args, \"algoId\"),\n },\n privateRateLimit(\"grid_get_order_details\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"grid_get_sub_orders\",\n module: \"bot.grid\",\n description:\n \"Query sub-orders (grid trades) of a bot. type='filled' for executed; 'live' for pending.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n algoId: { type: \"string\", description: \"Grid bot algo order ID (not a trade ordId)\" },\n type: {\n type: \"string\",\n enum: [\"filled\", \"live\"],\n description: \"filled=executed trades (default); live=pending\",\n },\n groupId: { type: \"string\", description: \"A buy-sell pair shares the same groupId\" },\n after: { type: \"string\", description: \"Cursor for older records\" },\n before: { type: \"string\", description: \"Cursor for newer records\" },\n limit: { type: \"number\", description: \"Default 100\" },\n },\n required: [\"algoOrdType\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/tradingBot/grid/sub-orders\",\n compactObject({\n algoOrdType: requireString(args, \"algoOrdType\"),\n algoId: requireString(args, \"algoId\"),\n type: readString(args, \"type\") ?? \"filled\",\n groupId: readString(args, \"groupId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"grid_get_sub_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"grid_create_order\",\n module: \"bot.grid\",\n description:\n \"Create grid bot (spot, USDT-margined, or coin-margined contract). [CAUTION] Locks funds. \" +\n \"Spot: quoteSz|baseSz. Contract: direction+lever+sz.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT, BTC-USDT-SWAP, BTC-USD-SWAP (coin-margined)\" },\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n maxPx: { type: \"string\", description: \"Upper price\" },\n minPx: { type: \"string\", description: \"Lower price\" },\n gridNum: { type: \"string\", description: \"Number of grids\" },\n runType: {\n type: \"string\",\n enum: [\"1\", \"2\"],\n description: \"1=arithmetic (default); 2=geometric\",\n },\n quoteSz: { type: \"string\", description: \"Spot: quote amount (e.g. USDT)\" },\n baseSz: { type: \"string\", description: \"Spot: base amount (e.g. BTC)\" },\n direction: {\n type: \"string\",\n enum: [\"long\", \"short\", \"neutral\"],\n description: \"Contract only\",\n },\n lever: { type: \"string\", description: \"Leverage. Contract only\" },\n sz: { type: \"string\", description: \"Margin in USDT or base coin (CoinM). Contract only\" },\n basePos: { type: \"boolean\", description: \"Open base position for contract. Default: true\" },\n tpTriggerPx: { type: \"string\", description: \"TP trigger price\" },\n slTriggerPx: { type: \"string\", description: \"SL trigger price\" },\n tpRatio: { type: \"string\", description: \"TP ratio e.g. 0.1=10%. Contract only\" },\n slRatio: { type: \"string\", description: \"SL ratio e.g. 0.1=10%. Contract only\" },\n algoClOrdId: { type: \"string\", description: \"User-defined ID. Alphanumeric, max 32, unique per user\" },\n },\n required: [\"instId\", \"algoOrdType\", \"maxPx\", \"minPx\", \"gridNum\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoOrdType = requireString(args, \"algoOrdType\");\n const body: Record<string, unknown> = compactObject({\n instId: requireString(args, \"instId\"),\n algoOrdType,\n maxPx: requireString(args, \"maxPx\"),\n minPx: requireString(args, \"minPx\"),\n gridNum: requireString(args, \"gridNum\"),\n runType: readString(args, \"runType\"),\n quoteSz: readString(args, \"quoteSz\"),\n baseSz: readString(args, \"baseSz\"),\n direction: readString(args, \"direction\"),\n lever: readString(args, \"lever\"),\n sz: readString(args, \"sz\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n tpRatio: readString(args, \"tpRatio\"),\n slRatio: readString(args, \"slRatio\"),\n algoClOrdId: readString(args, \"algoClOrdId\"),\n tag: context.config.sourceTag,\n });\n if (algoOrdType === \"contract_grid\") {\n requireString(args, \"direction\");\n body.triggerParams = [{ triggerAction: \"start\", triggerStrategy: \"instant\" }];\n body.basePos = readBoolean(args, \"basePos\") ?? true;\n }\n const response = await context.client.privatePost(\n \"/api/v5/tradingBot/grid/order-algo\",\n body,\n privateRateLimit(\"grid_create_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"grid_stop_order\",\n module: \"bot.grid\",\n description:\n \"Stop a grid bot. [CAUTION] Closes or cancels orders. \" +\n \"For contract: stopType controls close ('1') vs cancel-only ('2').\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Grid bot algo order ID (not a trade ordId)\" },\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n instId: { type: \"string\", description: \"e.g. BTC-USDT, BTC-USD-SWAP\" },\n stopType: {\n type: \"string\",\n enum: [\"1\", \"2\", \"3\", \"5\", \"6\"],\n description: \"1=close all (default); 2=keep assets; 3=limit close; 5=partial; 6=no sell\",\n },\n },\n required: [\"algoId\", \"algoOrdType\", \"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/tradingBot/grid/stop-order-algo\",\n [compactObject({\n algoId: requireString(args, \"algoId\"),\n algoOrdType: requireString(args, \"algoOrdType\"),\n instId: requireString(args, \"instId\"),\n stopType: readString(args, \"stopType\") ?? \"1\",\n })],\n privateRateLimit(\"grid_stop_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\nimport { OkxApiError } from \"../../utils/errors.js\";\n\nconst BASE = \"/api/v5/tradingBot/dca\";\n\n/** For write operations: surface any inner sCode/sMsg errors from data items. */\nfunction normalizeWrite(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n const data = response.data;\n if (Array.isArray(data) && data.length > 0) {\n const failed = data.filter(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n \"sCode\" in (item as object) &&\n (item as Record<string, unknown>)[\"sCode\"] !== \"0\",\n ) as Record<string, unknown>[];\n if (failed.length > 0) {\n const messages = failed.map(\n (item) => `[${item[\"sCode\"]}] ${item[\"sMsg\"] ?? \"Operation failed\"}`,\n );\n throw new OkxApiError(messages.join(\"; \"), {\n code: String(failed[0]![\"sCode\"] ?? \"\"),\n endpoint: response.endpoint,\n });\n }\n }\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data,\n };\n}\n\nexport function registerDcaTools(): ToolSpec[] {\n return [\n {\n name: \"dca_create_order\",\n module: \"bot.dca\",\n description:\n \"Create a DCA (Martingale) bot. [CAUTION] Real trades. \" +\n \"contract_dca requires lever; spot_dca must be long. \" +\n \"If maxSafetyOrds>0: need safetyOrdAmt, pxSteps.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"BTC-USDT (spot) or BTC-USDT-SWAP (contract)\" },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"] },\n lever: { type: \"string\", description: \"Required for contract_dca\" },\n direction: { type: \"string\", enum: [\"long\", \"short\"] },\n initOrdAmt: { type: \"string\", description: \"Initial amount in quote ccy\" },\n maxSafetyOrds: { type: \"string\", description: \"0=no DCA, max 100\" },\n tpPct: { type: \"string\", description: \"Take-profit ratio, 0.03=3%\" },\n safetyOrdAmt: { type: \"string\", description: \"Safety order amount. Need if maxSafetyOrds>0\" },\n pxSteps: { type: \"string\", description: \"Price drop per safety order. Need if maxSafetyOrds>0\" },\n pxStepsMult: { type: \"string\", description: \"Step multiplier. Required when maxSafetyOrds>0, e.g. '1'\" },\n volMult: { type: \"string\", description: \"Size multiplier. Required when maxSafetyOrds>0, e.g. '1'\" },\n slPct: { type: \"string\", description: \"Stop-loss ratio, 0.05=5%\" },\n slMode: { type: \"string\", enum: [\"limit\", \"market\"] },\n allowReinvest: { type: \"boolean\", description: \"Default true\" },\n triggerStrategy: { type: \"string\", enum: [\"instant\", \"price\", \"rsi\"], description: \"contract_dca: instant|price|rsi; spot_dca: instant|rsi. Default: instant\" },\n triggerPx: { type: \"string\", description: \"Need if triggerStrategy=price (contract_dca only)\" },\n triggerCond: { type: \"string\", enum: [\"cross_up\", \"cross_down\"], description: \"Required when triggerStrategy=rsi. Optional when triggerStrategy=price\" },\n thold: { type: \"string\", description: \"RSI threshold (e.g. '30'). Need if triggerStrategy=rsi\" },\n timeframe: { type: \"string\", description: \"RSI timeframe (e.g. '15m'). Need if triggerStrategy=rsi\" },\n timePeriod: { type: \"string\", description: \"RSI period. Default '14'. Optional when triggerStrategy=rsi\" },\n algoClOrdId: { type: \"string\", description: \"Client order ID, 1-32 chars\" },\n // Backend expects boolean, but kept as string for backward compatibility with older clients.\n reserveFunds: { type: \"string\", description: \"'true' or 'false', default 'true'\" },\n tradeQuoteCcy: { type: \"string\" },\n },\n required: [\"instId\", \"algoOrdType\", \"direction\", \"initOrdAmt\", \"maxSafetyOrds\", \"tpPct\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instId = requireString(args, \"instId\");\n const algoOrdType = requireString(args, \"algoOrdType\");\n\n // Validate lever: required for contract_dca\n if (algoOrdType === \"contract_dca\" && !readString(args, \"lever\")) {\n throw new OkxApiError(\"lever is required for contract_dca\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n\n // Build triggerParams: default to instant; support price/rsi strategy\n const triggerStrategy = readString(args, \"triggerStrategy\") ?? \"instant\";\n\n // Validate: price trigger is only supported for contract_dca\n if (triggerStrategy === \"price\" && algoOrdType === \"spot_dca\") {\n throw new OkxApiError(\"triggerStrategy 'price' is only supported for contract_dca. spot_dca supports: instant, rsi\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n\n const triggerParam: Record<string, string> = {\n triggerAction: \"start\",\n triggerStrategy,\n };\n if (triggerStrategy === \"price\") {\n triggerParam[\"triggerPx\"] = requireString(args, \"triggerPx\");\n const triggerCond = readString(args, \"triggerCond\");\n if (triggerCond) {\n triggerParam[\"triggerCond\"] = triggerCond;\n }\n } else if (triggerStrategy === \"rsi\") {\n triggerParam[\"triggerCond\"] = requireString(args, \"triggerCond\");\n triggerParam[\"thold\"] = requireString(args, \"thold\");\n triggerParam[\"timeframe\"] = requireString(args, \"timeframe\");\n const timePeriod = readString(args, \"timePeriod\");\n triggerParam[\"timePeriod\"] = timePeriod ?? \"14\";\n }\n\n // Validate conditional required params when maxSafetyOrds > 0\n const maxSafetyOrds = requireString(args, \"maxSafetyOrds\");\n if (Number(maxSafetyOrds) > 0) {\n if (!readString(args, \"safetyOrdAmt\")) {\n throw new OkxApiError(\"safetyOrdAmt is required when maxSafetyOrds > 0\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n if (!readString(args, \"pxSteps\")) {\n throw new OkxApiError(\"pxSteps is required when maxSafetyOrds > 0\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n if (!readString(args, \"pxStepsMult\")) {\n throw new OkxApiError(\"pxStepsMult is required when maxSafetyOrds > 0\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n if (!readString(args, \"volMult\")) {\n throw new OkxApiError(\"volMult is required when maxSafetyOrds > 0\", {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n }\n\n const response = await context.client.privatePost(\n `${BASE}/create`,\n compactObject({\n instId,\n algoOrdType,\n lever: readString(args, \"lever\"),\n direction: requireString(args, \"direction\"),\n initOrdAmt: requireString(args, \"initOrdAmt\"),\n safetyOrdAmt: readString(args, \"safetyOrdAmt\"),\n maxSafetyOrds,\n pxSteps: readString(args, \"pxSteps\"),\n pxStepsMult: readString(args, \"pxStepsMult\"),\n volMult: readString(args, \"volMult\"),\n tpPct: requireString(args, \"tpPct\"),\n slPct: readString(args, \"slPct\"),\n slMode: readString(args, \"slMode\"),\n allowReinvest: args[\"allowReinvest\"] !== undefined\n ? (args[\"allowReinvest\"] === true || args[\"allowReinvest\"] === \"true\")\n : undefined,\n triggerParams: [triggerParam],\n tag: context.config.sourceTag,\n algoClOrdId: readString(args, \"algoClOrdId\"),\n reserveFunds: readString(args, \"reserveFunds\"),\n tradeQuoteCcy: readString(args, \"tradeQuoteCcy\"),\n }),\n privateRateLimit(\"dca_create_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"dca_stop_order\",\n module: \"bot.dca\",\n description:\n \"Stop a running DCA bot. [CAUTION] spot_dca needs stopType: 1=sell, 2=keep.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID\" },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"] },\n stopType: { type: \"string\", enum: [\"1\", \"2\"], description: \"Required for spot_dca: 1=sell all, 2=keep tokens\" },\n },\n required: [\"algoId\", \"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n const algoOrdType = requireString(args, \"algoOrdType\");\n const stopType = readString(args, \"stopType\");\n\n // Validate stopType: required for spot_dca\n if (algoOrdType === \"spot_dca\" && !stopType) {\n throw new OkxApiError(\n \"stopType is required for spot_dca. Use '1' (sell all tokens) or '2' (keep tokens)\",\n { code: \"VALIDATION\", endpoint: `${BASE}/stop` },\n );\n }\n\n const response = await context.client.privatePost(\n `${BASE}/stop`,\n compactObject({ algoId, algoOrdType, stopType }),\n privateRateLimit(\"dca_stop_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"dca_get_orders\",\n module: \"bot.dca\",\n description: \"List DCA bots. Default: active (running). Use status=history for stopped.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: { type: \"string\", enum: [\"active\", \"history\"] },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"], description: \"Default: contract_dca\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n instId: { type: \"string\" },\n after: { type: \"string\", description: \"Pagination cursor\" },\n before: { type: \"string\", description: \"Pagination cursor\" },\n limit: { type: \"number\" },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"active\";\n const path = status === \"history\" ? `${BASE}/history-list` : `${BASE}/ongoing-list`;\n // Default to contract_dca for backward compatibility\n const algoOrdType = readString(args, \"algoOrdType\") ?? \"contract_dca\";\n\n const response = await context.client.privateGet(\n path,\n compactObject({\n algoOrdType,\n algoId: readString(args, \"algoId\"),\n instId: readString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"dca_get_order_details\",\n module: \"bot.dca\",\n description: \"Get DCA bot position details (avgPx, upl, liqPx, etc).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID\" },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"] },\n },\n required: [\"algoId\", \"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n const algoOrdType = requireString(args, \"algoOrdType\");\n\n const response = await context.client.privateGet(\n `${BASE}/position-details`,\n { algoId, algoOrdType },\n privateRateLimit(\"dca_get_order_details\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"dca_get_sub_orders\",\n module: \"bot.dca\",\n description: \"Get DCA cycles or orders in a cycle. Omit cycleId=cycle list; with cycleId=orders.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID\" },\n algoOrdType: { type: \"string\", enum: [\"spot_dca\", \"contract_dca\"] },\n cycleId: { type: \"string\", description: \"Omit for cycles; provide for orders\" },\n after: { type: \"string\", description: \"Pagination cursor\" },\n before: { type: \"string\", description: \"Pagination cursor\" },\n limit: { type: \"number\" },\n },\n required: [\"algoId\", \"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n const algoOrdType = requireString(args, \"algoOrdType\");\n const cycleId = readString(args, \"cycleId\");\n\n if (cycleId) {\n // orders within a specific cycle\n const response = await context.client.privateGet(\n `${BASE}/orders`,\n compactObject({\n algoId,\n algoOrdType,\n cycleId,\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_sub_orders\", 20),\n );\n return normalizeResponse(response);\n }\n // cycle list\n const response = await context.client.privateGet(\n `${BASE}/cycle-list`,\n compactObject({\n algoId,\n algoOrdType,\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_sub_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport { registerGridTools } from \"./grid.js\";\nimport { registerDcaTools } from \"./dca.js\";\n\nexport function registerBotTools(): ToolSpec[] {\n return [\n ...registerGridTools(),\n ...registerDcaTools(),\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { assertNotDemo, privateRateLimit, publicRateLimit } from \"../common.js\";\n\nexport function registerEarnTools(): ToolSpec[] {\n return [\n {\n name: \"earn_get_savings_balance\",\n module: \"earn.savings\",\n description:\n \"Get Simple Earn (savings/flexible earn) balance. Returns current holdings, lent amount, pending interest, and the user's set rate. \" +\n \"Response fields: amt (total held), loanAmt (actively lent), pendingAmt (awaiting match), earnings (cumulative interest), \" +\n \"rate (user's own minimum lending rate setting — NOT market yield, NOT APY). \" +\n \"To get the actual market lending rate, call earn_get_lending_rate_history instead.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT or BTC. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/savings/balance\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"earn_get_savings_balance\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_savings_purchase\",\n module: \"earn.savings\",\n description:\n \"Purchase Simple Earn (savings/flexible earn). [CAUTION] Moves real funds into earn product.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency to purchase, e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Purchase amount\",\n },\n rate: {\n type: \"string\",\n description:\n \"Minimum lending rate threshold (annual, decimal). e.g. 0.01 = 1%. Only matched when market rate ≥ this value. Defaults to 0.01. Keep at 0.01 to maximize matching probability — do NOT raise this to increase yield, as actual yield (lendingRate) is determined by market supply/demand, not this setting.\",\n },\n },\n required: [\"ccy\", \"amt\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_savings_purchase\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/savings/purchase-redempt\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n side: \"purchase\",\n rate: readString(args, \"rate\") ?? \"0.01\",\n }),\n privateRateLimit(\"earn_savings_purchase\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_savings_redeem\",\n module: \"earn.savings\",\n description:\n \"Redeem Simple Earn (savings/flexible earn). [CAUTION] Withdraws funds from earn product.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency to redeem, e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Redemption amount\",\n },\n },\n required: [\"ccy\", \"amt\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_savings_redeem\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/savings/purchase-redempt\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n side: \"redempt\",\n }),\n privateRateLimit(\"earn_savings_redeem\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_set_lending_rate\",\n module: \"earn.savings\",\n description:\n \"Set lending rate for Simple Earn. [CAUTION] Changes your lending rate preference.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency, e.g. USDT\",\n },\n rate: {\n type: \"string\",\n description: \"Minimum lending rate threshold (annual, decimal). e.g. 0.01 = 1%. Only matched when market rate ≥ this value. Keep at 0.01 to maximize matching probability — do NOT raise this to increase yield, as actual yield (lendingRate) is determined by market supply/demand, not this setting.\",\n },\n },\n required: [\"ccy\", \"rate\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_set_lending_rate\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/savings/set-lending-rate\",\n {\n ccy: requireString(args, \"ccy\"),\n rate: requireString(args, \"rate\"),\n },\n privateRateLimit(\"earn_set_lending_rate\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_get_lending_history\",\n module: \"earn.savings\",\n description:\n \"Get personal lending records for Simple Earn (your own lending history). NOT for market rate queries. \" +\n \"Returns your lending records with amount, rate, and earnings data.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT. Omit for all.\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this record ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this record ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/savings/lending-history\",\n compactObject({\n ccy: readString(args, \"ccy\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"earn_get_lending_history\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_get_lending_rate_history\",\n module: \"earn.savings\",\n description:\n \"Query Simple Earn lending rates. Public endpoint (no API key required). \" +\n \"Use this tool when the user asks about current or historical lending rates for Simple Earn, \" +\n \"or when displaying savings balance with market rate context. \" +\n \"Response fields per record: \" +\n \"rate (market lending rate — the rate borrowers pay this period; user's minimum setting must be ≤ this to be eligible), \" +\n \"lendingRate (actual yield received by lenders; stablecoins e.g. USDT/USDC only: subject to pro-rata dilution — when eligible supply exceeds borrowing demand total interest is shared so lendingRate < rate; non-stablecoins: lendingRate = rate, no dilution; always use lendingRate as the true APY to show users), \" +\n \"ts (settlement timestamp ms). \" +\n \"To get current APY: use limit=1 and read lendingRate.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT. Omit for all.\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/finance/savings/lending-rate-history\",\n compactObject({\n ccy: readString(args, \"ccy\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"earn_get_lending_rate_history\", 6),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { assertNotDemo, privateRateLimit } from \"../common.js\";\n\nexport function registerOnchainEarnTools(): ToolSpec[] {\n return [\n // -------------------------------------------------------------------------\n // Get Offers\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_get_offers\",\n module: \"earn.onchain\",\n description:\n \"List staking/DeFi products with APY, terms, and limits. \" +\n \"Always show protocol name (protocol field) and earnings currency (earningData[].ccy) when presenting results.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Product ID filter.\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n ccy: {\n type: \"string\",\n description: \"e.g. ETH\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/staking-defi/offers\",\n compactObject({\n productId: readString(args, \"productId\"),\n protocolType: readString(args, \"protocolType\"),\n ccy: readString(args, \"ccy\"),\n }),\n privateRateLimit(\"onchain_earn_get_offers\", 3),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Purchase\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_purchase\",\n module: \"earn.onchain\",\n description: \"Invest in a staking/DeFi product. [CAUTION] Moves real funds. Not available in demo mode.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Product ID\",\n },\n investData: {\n type: \"array\",\n description: \"Array of {ccy, amt} to invest.\",\n items: {\n type: \"object\",\n properties: {\n ccy: { type: \"string\", description: \"e.g. ETH\" },\n amt: { type: \"string\" },\n },\n required: [\"ccy\", \"amt\"],\n },\n },\n term: {\n type: \"string\",\n description: \"Investment term in days, required for fixed-term products.\",\n },\n tag: {\n type: \"string\",\n description: \"Order tag.\",\n },\n },\n required: [\"productId\", \"investData\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"onchain_earn_purchase\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/staking-defi/purchase\",\n compactObject({\n productId: requireString(args, \"productId\"),\n investData: args.investData,\n term: readString(args, \"term\"),\n tag: readString(args, \"tag\"),\n }),\n privateRateLimit(\"onchain_earn_purchase\", 2),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Redeem\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_redeem\",\n module: \"earn.onchain\",\n description: \"Redeem a staking/DeFi investment. [CAUTION] Some products have lock periods, early redemption may incur penalties. Not available in demo mode.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: {\n type: \"string\",\n description: \"Order ID\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n allowEarlyRedeem: {\n type: \"boolean\",\n description: \"Allow early exit for fixed-term products, may incur penalties. Default: false.\",\n },\n },\n required: [\"ordId\", \"protocolType\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"onchain_earn_redeem\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/staking-defi/redeem\",\n compactObject({\n ordId: requireString(args, \"ordId\"),\n protocolType: requireString(args, \"protocolType\"),\n allowEarlyRedeem: readBoolean(args, \"allowEarlyRedeem\"),\n }),\n privateRateLimit(\"onchain_earn_redeem\", 2),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Cancel\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_cancel\",\n module: \"earn.onchain\",\n description: \"Cancel a pending staking/DeFi purchase order. [CAUTION] Not available in demo mode.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: {\n type: \"string\",\n description: \"Order ID\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n },\n required: [\"ordId\", \"protocolType\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"onchain_earn_cancel\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/staking-defi/cancel\",\n {\n ordId: requireString(args, \"ordId\"),\n protocolType: requireString(args, \"protocolType\"),\n },\n privateRateLimit(\"onchain_earn_cancel\", 2),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Get Active Orders\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_get_active_orders\",\n module: \"earn.onchain\",\n description: \"List current active staking/DeFi investments.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Product ID filter.\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n ccy: {\n type: \"string\",\n description: \"e.g. ETH\",\n },\n state: {\n type: \"string\",\n description: \"8=pending, 13=cancelling, 9=onchain, 1=earning, 2=redeeming\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/staking-defi/orders-active\",\n compactObject({\n productId: readString(args, \"productId\"),\n protocolType: readString(args, \"protocolType\"),\n ccy: readString(args, \"ccy\"),\n state: readString(args, \"state\"),\n }),\n privateRateLimit(\"onchain_earn_get_active_orders\", 3),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Get Order History\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_get_order_history\",\n module: \"earn.onchain\",\n description: \"List past staking/DeFi orders including redeemed ones.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Product ID filter.\",\n },\n protocolType: {\n type: \"string\",\n description: \"staking|defi\",\n },\n ccy: {\n type: \"string\",\n description: \"e.g. ETH\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: results older than this order ID.\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: results newer than this order ID.\",\n },\n limit: {\n type: \"string\",\n description: \"Max results (default 100, max 100).\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/staking-defi/orders-history\",\n compactObject({\n productId: readString(args, \"productId\"),\n protocolType: readString(args, \"protocolType\"),\n ccy: readString(args, \"ccy\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readString(args, \"limit\"),\n }),\n privateRateLimit(\"onchain_earn_get_order_history\", 3),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { assertNotDemo, privateRateLimit } from \"../common.js\";\nimport { OkxApiError, RateLimitError } from \"../../utils/errors.js\";\n\n// retry=true: withDcdErrors converts the error to RateLimitError, signaling the caller to back off and retry.\nconst DCD_CODE_BEHAVIORS: Record<string, { retry: boolean; suggestion: string }> = {\n \"50001\": { retry: true, suggestion: \"DCD service is down. Retry in a few minutes.\" },\n \"50002\": { retry: false, suggestion: \"Invalid JSON in request body. This is likely a bug — check request parameters.\" },\n \"50014\": { retry: false, suggestion: \"Missing required parameter. Check that all required fields are provided.\" },\n \"50016\": { retry: false, suggestion: \"notionalCcy does not match productId option type. Use baseCcy for CALL, quoteCcy for PUT.\" },\n \"50026\": { retry: true, suggestion: \"DCD system error. Retry in a few minutes.\" },\n \"50030\": { retry: false, suggestion: \"Account not authorized for DCD (earn-auth check failed). Complete required verification in the OKX app first.\" },\n \"50038\": { retry: false, suggestion: \"DCD Open API feature is disabled for this account. Contact OKX support to enable it.\" },\n \"50051\": { retry: false, suggestion: \"This currency pair is restricted for your country or account type. Do not retry.\" },\n \"51000\": { retry: false, suggestion: \"Invalid parameter value or format. Check ordId, quoteId, or clOrdId.\" },\n \"51728\": { retry: false, suggestion: \"Available quota exceeded. Reduce the amount and retry.\" },\n \"51736\": { retry: false, suggestion: \"Insufficient balance. Top up your account before retrying.\" },\n \"52905\": { retry: false, suggestion: \"Quote has expired or was not found. Request a new quote.\" },\n \"52909\": { retry: false, suggestion: \"Duplicate client order ID. Use a different clOrdId.\" },\n \"52917\": { retry: false, suggestion: \"Amount is below the minimum trade size. Increase the amount.\" },\n \"52918\": { retry: false, suggestion: \"Amount exceeds the maximum trade size. Reduce the amount.\" },\n \"52921\": { retry: false, suggestion: \"Quote has already been used by another trade.\" },\n \"52927\": { retry: true, suggestion: \"No quote returned by liquidity provider. Retry the quote request.\" },\n \"52928\": { retry: false, suggestion: \"Amount is not divisible by the required step size. Adjust the amount.\" },\n \"58004\": { retry: false, suggestion: \"Account is frozen or blocked. Contact OKX support. Do not retry.\" },\n \"58102\": { retry: true, suggestion: \"DCD rate limit exceeded. Back off and retry after a short delay.\" },\n};\n\nasync function withDcdErrors<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n if (error instanceof OkxApiError && error.code) {\n const behavior = DCD_CODE_BEHAVIORS[error.code];\n if (behavior) {\n if (behavior.retry) {\n throw new RateLimitError(error.message, behavior.suggestion, error.endpoint, error.traceId);\n }\n throw new OkxApiError(error.message, {\n code: error.code,\n suggestion: behavior.suggestion,\n endpoint: error.endpoint,\n traceId: error.traceId,\n });\n }\n }\n throw error;\n }\n}\n\nexport function registerDcdTools(): ToolSpec[] {\n return [\n {\n name: \"dcd_get_currency_pairs\",\n module: \"earn.dcd\",\n description: \"Get available DCD currency pairs.\",\n isWrite: false,\n inputSchema: { type: \"object\", properties: {} },\n handler: async (_rawArgs, context) => {\n return withDcdErrors(async () => {\n const response = await context.client.privateGet(\n \"/api/v5/finance/sfp/dcd/currency-pair\",\n undefined,\n privateRateLimit(\"dcd_get_currency_pairs\", 5),\n );\n return normalizeResponse(response);\n });\n },\n },\n {\n name: \"dcd_get_products\",\n module: \"earn.dcd\",\n description: \"Get DCD products with yield and quota info.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n baseCcy: { type: \"string\", description: \"Base currency, e.g. BTC\" },\n quoteCcy: { type: \"string\", description: \"Quote currency, e.g. USDT\" },\n optType: { type: \"string\", description: \"Option type: C (Call, sell high) or P (Put, buy low)\" },\n },\n required: [\"baseCcy\", \"quoteCcy\", \"optType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n return withDcdErrors(async () => {\n const response = await context.client.privateGet(\n \"/api/v5/finance/sfp/dcd/products\",\n {\n baseCcy: requireString(args, \"baseCcy\"),\n quoteCcy: requireString(args, \"quoteCcy\"),\n optType: requireString(args, \"optType\"),\n },\n privateRateLimit(\"dcd_get_products\", 5),\n );\n return normalizeResponse(response);\n });\n },\n },\n {\n name: \"dcd_get_order_state\",\n module: \"earn.dcd\",\n description: \"Check DCD order state after subscription (returns ordId + state only). For full order details (productId, strike, yield, settlement info), use dcd_get_orders instead.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: { type: \"string\", description: \"Order ID\" },\n },\n required: [\"ordId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n return withDcdErrors(async () => {\n const response = await context.client.privateGet(\n \"/api/v5/finance/sfp/dcd/order-status\",\n { ordId: requireString(args, \"ordId\") },\n privateRateLimit(\"dcd_get_order_state\", 5),\n );\n return normalizeResponse(response);\n });\n },\n },\n {\n name: \"dcd_get_orders\",\n module: \"earn.dcd\",\n description: \"Get DCD order history.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: { type: \"string\", description: \"Filter by order ID (overrides other filters)\" },\n productId: { type: \"string\", description: \"e.g. BTC-USDT-260327-77000-C\" },\n uly: { type: \"string\", description: \"Underlying index, e.g. BTC-USD\" },\n state: {\n type: \"string\",\n description:\n \"Filter by state: initial | live | pending_settle | settled | pending_redeem | redeemed | rejected\",\n },\n beginId: { type: \"string\", description: \"Cursor for newer records\" },\n endId: { type: \"string\", description: \"Cursor for older records\" },\n begin: { type: \"string\", description: \"Begin timestamp, Unix ms\" },\n end: { type: \"string\", description: \"End timestamp, Unix ms\" },\n limit: { type: \"number\", description: \"Default 100\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n return withDcdErrors(async () => {\n const response = await context.client.privateGet(\n \"/api/v5/finance/sfp/dcd/order-history\",\n compactObject({\n ordId: readString(args, \"ordId\"),\n productId: readString(args, \"productId\"),\n uly: readString(args, \"uly\"),\n state: readString(args, \"state\"),\n beginId: readString(args, \"beginId\"),\n endId: readString(args, \"endId\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dcd_get_orders\", 5),\n );\n return normalizeResponse(response);\n });\n },\n },\n {\n name: \"dcd_subscribe\",\n module: \"earn.dcd\",\n description:\n \"Subscribe to a DCD product: get quote and execute atomically. \" +\n \"Confirm product, amount, and currency with user before calling. \" +\n \"Optional minAnnualizedYield (percent) rejects the order if quote yield falls below threshold. \" +\n \"Returns order result with quote snapshot (annualizedYield, absYield).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: { type: \"string\", description: \"Product ID, e.g. BTC-USDT-260327-77000-C\" },\n notionalSz: { type: \"string\", description: \"Investment amount (the quantity to invest, e.g. '0.1' for 0.1 BTC). This is the 'sz' / 'size' field for DCD.\" },\n notionalCcy: { type: \"string\", description: \"Investment currency: baseCcy for CALL (C), quoteCcy for PUT (P)\" },\n clOrdId: { type: \"string\", description: \"Client order ID for idempotency (optional)\" },\n minAnnualizedYield: {\n type: \"number\",\n description:\n \"Minimum acceptable annualized yield in percent (e.g. 18 means 18%). \" +\n \"Order will NOT be placed if the quote yield is below this threshold.\",\n },\n },\n required: [\"productId\", \"notionalSz\", \"notionalCcy\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"dcd_subscribe\");\n const args = asRecord(rawArgs);\n const productId = requireString(args, \"productId\");\n const notionalSz = requireString(args, \"notionalSz\");\n const notionalCcy = requireString(args, \"notionalCcy\");\n const clOrdId = readString(args, \"clOrdId\");\n const minAnnualizedYield = readNumber(args, \"minAnnualizedYield\");\n\n return withDcdErrors(async () => {\n // Step 1: request quote\n const quoteResp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/quote\",\n { productId, notionalSz, notionalCcy },\n privateRateLimit(\"dcd_subscribe\", 5),\n );\n const quoteNorm = normalizeResponse(quoteResp);\n const quoteList = Array.isArray(quoteNorm[\"data\"])\n ? (quoteNorm[\"data\"] as Record<string, unknown>[])\n : [];\n const quote = quoteList[0];\n\n if (!quote || !quote[\"quoteId\"]) {\n throw new OkxApiError(\"No quote returned by liquidity provider.\", {\n code: \"52927\",\n suggestion: \"Retry the subscription request.\",\n });\n }\n\n // Step 2: check minAnnualizedYield before executing\n if (minAnnualizedYield !== undefined) {\n const actualYield = parseFloat(quote[\"annualizedYield\"] as string);\n if (!isNaN(actualYield) && actualYield < minAnnualizedYield) {\n throw new OkxApiError(\n `Quote yield ${actualYield}% is below the minimum threshold of ${minAnnualizedYield}%.`,\n {\n code: \"YIELD_BELOW_MIN\",\n suggestion: `Order not placed. Actual: ${actualYield}%, required: >= ${minAnnualizedYield}%. Try a different product or lower your minimum yield.`,\n },\n );\n }\n }\n\n // Step 3: execute quote immediately\n const tradeResp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/trade\",\n compactObject({\n quoteId: quote[\"quoteId\"] as string,\n clOrdId,\n }),\n privateRateLimit(\"dcd_subscribe\", 5),\n );\n const tradeNorm = normalizeResponse(tradeResp);\n\n // Return trade result with quote snapshot attached\n return {\n ...tradeNorm,\n quote: {\n quoteId: quote[\"quoteId\"],\n annualizedYield: quote[\"annualizedYield\"],\n absYield: quote[\"absYield\"],\n notionalSz: quote[\"notionalSz\"],\n notionalCcy: quote[\"notionalCcy\"],\n },\n };\n });\n },\n },\n {\n name: \"dcd_redeem\",\n module: \"earn.dcd\",\n description:\n \"Early redemption of a DCD order, two-step flow. \" +\n \"First call (no quoteId): returns redemption quote for user confirmation. \" +\n \"Second call (with quoteId): executes redemption. If the quote expired, auto-refreshes and executes; response includes autoRefreshedQuote: true.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: { type: \"string\", description: \"Order ID to redeem early\" },\n quoteId: {\n type: \"string\",\n description:\n \"Redeem quote ID returned by the first dcd_redeem call. \" +\n \"Omit on the first call to preview the exit cost; provide on the second call to execute.\",\n },\n },\n required: [\"ordId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const ordId = requireString(args, \"ordId\");\n const quoteId = readString(args, \"quoteId\");\n\n if (!quoteId) {\n // First call: preview mode — request quote only, no state change\n return withDcdErrors(async () => {\n const resp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/redeem-quote\",\n { ordId },\n privateRateLimit(\"dcd_redeem\", 5),\n );\n return normalizeResponse(resp);\n });\n }\n\n // Second call: execute mode\n assertNotDemo(context.config, \"dcd_redeem\");\n return withDcdErrors(async () => {\n try {\n const resp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/redeem\",\n { ordId, quoteId },\n privateRateLimit(\"dcd_redeem\", 5),\n );\n return normalizeResponse(resp);\n } catch (error) {\n // Quote expired: user already confirmed — re-request and execute atomically\n if (error instanceof OkxApiError && error.code === \"52905\") {\n const quoteResp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/redeem-quote\",\n { ordId },\n privateRateLimit(\"dcd_redeem\", 5),\n );\n const quoteNorm = normalizeResponse(quoteResp);\n const quoteList = Array.isArray(quoteNorm[\"data\"])\n ? (quoteNorm[\"data\"] as Record<string, unknown>[])\n : [];\n const newQuote = quoteList[0];\n if (!newQuote?.[\"quoteId\"]) {\n throw error; // cannot recover, surface original expiry error\n }\n const redeemResp = await context.client.privatePost(\n \"/api/v5/finance/sfp/dcd/redeem\",\n { ordId, quoteId: newQuote[\"quoteId\"] as string },\n privateRateLimit(\"dcd_redeem\", 5),\n );\n return {\n ...normalizeResponse(redeemResp),\n autoRefreshedQuote: true,\n refreshedQuote: {\n quoteId: newQuote[\"quoteId\"],\n redeemSz: newQuote[\"redeemSz\"],\n redeemCcy: newQuote[\"redeemCcy\"],\n termRate: newQuote[\"termRate\"],\n },\n };\n }\n throw error;\n }\n });\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\n\nexport function registerAutoEarnTools(): ToolSpec[] {\n return [\n {\n name: \"earn_auto_set\",\n module: \"earn.autoearn\",\n description:\n \"Enable or disable auto-earn for a currency. \" +\n \"earnType='0' for auto-lend+stake (most currencies); earnType='1' for USDG earn (USDG, BUIDL). \" +\n \"Use account_get_balance first: if autoLendStatus or autoStakingStatus != 'unsupported', use earnType='0'; for USDG/BUIDL use earnType='1'. \" +\n \"[CAUTION] Cannot disable within 24h of enabling.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency, e.g. SOL, USDG\",\n },\n action: {\n type: \"string\",\n description: \"turn_on or turn_off\",\n },\n earnType: {\n type: \"string\",\n description: \"0=auto-lend+stake (default), 1=USDG earn. Omit to use default.\",\n },\n },\n required: [\"ccy\", \"action\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-auto-earn\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n action: requireString(args, \"action\"),\n earnType: readString(args, \"earnType\") ?? \"0\",\n }),\n privateRateLimit(\"earn_auto_set\", 10),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport { registerEarnTools } from \"./savings.js\";\nimport { registerOnchainEarnTools } from \"./onchain.js\";\nimport { registerDcdTools } from \"./dcd.js\";\nimport { registerAutoEarnTools } from \"./autoearn.js\";\n\nexport { registerEarnTools, registerOnchainEarnTools, registerDcdTools, registerAutoEarnTools };\n\nexport function registerAllEarnTools(): ToolSpec[] {\n return [\n ...registerEarnTools(),\n ...registerOnchainEarnTools(),\n ...registerDcdTools(),\n ...registerAutoEarnTools(),\n ];\n}\n","/**\n * Shared factory for SWAP and FUTURES contract trade tools.\n * Both modules share 11 identical tool shapes; only names, descriptions,\n * default instType, and instId examples differ.\n */\nimport type { ToolSpec } from \"./types.js\";\nimport type { ModuleId } from \"../constants.js\";\nimport {\n asRecord,\n assertEnum,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport interface ContractConfig {\n /** Tool name prefix, e.g. \"swap\" → \"swap_place_order\" */\n prefix: string;\n /** MCP module name */\n module: ModuleId;\n /** Human-readable label used in descriptions, e.g. \"SWAP/FUTURES\" or \"FUTURES delivery\" */\n label: string;\n /** [defaultType, otherType], e.g. [\"SWAP\", \"FUTURES\"] or [\"FUTURES\", \"SWAP\"] */\n instTypes: readonly [string, string];\n /** instId example string shown in property descriptions */\n instIdExample: string;\n}\n\n/** Build the 11 common contract trade tools shared by swap and futures modules. */\nexport function buildContractTradeTools(cfg: ContractConfig): ToolSpec[] {\n const { prefix, module, label, instTypes, instIdExample } = cfg;\n const [defaultType, otherType] = instTypes;\n const instTypeDesc = `${defaultType} (default) or ${otherType}`;\n const n = (suffix: string) => `${prefix}_${suffix}`;\n\n return [\n // ── place_order ──────────────────────────────────────────────────────────\n {\n name: n(\"place_order\"),\n module,\n description: `Place ${label} order. Attach TP/SL via tpTriggerPx/slTriggerPx. [CAUTION] Executes real trades.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"buy=long, sell=short; hedge: use with posSide\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market=no px; limit/fok/ioc=px req; post_only=maker\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts count by default. Set tgtCcy=quote_ccy to use USDT amount instead.\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in contracts, quote_ccy: sz in USDT\",\n },\n px: { type: \"string\", description: \"Required for limit/post_only/fok/ioc\" },\n reduceOnly: {\n type: \"boolean\",\n description: \"Close/reduce only, no new position (one-way mode)\",\n },\n clOrdId: { type: \"string\", description: \"Client order ID (max 32 chars)\" },\n tpTriggerPx: { type: \"string\", description: \"TP trigger price\" },\n tpOrdPx: { type: \"string\", description: \"TP order price; -1=market\" },\n slTriggerPx: { type: \"string\", description: \"SL trigger price\" },\n slOrdPx: { type: \"string\", description: \"SL order price; -1=market\" },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const attachAlgoOrds = buildAttachAlgoOrds(args);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(n(\"place_order\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── cancel_order ─────────────────────────────────────────────────────────\n {\n name: n(\"cancel_order\"),\n module,\n description: `Cancel an unfilled ${label} order.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\", description: \"Client order ID\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(n(\"cancel_order\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_order ─────────────────────────────────────────────────────────────\n {\n name: n(\"get_order\"),\n module,\n description: `Get details of a single ${label} order by ordId or clOrdId.`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n ordId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n clOrdId: { type: \"string\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(n(\"get_order\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_orders ───────────────────────────────────────────────────────────\n {\n name: n(\"get_orders\"),\n module,\n description: `Query ${label} open orders, history (last 7 days), or archive (up to 3 months).`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n description: \"open=active, history=7d, archive=3mo\",\n },\n instType: {\n type: \"string\",\n enum: [...instTypes],\n description: instTypeDesc,\n },\n instId: { type: \"string\", description: instIdExample },\n ordType: { type: \"string\", description: \"Order type filter\" },\n state: { type: \"string\", description: \"canceled|filled\" },\n after: { type: \"string\", description: \"Cursor: return older\" },\n before: { type: \"string\", description: \"Cursor: return newer\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const instType = readString(args, \"instType\") ?? defaultType;\n assertEnum(instType, \"instType\", instTypes);\n let path = \"/api/v5/trade/orders-pending\";\n if (status === \"archive\") {\n path = \"/api/v5/trade/orders-history-archive\";\n } else if (status === \"history\") {\n path = \"/api/v5/trade/orders-history\";\n }\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(n(\"get_orders\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_positions ────────────────────────────────────────────────────────\n {\n name: n(\"get_positions\"),\n module,\n description: `Get current ${label} positions.`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...instTypes],\n description: instTypeDesc,\n },\n instId: { type: \"string\", description: instIdExample },\n posId: { type: \"string\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instType = readString(args, \"instType\") ?? defaultType;\n assertEnum(instType, \"instType\", instTypes);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(n(\"get_positions\"), 10),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_fills ────────────────────────────────────────────────────────────\n {\n name: n(\"get_fills\"),\n module,\n description: `Get ${label} fill details. archive=false (default): last 3 days; archive=true: up to 3 months.`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instType: {\n type: \"string\",\n enum: [...instTypes],\n description: instTypeDesc,\n },\n instId: { type: \"string\", description: \"Instrument ID filter\" },\n ordId: { type: \"string\", description: \"Order ID filter\" },\n after: { type: \"string\", description: \"Cursor: return older\" },\n before: { type: \"string\", description: \"Cursor: return newer\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results (default 100 or 20 for archive)\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const instType = readString(args, \"instType\") ?? defaultType;\n assertEnum(instType, \"instType\", instTypes);\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(n(\"get_fills\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── close_position ───────────────────────────────────────────────────────\n {\n name: n(\"close_position\"),\n module,\n description: `[CAUTION] Close entire ${label} position at market.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n mgnMode: { type: \"string\", enum: [\"cross\", \"isolated\"] },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"long/short=hedge mode; omit for one-way (net)\",\n },\n autoCxl: {\n type: \"boolean\",\n description: \"Cancel pending orders for this instrument on close\",\n },\n clOrdId: { type: \"string\", description: \"Client order ID for close order\" },\n },\n required: [\"instId\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const autoCxl = args.autoCxl;\n const response = await context.client.privatePost(\n \"/api/v5/trade/close-position\",\n compactObject({\n instId: requireString(args, \"instId\"),\n mgnMode: requireString(args, \"mgnMode\"),\n posSide: readString(args, \"posSide\"),\n autoCxl: typeof autoCxl === \"boolean\" ? String(autoCxl) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(n(\"close_position\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── set_leverage ─────────────────────────────────────────────────────────\n {\n name: n(\"set_leverage\"),\n module,\n description: `Set leverage for a ${label} instrument or position. [CAUTION] Changes risk parameters.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n lever: { type: \"string\", description: \"Leverage, e.g. '10'\" },\n mgnMode: { type: \"string\", enum: [\"cross\", \"isolated\"] },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"Required for isolated margin in hedge mode\",\n },\n },\n required: [\"instId\", \"lever\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-leverage\",\n compactObject({\n instId: requireString(args, \"instId\"),\n lever: requireString(args, \"lever\"),\n mgnMode: requireString(args, \"mgnMode\"),\n posSide: readString(args, \"posSide\"),\n }),\n privateRateLimit(n(\"set_leverage\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── get_leverage ─────────────────────────────────────────────────────────\n {\n name: n(\"get_leverage\"),\n module,\n description: `Get current leverage for a ${label} instrument.`,\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: instIdExample },\n mgnMode: { type: \"string\", enum: [\"cross\", \"isolated\"] },\n },\n required: [\"instId\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/leverage-info\",\n compactObject({\n instId: requireString(args, \"instId\"),\n mgnMode: requireString(args, \"mgnMode\"),\n }),\n privateRateLimit(n(\"get_leverage\"), 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── batch_amend ──────────────────────────────────────────────────────────\n {\n name: n(\"batch_amend\"),\n module,\n description: `[CAUTION] Batch amend up to 20 unfilled ${label} orders.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?, newSz?, newPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(n(\"batch_amend\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── batch_cancel ─────────────────────────────────────────────────────────\n {\n name: n(\"batch_cancel\"),\n module,\n description: `[CAUTION] Batch cancel up to 20 ${label} orders.`,\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(n(\"batch_cancel\"), 60),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { buildContractTradeTools } from \"./contract-trade.js\";\n\nexport function registerFuturesTools(): ToolSpec[] {\n const common = buildContractTradeTools({\n prefix: \"futures\",\n module: \"futures\",\n label: \"FUTURES delivery\",\n instTypes: [\"FUTURES\", \"SWAP\"],\n instIdExample: \"e.g. BTC-USDT-240329\",\n });\n\n return [\n ...common,\n\n // ── futures_amend_order ───────────────────────────────────────────────────\n // Unique to futures: amend a regular (non-algo) unfilled order.\n {\n name: \"futures_amend_order\",\n module: \"futures\",\n description:\n \"Amend an unfilled FUTURES delivery order (modify price and/or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT-240329\" },\n ordId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n clOrdId: { type: \"string\" },\n newSz: { type: \"string\", description: \"New number of contracts\" },\n newPx: { type: \"string\", description: \"New price\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n }),\n privateRateLimit(\"futures_amend_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── futures_batch_orders ──────────────────────────────────────────────────\n // Unique to futures: batch place only (no cancel/amend action dispatch).\n {\n name: \"futures_batch_orders\",\n module: \"futures\",\n description:\n \"[CAUTION] Batch place up to 20 FUTURES delivery orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description:\n \"Array (max 20): {instId,tdMode,side,ordType,sz,px?,posSide?,reduceOnly?,clOrdId?,tpTriggerPx?,tpOrdPx?,slTriggerPx?,slOrdPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const body = orders.map((order: unknown) => {\n const o = asRecord(order);\n const attachAlgoOrds = buildAttachAlgoOrds(o);\n const reduceOnly = o.reduceOnly;\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: requireString(o, \"tdMode\"),\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n posSide: readString(o, \"posSide\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n });\n const response = await context.client.privatePost(\n \"/api/v5/trade/batch-orders\",\n body,\n privateRateLimit(\"futures_batch_orders\", 60),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport { asRecord, compactObject, normalizeResponse, readBoolean, readNumber, readString, requireString } from \"./helpers.js\";\nimport { publicRateLimit, OKX_CANDLE_BARS, OKX_INST_TYPES } from \"./common.js\";\n\nexport function registerMarketTools(): ToolSpec[] {\n return [\n {\n name: \"market_get_ticker\",\n module: \"market\",\n description:\n \"Get ticker data for a single instrument.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT, BTC-USDT-SWAP\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/ticker\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_ticker\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_tickers\",\n module: \"market\",\n description:\n \"Get ticker data for all instruments of a given type.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...OKX_INST_TYPES],\n },\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD. Required for OPTION\",\n },\n instFamily: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/tickers\",\n compactObject({\n instType: requireString(args, \"instType\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_tickers\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_orderbook\",\n module: \"market\",\n description:\n \"Get the order book (bids/asks) for an instrument.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n sz: {\n type: \"number\",\n description: \"Depth per side, default 1, max 400\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/books\",\n compactObject({\n instId: requireString(args, \"instId\"),\n sz: readNumber(args, \"sz\"),\n }),\n publicRateLimit(\"market_get_orderbook\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_candles\",\n module: \"market\",\n description:\n \"Get candlestick (OHLCV) data for an instrument. history=false (default): recent candles up to 1440 bars; history=true: older historical data.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n bar: {\n type: \"string\",\n enum: [...OKX_CANDLE_BARS],\n description: \"Default 1m\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n history: {\n type: \"boolean\",\n description: \"true=older historical data beyond recent window\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n const path = isHistory\n ? \"/api/v5/market/history-candles\"\n : \"/api/v5/market/candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"market_get_candles\", 40),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_instruments\",\n module: \"market\",\n description:\n \"Get tradable instruments for a given type. Returns contract specs: min order size, lot size, tick size, contract value, settlement currency, listing/expiry time. Essential before placing orders.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...OKX_INST_TYPES],\n },\n instId: {\n type: \"string\",\n description: \"Filter by ID, e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"Required for OPTION, e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_instruments\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_funding_rate\",\n module: \"market\",\n description:\n \"Get funding rate for a SWAP instrument. history=false (default): current rate + next estimated rate; history=true: historical rates.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"SWAP instrument, e.g. BTC-USDT-SWAP\",\n },\n history: {\n type: \"boolean\",\n description: \"true=fetch historical rates\",\n },\n after: {\n type: \"string\",\n description: \"Pagination (history): before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination (history): after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"History records (default 20, max 100)\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n if (isHistory) {\n const response = await context.client.publicGet(\n \"/api/v5/public/funding-rate-history\",\n compactObject({\n instId: requireString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n publicRateLimit(\"market_get_funding_rate\", 20),\n );\n return normalizeResponse(response);\n }\n const response = await context.client.publicGet(\n \"/api/v5/public/funding-rate\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_funding_rate\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_mark_price\",\n module: \"market\",\n description:\n \"Get mark price for SWAP, FUTURES, or MARGIN instruments. Used for liquidation calculations and unrealized PnL.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/mark-price\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_mark_price\", 10),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_trades\",\n module: \"market\",\n description:\n \"Get recent trades for an instrument. Default 20 records, max 500.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n limit: {\n type: \"number\",\n description: \"Default 20, max 500\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/trades\",\n compactObject({\n instId: requireString(args, \"instId\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n publicRateLimit(\"market_get_trades\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_index_ticker\",\n module: \"market\",\n description:\n \"Get index ticker data (e.g. BTC-USD, ETH-USD index prices). Independent of any single exchange.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD. Omit for all indices\",\n },\n quoteCcy: {\n type: \"string\",\n description: \"e.g. USD or USDT\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/index-tickers\",\n compactObject({\n instId: readString(args, \"instId\"),\n quoteCcy: readString(args, \"quoteCcy\"),\n }),\n publicRateLimit(\"market_get_index_ticker\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_index_candles\",\n module: \"market\",\n description:\n \"Get candlestick data for an index (e.g. BTC-USD index). history=false: recent up to 1440 bars; history=true: older data.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"Index ID, e.g. BTC-USD\",\n },\n bar: {\n type: \"string\",\n enum: [...OKX_CANDLE_BARS],\n description: \"Default 1m\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n history: {\n type: \"boolean\",\n description: \"true=older historical data\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n const path = isHistory\n ? \"/api/v5/market/history-index-candles\"\n : \"/api/v5/market/index-candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"market_get_index_candles\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_price_limit\",\n module: \"market\",\n description:\n \"Get the current price limit (upper and lower bands) for a SWAP or FUTURES instrument. Orders outside these limits will be rejected.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"SWAP or FUTURES ID, e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/price-limit\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_price_limit\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_open_interest\",\n module: \"market\",\n description:\n \"Get open interest for SWAP, FUTURES, or OPTION instruments. Useful for gauging market sentiment and positioning.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/open-interest\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_open_interest\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_stock_tokens\",\n module: \"market\",\n description:\n \"Get all stock token instruments (instCategory=3). Stock tokens track real-world stock prices on OKX (e.g. AAPL-USDT-SWAP). Filters client-side by instCategory=3.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"SWAP\"],\n description: \"Instrument type. Default: SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"Optional: filter by specific instrument ID, e.g. AAPL-USDT-SWAP\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n const instId = readString(args, \"instId\");\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({ instType, instId }),\n publicRateLimit(\"market_get_stock_tokens\", 20),\n );\n const data = response.data;\n const filtered = Array.isArray(data)\n ? data.filter((item) => (item as Record<string, unknown>).instCategory === \"3\")\n : data;\n return normalizeResponse({ ...response, data: filtered });\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerOptionAlgoTools(): ToolSpec[] {\n return [\n {\n name: \"option_place_algo_order\",\n module: \"option\",\n description:\n \"Place OPTION TP/SL algo order (conditional/oco). [CAUTION] Executes real trades. conditional=single TP/SL; oco=TP+SL pair. -1=market.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD-241227-50000-C\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=buyer full premium; cross/isolated=seller margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"conditional=single TP/SL or both; oco=TP+SL pair (first trigger cancels other)\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts count (NOT USDT). Use market_get_instruments for ctVal.\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n tpTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n slTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in contracts, quote_ccy: sz in USDT (may not be supported for options)\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = readBoolean(args, \"reduceOnly\");\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n tpTriggerPxType: readString(args, \"tpTriggerPxType\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n slTriggerPxType: readString(args, \"slTriggerPxType\"),\n reduceOnly: reduceOnly !== undefined ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"option_place_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_amend_algo_order\",\n module: \"option\",\n description:\n \"Amend a pending OPTION algo order (modify TP/SL prices or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\", description: \"New contracts count\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"option_amend_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_cancel_algo_orders\",\n module: \"option\",\n description:\n \"Cancel OPTION algo orders (TP/SL). Each item: {algoId, instId}.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array of {algoId, instId} to cancel.\",\n items: {\n type: \"object\",\n properties: {\n algoId: {\n type: \"string\",\n description: \"Algo order ID\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD-241227-50000-C\",\n },\n },\n required: [\"algoId\", \"instId\"],\n },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n orders,\n privateRateLimit(\"option_cancel_algo_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_algo_orders\",\n module: \"option\",\n description:\n \"Query pending or completed OPTION algo orders (TP/SL, OCO).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"Filter by type; omit for all\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n algoId: {\n type: \"string\",\n description: \"Filter by algo order ID\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: return older\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: return newer\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description: \"When history: effective|canceled|order_failed\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"option_get_algo_orders\", 20),\n );\n return normalizeResponse(response);\n }\n\n // No filter: fetch conditional + oco in parallel and merge\n const [r1, r2] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"option_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"option_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerOptionTools(): ToolSpec[] {\n return [\n {\n name: \"option_place_order\",\n module: \"option\",\n description:\n \"Place OPTION order. instId: {uly}-{expiry}-{strike}-C/P, e.g. BTC-USD-241227-50000-C. [CAUTION] Executes real trades.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD-241227-50000-C\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=buyer full premium; cross/isolated=seller margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market=no px; limit/fok/ioc=px req; post_only=maker\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts count (NOT USDT). Use market_get_instruments for ctVal.\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Reduce/close only\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const attachAlgoOrds = buildAttachAlgoOrds(args);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"option_place_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_cancel_order\",\n module: \"option\",\n description:\n \"Cancel an unfilled OPTION order. Provide ordId or clOrdId.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"option_cancel_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_batch_cancel\",\n module: \"option\",\n description:\n \"[CAUTION] Batch cancel up to 20 OPTION orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"option_batch_cancel\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_amend_order\",\n module: \"option\",\n description:\n \"Amend an unfilled OPTION order (price and/or size). Provide ordId or clOrdId.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\" },\n newSz: { type: \"string\", description: \"New contracts count\" },\n newPx: { type: \"string\", description: \"New price\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n }),\n privateRateLimit(\"option_amend_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_order\",\n module: \"option\",\n description:\n \"Get details of a single OPTION order by ordId or clOrdId.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n clOrdId: { type: \"string\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"option_get_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_orders\",\n module: \"option\",\n description:\n \"List OPTION orders. status: live=pending (default), history=7d, archive=3mo.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"live\", \"history\", \"archive\"],\n description: \"live=pending (default), history=7d, archive=3mo\",\n },\n uly: { type: \"string\", description: \"Underlying filter, e.g. BTC-USD\" },\n instId: { type: \"string\", description: \"Instrument filter\" },\n ordType: { type: \"string\", description: \"Order type filter\" },\n state: { type: \"string\", description: \"canceled|filled\" },\n after: { type: \"string\", description: \"Cursor: return older\" },\n before: { type: \"string\", description: \"Cursor: return newer\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"live\";\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"OPTION\",\n uly: readString(args, \"uly\"),\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"option_get_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_positions\",\n module: \"option\",\n description:\n \"Get current OPTION positions including Greeks (delta, gamma, theta, vega).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"Filter by specific contract\" },\n uly: { type: \"string\", description: \"Filter by underlying, e.g. BTC-USD\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n }),\n privateRateLimit(\"option_get_positions\", 10),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_fills\",\n module: \"option\",\n description:\n \"Get OPTION fill history. archive=false: last 3 days (default); archive=true: up to 3 months.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instId: { type: \"string\", description: \"Instrument filter\" },\n ordId: { type: \"string\", description: \"Order ID filter\" },\n after: { type: \"string\", description: \"Cursor: return older\" },\n before: { type: \"string\", description: \"Cursor: return newer\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"option_get_fills\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_instruments\",\n module: \"option\",\n description:\n \"List available OPTION contracts for a given underlying (option chain). Use to find valid instIds before placing orders.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD or ETH-USD\",\n },\n expTime: {\n type: \"string\",\n description: \"Filter by expiry date, e.g. 241227\",\n },\n },\n required: [\"uly\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({\n instType: \"OPTION\",\n uly: requireString(args, \"uly\"),\n expTime: readString(args, \"expTime\"),\n }),\n privateRateLimit(\"option_get_instruments\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"option_get_greeks\",\n module: \"option\",\n description:\n \"Get implied volatility and Greeks (delta, gamma, theta, vega) for OPTION contracts by underlying.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD or ETH-USD\",\n },\n expTime: {\n type: \"string\",\n description: \"Filter by expiry date, e.g. 241227\",\n },\n },\n required: [\"uly\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/opt-summary\",\n compactObject({\n uly: requireString(args, \"uly\"),\n expTime: readString(args, \"expTime\"),\n }),\n privateRateLimit(\"option_get_greeks\", 20),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerSpotTradeTools(): ToolSpec[] {\n return [\n {\n name: \"spot_place_order\",\n module: \"spot\",\n description:\n \"Place a spot order. Attach TP/SL via tpTriggerPx/slTriggerPx. [CAUTION] Executes real trades.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=regular spot, cross/isolated=margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok(all-or-cancel)|ioc(partial fill)\",\n },\n sz: {\n type: \"string\",\n description: \"Buy market: quote amount, all others: base amount\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in base (e.g. BTC), quote_ccy: sz in quote (e.g. USDT)\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price, -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price, -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const attachAlgoOrds = buildAttachAlgoOrds(args);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n px: readString(args, \"px\"),\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"spot_place_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_cancel_order\",\n module: \"spot\",\n description:\n \"Cancel an unfilled spot order.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"spot_cancel_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_amend_order\",\n module: \"spot\",\n description:\n \"Amend an unfilled spot order (modify price or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n },\n newSz: {\n type: \"string\",\n description: \"New size in base currency\",\n },\n newPx: {\n type: \"string\",\n description: \"New price\",\n },\n newClOrdId: {\n type: \"string\",\n description: \"Replacement client order ID\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n newClOrdId: readString(args, \"newClOrdId\"),\n }),\n privateRateLimit(\"spot_amend_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_get_orders\",\n module: \"spot\",\n description:\n \"Query spot orders. status: open(active)|history(7d)|archive(3mo).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n description: \"Order type filter\",\n },\n state: {\n type: \"string\",\n description: \"canceled|filled\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: older than this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: newer than this order ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"spot_get_orders\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_place_algo_order\",\n module: \"spot\",\n description:\n \"Place a spot algo order: TP/SL (conditional/oco) or trailing stop (move_order_stop). [CAUTION] Executes real trades.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash(default)=spot, cross/isolated=margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"conditional=single TP/SL, oco=TP+SL pair, move_order_stop=trailing stop\",\n },\n sz: {\n type: \"string\",\n description: \"Quantity in base currency\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price (conditional/oco only)\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price, -1=market (conditional/oco only)\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price (conditional/oco only)\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price, -1=market (conditional/oco only)\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\"],\n description: \"Size unit. base_ccy(default): sz in base (e.g. BTC), quote_ccy: sz in quote (e.g. USDT)\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio e.g. 0.01=1%, use ratio or spread (move_order_stop only)\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units, use ratio or spread (move_order_stop only)\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price, trailing starts when market hits this (move_order_stop only)\",\n },\n },\n required: [\"instId\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: readString(args, \"tdMode\") ?? \"cash\",\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tgtCcy: readString(args, \"tgtCcy\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n callbackRatio: readString(args, \"callbackRatio\"),\n callbackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"spot_place_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_amend_algo_order\",\n module: \"spot\",\n description:\n \"Amend a pending spot algo order (modify TP/SL prices or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT\" },\n algoId: { type: \"string\" },\n newSz: { type: \"string\", description: \"New size in base currency\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price, -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price, -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"spot_amend_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_cancel_algo_order\",\n module: \"spot\",\n description:\n \"Cancel a spot algo order (TP/SL).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n algoId: {\n type: \"string\",\n },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n [\n {\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n },\n ],\n privateRateLimit(\"spot_cancel_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_get_algo_orders\",\n module: \"spot\",\n description:\n \"Query spot algo orders (TP/SL) — pending or history.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default), history=completed\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"Filter by type\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: older than this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: newer than this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description: \"Required for history. effective=triggered, canceled, order_failed. Default: effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"spot_get_algo_orders\", 20),\n );\n return normalizeResponse(response);\n }\n\n // ordType is required by OKX; fetch all three spot types in parallel and merge\n const [r1, r2, r3] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"move_order_stop\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ...((r3.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n {\n name: \"spot_get_fills\",\n module: \"spot\",\n description:\n \"Get spot transaction fills. archive=false(3d, default)|true(up to 3mo).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3mo, false=3d (default)\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordId: {\n type: \"string\",\n description: \"Order ID filter\",\n },\n after: {\n type: \"string\",\n description: \"Cursor: older than this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Cursor: newer than this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100 or 20 for archive)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"spot_get_fills\", 20),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_batch_orders\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch place/cancel/amend up to 20 spot orders. action: place|cancel|amend.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"place\", \"cancel\", \"amend\"],\n },\n orders: {\n type: \"array\",\n description:\n \"Array (max 20). place: {instId,side,ordType,sz,tdMode(default cash; use cross for unified/margin accounts),px?,clOrdId?,tpTriggerPx?,tpOrdPx?,slTriggerPx?,slOrdPx?}. cancel: {instId,ordId|clOrdId}. amend: {instId,ordId|clOrdId,newSz?,newPx?}.\",\n items: {\n type: \"object\",\n },\n },\n },\n required: [\"action\", \"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"place\", \"cancel\", \"amend\"]);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const endpointMap: Record<string, string> = {\n place: \"/api/v5/trade/batch-orders\",\n cancel: \"/api/v5/trade/cancel-batch-orders\",\n amend: \"/api/v5/trade/amend-batch-orders\",\n };\n const body: Record<string, unknown>[] =\n action === \"place\"\n ? orders.map((order: unknown) => {\n const o = asRecord(order);\n const attachAlgoOrds = buildAttachAlgoOrds(o);\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: readString(o, \"tdMode\") ?? \"cash\",\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n })\n : (orders as Record<string, unknown>[]);\n const response = await context.client.privatePost(\n endpointMap[action],\n body,\n privateRateLimit(\"spot_batch_orders\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_get_order\",\n module: \"spot\",\n description:\n \"Get details of a single spot order.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"spot_get_order\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_batch_amend\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch amend up to 20 unfilled spot orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?, newSz?, newPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"spot_batch_amend\", 60),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"spot_batch_cancel\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch cancel up to 20 spot orders.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"spot_batch_cancel\", 60),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n buildAttachAlgoOrds,\n compactObject,\n normalizeResponse,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { buildContractTradeTools } from \"./contract-trade.js\";\n\nexport function registerSwapTradeTools(): ToolSpec[] {\n const common = buildContractTradeTools({\n prefix: \"swap\",\n module: \"swap\",\n label: \"SWAP/FUTURES\",\n instTypes: [\"SWAP\", \"FUTURES\"],\n instIdExample: \"e.g. BTC-USDT-SWAP\",\n });\n\n return [\n ...common,\n\n // ── swap_amend_algo_order ─────────────────────────────────────────────────\n // Unique to swap: amend a pending TP/SL algo order attached to a position.\n {\n name: \"swap_amend_algo_order\",\n module: \"swap\",\n description:\n \"Amend a pending SWAP/FUTURES algo order (modify TP/SL prices or size).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT-SWAP\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\", description: \"New contracts count\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"swap_amend_algo_order\", 20),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── swap_batch_orders ─────────────────────────────────────────────────────\n // Unique to swap: 3-in-1 batch tool (place / cancel / amend via action param).\n {\n name: \"swap_batch_orders\",\n module: \"swap\",\n description:\n \"[CAUTION] Batch place/cancel/amend SWAP/FUTURES orders (max 20). action=place|cancel|amend.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"place\", \"cancel\", \"amend\"],\n },\n orders: {\n type: \"array\",\n description:\n \"Max 20. place:{instId,tdMode,side,ordType,sz,...}; cancel:{instId,ordId|clOrdId}; amend:{instId,ordId|clOrdId,newSz?,newPx?}.\",\n items: { type: \"object\" },\n },\n },\n required: [\"action\", \"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"place\", \"cancel\", \"amend\"]);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const endpointMap: Record<string, string> = {\n place: \"/api/v5/trade/batch-orders\",\n cancel: \"/api/v5/trade/cancel-batch-orders\",\n amend: \"/api/v5/trade/amend-batch-orders\",\n };\n const body: Record<string, unknown>[] =\n action === \"place\"\n ? orders.map((order: unknown) => {\n const o = asRecord(order);\n const attachAlgoOrds = buildAttachAlgoOrds(o);\n const reduceOnly = o.reduceOnly;\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: requireString(o, \"tdMode\"),\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n posSide: readString(o, \"posSide\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n })\n : (orders as Record<string, unknown>[]);\n const response = await context.client.privatePost(\n endpointMap[action],\n body,\n privateRateLimit(\"swap_batch_orders\", 60),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { OkxConfig } from \"../config.js\";\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport { MODULES, type ModuleId } from \"../constants.js\";\nimport { registerAccountTools } from \"./account.js\";\nimport { registerAlgoTradeTools, registerFuturesAlgoTools } from \"./algo-trade.js\";\nimport { registerAuditTools } from \"./audit.js\";\nimport { registerBotTools } from \"./bot/index.js\";\nimport { registerAllEarnTools } from \"./earn/index.js\";\nimport { registerFuturesTools } from \"./futures-trade.js\";\nimport { registerIndicatorTools } from \"./indicator.js\";\nimport { registerMarketTools } from \"./market.js\";\nimport { registerOptionAlgoTools } from \"./option-algo-trade.js\";\nimport { registerOptionTools } from \"./option-trade.js\";\nimport { registerSpotTradeTools } from \"./spot-trade.js\";\nimport { registerSwapTradeTools } from \"./swap-trade.js\";\nimport type { ToolSpec, ToolArgs } from \"./types.js\";\n\n/**\n * Return specs for every registered tool across all modules.\n *\n * Exported for external consumers (e.g. diagnostic / introspection tooling)\n * that need to enumerate tool names, schemas, or module membership without\n * instantiating a full client. Not all callers use every spec — consumers\n * should filter as needed.\n */\nexport function allToolSpecs(): ToolSpec[] {\n return [\n ...registerMarketTools(),\n ...registerIndicatorTools(),\n ...registerSpotTradeTools(),\n ...registerSwapTradeTools(),\n ...registerFuturesTools(),\n ...registerFuturesAlgoTools(),\n ...registerOptionTools(),\n ...registerOptionAlgoTools(),\n ...registerAlgoTradeTools(),\n ...registerAccountTools(),\n ...registerBotTools(),\n ...registerAllEarnTools(),\n ...registerAuditTools(),\n ];\n}\n\nexport function buildTools(config: OkxConfig): ToolSpec[] {\n const enabledModules = new Set(config.modules);\n const tools = allToolSpecs().filter((tool) => enabledModules.has(tool.module));\n if (!config.readOnly) {\n return tools;\n }\n return tools.filter((tool) => !tool.isWrite);\n}\n\nexport interface ToolResult {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}\n\nexport type ToolRunner = (toolName: string, args: ToolArgs) => Promise<ToolResult>;\n\n/**\n * Create a function that can call any registered tool by name.\n * All modules are enabled regardless of config.modules, since CLI\n * controls which commands to expose at the routing level.\n */\nexport function createToolRunner(client: OkxRestClient, config: OkxConfig): ToolRunner {\n const fullConfig: OkxConfig = { ...config, modules: [...MODULES] as ModuleId[], readOnly: false };\n const tools = allToolSpecs();\n const toolMap = new Map<string, ToolSpec>(tools.map((t) => [t.name, t]));\n\n return async (toolName: string, args: ToolArgs): Promise<ToolResult> => {\n const tool = toolMap.get(toolName);\n if (!tool) throw new Error(`Unknown tool: ${toolName}`);\n const result = await tool.handler(args, { config: fullConfig, client });\n return result as ToolResult;\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport type { OkxConfig } from \"../config.js\";\nimport type { ModuleId } from \"../constants.js\";\n\nexport type ToolArgs = Record<string, unknown>;\n\nexport type JsonSchema = Tool[\"inputSchema\"];\n\nexport interface ToolContext {\n config: OkxConfig;\n client: OkxRestClient;\n}\n\nexport interface ToolSpec {\n name: string;\n module: ModuleId;\n description: string;\n inputSchema: JsonSchema;\n isWrite: boolean;\n handler: (args: ToolArgs, context: ToolContext) => Promise<unknown>;\n}\n\nexport function toMcpTool(tool: ToolSpec): Tool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n readOnlyHint: !tool.isWrite,\n destructiveHint: tool.isWrite,\n idempotentHint: !tool.isWrite,\n openWorldHint: true,\n },\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse, stringify } from \"smol-toml\";\nimport { ConfigError } from \"../utils/errors.js\";\n\nexport { stringify as tomlStringify };\n\nexport interface OkxProfile {\n api_key?: string;\n secret_key?: string;\n passphrase?: string;\n base_url?: string;\n timeout_ms?: number;\n demo?: boolean;\n site?: string;\n proxy_url?: string;\n}\n\nexport interface OkxTomlConfig {\n default_profile?: string;\n profiles: Record<string, OkxProfile>;\n}\n\nexport function configFilePath(): string {\n return join(homedir(), \".okx\", \"config.toml\");\n}\n\n/**\n * Read the full config from ~/.okx/config.toml.\n * Returns a config with empty profiles if the file does not exist.\n */\nexport function readFullConfig(): OkxTomlConfig {\n const path = configFilePath();\n if (!existsSync(path)) return { profiles: {} };\n const raw = readFileSync(path, \"utf-8\");\n try {\n return parse(raw) as unknown as OkxTomlConfig;\n } catch (err) {\n throw new ConfigError(\n `Failed to parse ${path}: ${err instanceof Error ? err.message : String(err)}`,\n \"If your passphrase or keys contain special characters:\\n\" +\n \" - Contains # \\\\ \\\" → use single quotes: passphrase = 'your#pass'\\n\" +\n \" - Contains ' → use double quotes: passphrase = \\\"your'pass\\\"\\n\" +\n \" - Contains both → use triple quotes: passphrase = '''your'#pass'''\\n\" +\n \"Or re-run: okx config init\",\n );\n }\n}\n\n/**\n * Read a profile from ~/.okx/config.toml.\n * Returns an empty object if the file does not exist or the profile is not found.\n */\nexport function readTomlProfile(profileName?: string): OkxProfile {\n const config = readFullConfig();\n const name = profileName ?? config.default_profile ?? \"default\";\n return config.profiles?.[name] ?? {};\n}\n\nconst CONFIG_HEADER =\n \"# OKX Trade Kit Configuration\\n\" +\n \"# If editing manually, wrap values containing special chars in quotes:\\n\" +\n \"# passphrase = 'value' (if value contains # \\\\ \\\")\\n\" +\n \"# passphrase = \\\"value\\\" (if value contains ')\\n\" +\n \"# passphrase = '''value''' (if value contains both)\\n\\n\";\n\n/**\n * Write the full config to ~/.okx/config.toml.\n * Creates the parent directory if it does not exist.\n */\nexport function writeFullConfig(config: OkxTomlConfig): void {\n const path = configFilePath();\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, CONFIG_HEADER + stringify(config as unknown as Record<string, unknown>), \"utf-8\");\n}\n","import { BOT_DEFAULT_SUB_MODULES, BOT_SUB_MODULE_IDS, EARN_SUB_MODULE_IDS, DEFAULT_MODULES, DEFAULT_SOURCE_TAG, MODULES, OKX_SITES, SITE_IDS, type ModuleId, type SiteId } from \"./constants.js\";\nimport { ConfigError } from \"./utils/errors.js\";\nimport { readTomlProfile } from \"./config/toml.js\";\nimport type { OkxProfile } from \"./config/toml.js\";\n\nexport interface CliOptions {\n modules?: string;\n readOnly: boolean;\n demo: boolean;\n profile?: string;\n site?: string;\n userAgent?: string;\n sourceTag?: string;\n verbose?: boolean;\n}\n\nexport interface OkxConfig {\n apiKey?: string;\n secretKey?: string;\n passphrase?: string;\n hasAuth: boolean;\n baseUrl: string;\n timeoutMs: number;\n modules: ModuleId[];\n readOnly: boolean;\n demo: boolean;\n site: SiteId;\n userAgent?: string;\n sourceTag: string;\n proxyUrl?: string;\n verbose: boolean;\n}\n\n/**\n * Expand a single module shorthand into its concrete sub-module IDs.\n * Returns the expanded IDs, or null if the input is not a shorthand.\n */\nfunction expandShorthand(moduleId: string): ModuleId[] | null {\n // \"all\" expands to every known module (base + bot sub-modules + earn sub-modules)\n if (moduleId === \"all\") return [...MODULES];\n if (moduleId === \"earn\" || moduleId === \"earn.all\") return [...EARN_SUB_MODULE_IDS];\n if (moduleId === \"bot\") return [...BOT_DEFAULT_SUB_MODULES];\n if (moduleId === \"bot.all\") return [...BOT_SUB_MODULE_IDS];\n return null;\n}\n\nfunction parseModuleList(rawModules?: string): ModuleId[] {\n if (!rawModules || rawModules.trim().length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const trimmed = rawModules.trim().toLowerCase();\n const requested = trimmed.split(\",\").map((s) => s.trim()).filter(Boolean);\n if (requested.length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const deduped = new Set<ModuleId>();\n for (const moduleId of requested) {\n const expanded = expandShorthand(moduleId);\n if (expanded) {\n expanded.forEach((sub) => deduped.add(sub));\n continue;\n }\n if (!MODULES.includes(moduleId as ModuleId)) {\n throw new ConfigError(\n `Unknown module \"${moduleId}\".`,\n `Use one of: ${MODULES.join(\", \")}, \"earn\", \"earn.all\", \"bot\", \"bot.all\", or \"all\".`,\n );\n }\n deduped.add(moduleId as ModuleId);\n }\n\n return Array.from(deduped);\n}\n\nfunction loadCredentials(toml: OkxProfile): { apiKey?: string; secretKey?: string; passphrase?: string; hasAuth: boolean } {\n const apiKey = process.env.OKX_API_KEY?.trim() ?? toml.api_key;\n const secretKey = process.env.OKX_SECRET_KEY?.trim() ?? toml.secret_key;\n const passphrase = process.env.OKX_PASSPHRASE?.trim() ?? toml.passphrase;\n const hasAuth = Boolean(apiKey && secretKey && passphrase);\n const partialAuth = Boolean(apiKey) || Boolean(secretKey) || Boolean(passphrase);\n if (partialAuth && !hasAuth) {\n throw new ConfigError(\n \"Partial API credentials detected.\",\n \"Set OKX_API_KEY, OKX_SECRET_KEY and OKX_PASSPHRASE together (env vars or config.toml profile).\",\n );\n }\n return { apiKey, secretKey, passphrase, hasAuth };\n}\n\nfunction resolveSite(cliSite?: string, tomlSite?: string): SiteId {\n const rawSite = cliSite?.trim() ?? process.env.OKX_SITE?.trim() ?? tomlSite ?? \"global\";\n if (!SITE_IDS.includes(rawSite as SiteId)) {\n throw new ConfigError(\n `Unknown site \"${rawSite}\".`,\n `Use one of: ${SITE_IDS.join(\", \")}.`,\n );\n }\n return rawSite as SiteId;\n}\n\nfunction resolveBaseUrl(site: SiteId, tomlBaseUrl?: string): string {\n const rawBaseUrl =\n process.env.OKX_API_BASE_URL?.trim() ?? tomlBaseUrl ?? OKX_SITES[site].apiBaseUrl;\n if (!rawBaseUrl.startsWith(\"http://\") && !rawBaseUrl.startsWith(\"https://\")) {\n throw new ConfigError(\n `Invalid base URL \"${rawBaseUrl}\".`,\n \"OKX_API_BASE_URL must start with http:// or https://\",\n );\n }\n return rawBaseUrl.replace(/\\/+$/, \"\");\n}\n\n/**\n * Credential priority (highest to lowest):\n * 1. Environment variables (OKX_API_KEY / OKX_SECRET_KEY / OKX_PASSPHRASE)\n * 2. ~/.okx/config.toml — profile selected by cli.profile or default_profile\n *\n * Site priority (highest to lowest):\n * 1. cli.site arg\n * 2. OKX_SITE env var\n * 3. toml profile site field\n * 4. default: \"global\"\n *\n * Base URL priority (highest to lowest):\n * 1. OKX_API_BASE_URL env var (explicit override — advanced users)\n * 2. toml profile base_url\n * 3. site's apiBaseUrl (auto-derived from site)\n */\nexport function loadConfig(cli: CliOptions): OkxConfig {\n const toml = readTomlProfile(cli.profile);\n const creds = loadCredentials(toml);\n\n const demo =\n cli.demo ||\n process.env.OKX_DEMO === \"1\" ||\n process.env.OKX_DEMO === \"true\" ||\n (toml.demo ?? false);\n\n const site = resolveSite(cli.site, toml.site);\n const baseUrl = resolveBaseUrl(site, toml.base_url);\n\n const rawTimeout = process.env.OKX_TIMEOUT_MS\n ? Number(process.env.OKX_TIMEOUT_MS)\n : (toml.timeout_ms ?? 15_000);\n if (!Number.isFinite(rawTimeout) || rawTimeout <= 0) {\n throw new ConfigError(\n `Invalid timeout value \"${rawTimeout}\".`,\n \"Set OKX_TIMEOUT_MS as a positive integer in milliseconds.\",\n );\n }\n\n // proxy: toml profile only (no env vars — keep it explicit)\n const rawProxyUrl = toml.proxy_url?.trim();\n if (rawProxyUrl && !rawProxyUrl.startsWith(\"http://\") && !rawProxyUrl.startsWith(\"https://\")) {\n throw new ConfigError(\n `Invalid proxy URL \"${rawProxyUrl}\".`,\n \"proxy_url must start with http:// or https://. SOCKS proxies are not supported.\",\n );\n }\n\n return {\n ...creds,\n baseUrl,\n timeoutMs: Math.floor(rawTimeout),\n modules: parseModuleList(cli.modules),\n readOnly: cli.readOnly,\n demo,\n site,\n userAgent: cli.userAgent,\n sourceTag: cli.sourceTag ?? DEFAULT_SOURCE_TAG,\n proxyUrl: rawProxyUrl || undefined,\n verbose: cli.verbose ?? false,\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CACHE_FILE = join(homedir(), \".okx\", \"update-check.json\");\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface PackageCache {\n latestVersion: string;\n checkedAt: number;\n}\n\ntype UpdateCache = Record<string, PackageCache>;\n\nfunction readCache(): UpdateCache {\n try {\n if (existsSync(CACHE_FILE)) {\n return JSON.parse(readFileSync(CACHE_FILE, \"utf-8\")) as UpdateCache;\n }\n } catch {\n // ignore corrupt cache\n }\n return {};\n}\n\nfunction writeCache(cache: UpdateCache): void {\n try {\n mkdirSync(join(homedir(), \".okx\"), { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2), \"utf-8\");\n } catch {\n // ignore write failures\n }\n}\n\nfunction isNewerVersion(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v\n .replace(/^v/, \"\")\n .split(\".\")\n .map((n) => parseInt(n, 10));\n const [cMaj, cMin, cPat] = parse(current);\n const [lMaj, lMin, lPat] = parse(latest);\n if (lMaj !== cMaj) return lMaj > cMaj;\n if (lMin !== cMin) return lMin > cMin;\n return lPat > cPat;\n}\n\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`, {\n signal: controller.signal,\n headers: { accept: \"application/json\" },\n });\n clearTimeout(timeout);\n if (!res.ok) return null;\n const data = (await res.json()) as { version: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction refreshCacheInBackground(packageName: string): void {\n fetchLatestVersion(packageName)\n .then((latest) => {\n if (!latest) return;\n const cache = readCache();\n cache[packageName] = { latestVersion: latest, checkedAt: Date.now() };\n writeCache(cache);\n })\n .catch(() => {\n // ignore\n });\n}\n\n/**\n * Check if an update is available and print a notice to stderr.\n * Uses a local cache (~/.okx/update-check.json) so network calls happen\n * at most once per 24 hours, in the background without blocking startup.\n */\nexport function checkForUpdates(packageName: string, currentVersion: string): void {\n const cache = readCache();\n const entry = cache[packageName];\n\n if (entry && isNewerVersion(currentVersion, entry.latestVersion)) {\n process.stderr.write(\n `\\nUpdate available for ${packageName}: ${currentVersion} → ${entry.latestVersion}\\n` +\n `Run: npm install -g ${packageName}\\n\\n`,\n );\n }\n\n if (!entry || Date.now() - entry.checkedAt > CHECK_INTERVAL_MS) {\n refreshCacheInBackground(packageName);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\";\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\n\nconst SENSITIVE_KEY_PATTERN = /apiKey|secretKey|passphrase|password|secret/i;\n\nfunction sanitize(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(sanitize);\n }\n if (typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (SENSITIVE_KEY_PATTERN.test(k)) {\n result[k] = \"[REDACTED]\";\n } else {\n result[k] = sanitize(v);\n }\n }\n return result;\n }\n return value;\n}\n\nexport interface LogEntry {\n timestamp: string;\n level: Uppercase<LogLevel>;\n tool: string;\n durationMs: number;\n params: unknown;\n result: unknown;\n}\n\nexport class TradeLogger {\n private readonly logLevel: LogLevel;\n private readonly logDir: string;\n\n constructor(logLevel: LogLevel = \"info\", logDir?: string) {\n this.logLevel = logLevel;\n this.logDir = logDir ?? path.join(os.homedir(), \".okx\", \"logs\");\n }\n\n getLogPath(date?: Date): string {\n const d = date ?? new Date();\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n return path.join(this.logDir, `trade-${yyyy}-${mm}-${dd}.log`);\n }\n\n log(\n level: LogLevel,\n tool: string,\n params: unknown,\n result: unknown,\n durationMs: number,\n ): void {\n if (LOG_LEVEL_PRIORITY[level] > LOG_LEVEL_PRIORITY[this.logLevel]) {\n return;\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level: level.toUpperCase() as Uppercase<LogLevel>,\n tool,\n durationMs,\n params: sanitize(params),\n result: sanitize(result),\n };\n\n try {\n fs.mkdirSync(this.logDir, { recursive: true });\n fs.appendFileSync(this.getLogPath(), JSON.stringify(entry) + \"\\n\", \"utf8\");\n } catch {\n // silent fail\n }\n }\n\n static sanitize(params: unknown): unknown {\n return sanitize(params);\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\nimport { configFilePath } from \"./config/toml.js\";\n\nexport type ClientId = \"claude-desktop\" | \"cursor\" | \"windsurf\" | \"vscode\" | \"claude-code\";\n\nexport interface SetupOptions {\n client: ClientId;\n profile?: string;\n modules?: string;\n}\n\nexport const CLIENT_NAMES: Record<ClientId, string> = {\n \"claude-desktop\": \"Claude Desktop\",\n cursor: \"Cursor\",\n windsurf: \"Windsurf\",\n vscode: \"VS Code\",\n \"claude-code\": \"Claude Code CLI\",\n};\n\nexport const SUPPORTED_CLIENTS = Object.keys(CLIENT_NAMES) as ClientId[];\n\nfunction appData(): string {\n return process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n}\n\nconst CLAUDE_CONFIG_FILE = \"claude_desktop_config.json\";\n\n/**\n * Detect Microsoft Store installation of Claude Desktop on Windows.\n * MS Store apps use a sandboxed path:\n * %LOCALAPPDATA%\\Packages\\Claude_<hash>\\LocalCache\\Roaming\\Claude\\\n * Returns the config file path if found, null otherwise.\n */\nfunction findMsStoreClaudePath(): string | null {\n const localAppData = process.env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\");\n const packagesDir = path.join(localAppData, \"Packages\");\n try {\n const entries = fs.readdirSync(packagesDir);\n const claudePkg = entries.find((e) => e.startsWith(\"Claude_\"));\n if (claudePkg) {\n const configPath = path.join(\n packagesDir, claudePkg, \"LocalCache\", \"Roaming\", \"Claude\", CLAUDE_CONFIG_FILE,\n );\n // Return if the config file or its parent directory already exists\n if (fs.existsSync(configPath) || fs.existsSync(path.dirname(configPath))) {\n return configPath;\n }\n }\n } catch {\n // Packages dir may not exist or may not be readable\n }\n return null;\n}\n\nexport function getConfigPath(client: ClientId): string | null {\n const home = os.homedir();\n const platform = process.platform;\n switch (client) {\n case \"claude-desktop\":\n if (platform === \"win32\") {\n // Prefer MS Store path if detected, otherwise standard %APPDATA%\n return findMsStoreClaudePath() ?? path.join(appData(), \"Claude\", CLAUDE_CONFIG_FILE);\n }\n if (platform === \"darwin\") {\n return path.join(home, \"Library\", \"Application Support\", \"Claude\", CLAUDE_CONFIG_FILE);\n }\n // Linux / other\n return path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, \".config\"), \"Claude\", CLAUDE_CONFIG_FILE);\n case \"cursor\":\n return path.join(home, \".cursor\", \"mcp.json\");\n case \"windsurf\":\n return path.join(home, \".codeium\", \"windsurf\", \"mcp_config.json\");\n case \"vscode\":\n return path.join(process.cwd(), \".mcp.json\");\n case \"claude-code\":\n return null;\n }\n}\n\nconst NPX_PACKAGE = \"@okx_ai/okx-trade-mcp\";\n\nfunction buildEntry(\n client: ClientId,\n args: string[]\n): Record<string, unknown> {\n if (client === \"vscode\") {\n // VS Code inherits the terminal PATH — bare command is fine\n return { type: \"stdio\", command: \"okx-trade-mcp\", args };\n }\n // Standalone apps (Claude Desktop, Cursor, Windsurf) have a limited PATH\n // that often can't find globally-installed npm bins. Use npx to ensure\n // the binary is always resolved.\n return { command: \"npx\", args: [\"-y\", NPX_PACKAGE, ...args] };\n}\n\nfunction buildArgs(options: SetupOptions): string[] {\n const args: string[] = [];\n if (options.profile) args.push(\"--profile\", options.profile);\n args.push(\"--modules\", options.modules ?? \"all\");\n return args;\n}\n\nfunction mergeJsonConfig(\n configPath: string,\n serverName: string,\n entry: Record<string, unknown>\n): void {\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n\n let data: Record<string, unknown> = {};\n if (fs.existsSync(configPath)) {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n try {\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n throw new Error(`Failed to parse existing config at ${configPath}`);\n }\n // Backup before modifying\n const backupPath = configPath + \".bak\";\n fs.copyFileSync(configPath, backupPath);\n process.stdout.write(` Backup → ${backupPath}\\n`);\n }\n\n if (typeof data.mcpServers !== \"object\" || data.mcpServers === null) {\n data.mcpServers = {};\n }\n (data.mcpServers as Record<string, unknown>)[serverName] = entry;\n\n fs.writeFileSync(configPath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function printSetupUsage(): void {\n process.stdout.write(\n `Usage: okx-trade-mcp setup --client <client> [--profile <name>] [--modules <list>]\\n\\n` +\n `Clients:\\n` +\n SUPPORTED_CLIENTS.map((id) => ` ${id.padEnd(16)} ${CLIENT_NAMES[id]}`).join(\"\\n\") +\n `\\n\\nOptions:\\n` +\n ` --profile <name> Profile from ${configFilePath()} (default: uses default_profile)\\n` +\n ` --modules <list> Comma-separated modules or \"all\" (default: all)\\n`\n );\n}\n\nexport function runSetup(options: SetupOptions): void {\n const { client } = options;\n const name = CLIENT_NAMES[client];\n const args = buildArgs(options);\n const serverName = options.profile ? `okx-trade-mcp-${options.profile}` : \"okx-trade-mcp\";\n\n if (client === \"claude-code\") {\n const claudeArgs = [\n \"mcp\",\n \"add\",\n \"--transport\",\n \"stdio\",\n serverName,\n \"--\",\n \"okx-trade-mcp\",\n ...args,\n ];\n process.stdout.write(`Running: claude ${claudeArgs.join(\" \")}\\n`);\n execFileSync(\"claude\", claudeArgs, { stdio: \"inherit\" }); // NOSONAR\n process.stdout.write(`✓ Configured ${name}\\n`);\n return;\n }\n\n const configPath = getConfigPath(client);\n if (!configPath) {\n throw new Error(`${name} is not supported on this platform`);\n }\n\n const entry = buildEntry(client, args);\n mergeJsonConfig(configPath, serverName, entry);\n process.stdout.write(\n `✓ Configured ${name}\\n` +\n ` ${configPath}\\n` +\n ` Server args: ${args.join(\" \")}\\n`\n );\n if (client !== \"vscode\") {\n process.stdout.write(` Restart ${name} to apply changes.\\n`);\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n return banComments || c !== '#'\n ? ptr\n : skipVoid(str, skipComment(str, ptr), banNewLines);\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (obj instanceof Date)\n return 'date';\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatString(s) {\n return JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f');\n}\nfunction stringifyValue(val, type, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n if (type === 'number') {\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (numberAsFloat && Number.isInteger(val))\n return val.toFixed(1);\n return val.toString();\n }\n if (type === 'bigint' || type === 'boolean') {\n return val.toString();\n }\n if (type === 'string') {\n return formatString(val);\n }\n if (type === 'date') {\n if (isNaN(val.getTime())) {\n throw new TypeError('cannot serialize invalid date');\n }\n return val.toISOString();\n }\n if (type === 'object') {\n return stringifyInlineTable(val, depth, numberAsFloat);\n }\n if (type === 'array') {\n return stringifyArray(val, depth, numberAsFloat);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += BARE_KEY.test(k) ? k : formatString(k);\n res += ' = ';\n res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = BARE_KEY.test(k) ? k : formatString(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n","import dns from \"node:dns/promises\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport tls from \"node:tls\";\nimport type { OkxConfig } from \"@agent-tradekit/core\";\nimport { OkxRestClient, readFullConfig, configFilePath } from \"@agent-tradekit/core\";\nimport { Report, ok, fail, section, readCliVersion, writeReportIfRequested } from \"./diagnose-utils.js\";\nimport { output, outputLine } from \"../formatter.js\";\nimport { cmdDiagnoseMcp } from \"./diagnose-mcp.js\";\n\nconst CLI_VERSION = readCliVersion();\n\ndeclare const __GIT_HASH__: string;\nconst GIT_HASH: string = typeof __GIT_HASH__ !== \"undefined\" ? __GIT_HASH__ : \"dev\";\n\n\nfunction maskKey(key: string | undefined): string {\n if (!key) return \"(not set)\";\n if (key.length <= 8) return \"****\";\n return `${key.slice(0, 2)}****${key.slice(-2)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Network probes\n// ---------------------------------------------------------------------------\n\ninterface ProbeResult { ok: boolean; ms: number; ip?: string; error?: string }\n\nasync function checkDns(hostname: string): Promise<ProbeResult> {\n const t0 = Date.now();\n try {\n const addresses = await dns.resolve4(hostname);\n return { ok: true, ip: addresses[0], ms: Date.now() - t0 };\n } catch (e) {\n return { ok: false, ms: Date.now() - t0, error: e instanceof Error ? e.message : String(e) };\n }\n}\n\nasync function checkSocket(\n createFn: () => net.Socket | tls.TLSSocket,\n successEvent: string,\n timeoutMs: number,\n): Promise<ProbeResult> {\n const t0 = Date.now();\n return new Promise((resolve) => {\n const socket = createFn();\n const cleanup = (): void => { socket.removeAllListeners(); socket.destroy(); };\n socket.once(successEvent, () => {\n cleanup();\n resolve({ ok: true, ms: Date.now() - t0 });\n });\n socket.once(\"timeout\", () => {\n cleanup();\n resolve({ ok: false, ms: Date.now() - t0, error: `timed out after ${timeoutMs}ms` });\n });\n socket.once(\"error\", (err: Error) => {\n cleanup();\n resolve({ ok: false, ms: Date.now() - t0, error: err.message });\n });\n });\n}\n\nasync function checkTcp(hostname: string, port: number, timeoutMs = 5000): Promise<ProbeResult> {\n return checkSocket(\n () => net.createConnection({ host: hostname, port, timeout: timeoutMs }),\n \"connect\",\n timeoutMs,\n );\n}\n\nasync function checkTls(hostname: string, port: number, timeoutMs = 5000): Promise<ProbeResult> {\n return checkSocket(\n () => tls.connect({ host: hostname, port, timeout: timeoutMs, servername: hostname }),\n \"secureConnect\",\n timeoutMs,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Diagnostic check helpers (extracted to reduce cmdDiagnose complexity)\n// ---------------------------------------------------------------------------\n\nfunction checkProxyEnv(report: Report): void {\n const httpProxy = process.env.HTTP_PROXY ?? process.env.http_proxy;\n const httpsProxy = process.env.HTTPS_PROXY ?? process.env.https_proxy;\n const noProxy = process.env.NO_PROXY ?? process.env.no_proxy;\n if (httpProxy || httpsProxy) {\n ok(\"HTTP_PROXY\", httpProxy ?? \"(not set)\");\n ok(\"HTTPS_PROXY\", httpsProxy ?? \"(not set)\");\n if (noProxy) ok(\"NO_PROXY\", noProxy);\n report.add(\"http_proxy\", httpProxy ?? \"-\");\n report.add(\"https_proxy\", httpsProxy ?? \"-\");\n if (noProxy) report.add(\"no_proxy\", noProxy);\n } else {\n ok(\"Proxy\", \"(none)\");\n report.add(\"proxy\", \"none\");\n }\n}\n\nfunction checkEnvironment(report: Report): boolean {\n let passed = true;\n section(\"Environment\");\n\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.slice(1), 10);\n if (nodeMajor >= 18) {\n ok(\"Node.js\", `${nodeVersion} (>= 18 required)`);\n } else {\n fail(\"Node.js\", `${nodeVersion} (>= 18 required)`, [\"Upgrade Node.js to v18 or later\"]);\n passed = false;\n }\n ok(\"CLI\", `v${CLI_VERSION} (${GIT_HASH})`);\n ok(\"OS\", `${process.platform} ${process.arch}`);\n ok(\"OS release\", os.release());\n ok(\"Shell\", process.env.SHELL ?? \"(unknown)\");\n ok(\"Locale\", `${process.env.LANG ?? process.env.LC_ALL ?? \"(unknown)\"}`);\n ok(\"Timezone\", Intl.DateTimeFormat().resolvedOptions().timeZone);\n\n report.add(\"cli\", `${CLI_VERSION} (${GIT_HASH})`);\n report.add(\"node\", `${nodeVersion} ${process.platform} ${process.arch}`);\n // os.machine() available since Node 19.9 — fall back to process.arch for Node 18\n const machine = typeof os.machine === \"function\" ? os.machine() : process.arch;\n report.add(\"os\", `${os.type()} ${os.release()} ${machine}`);\n report.add(\"shell\", process.env.SHELL ?? \"-\");\n report.add(\"locale\", process.env.LANG ?? process.env.LC_ALL ?? \"-\");\n report.add(\"tz\", Intl.DateTimeFormat().resolvedOptions().timeZone);\n\n checkProxyEnv(report);\n\n return passed;\n}\n\nfunction checkConfig(config: OkxConfig, profile: string, report: Report): boolean {\n let passed = true;\n section(`Config (profile: ${profile})`);\n\n if (config.hasAuth) {\n ok(\"API key\", maskKey(config.apiKey));\n ok(\"Secret\", \"****\");\n ok(\"Passphrase\", \"****\");\n } else {\n fail(\"Credentials\", \"not configured\", [\n \"Set OKX_API_KEY, OKX_SECRET_KEY, OKX_PASSPHRASE env vars\",\n \"Or run: okx config init\",\n ]);\n passed = false;\n }\n ok(\"Demo mode\", String(config.demo));\n ok(\"Site\", config.site);\n ok(\"Base URL\", config.baseUrl);\n ok(\"Timeout\", `${config.timeoutMs}ms`);\n\n report.add(\"profile\", profile);\n report.add(\"site\", config.site);\n report.add(\"base\", config.baseUrl);\n report.add(\"auth\", config.hasAuth ? `true (key=${maskKey(config.apiKey)})` : \"false\");\n report.add(\"demo\", String(config.demo));\n report.add(\"timeout\", `${config.timeoutMs}ms`);\n\n return passed;\n}\n\nasync function checkTcpTls(\n hostname: string, port: number, protocol: string, report: Report,\n): Promise<boolean> {\n let passed = true;\n const tcpResult = await checkTcp(hostname, port);\n if (tcpResult.ok) {\n ok(\"TCP connect\", `port ${port} (${tcpResult.ms}ms)`);\n report.add(\"tcp\", `${port} OK (${tcpResult.ms}ms)`);\n } else {\n fail(\"TCP connect\", `port ${port} \\u2014 ${tcpResult.error}`, [\n \"Check firewall/proxy/VPN settings\",\n `Try: nc -zv ${hostname} ${port}`,\n ]);\n report.add(\"tcp\", `FAIL ${port} ${tcpResult.error} (${tcpResult.ms}ms)`);\n return false;\n }\n\n if (protocol === \"https:\") {\n const tlsResult = await checkTls(hostname, port);\n if (tlsResult.ok) {\n ok(\"TLS handshake\", `(${tlsResult.ms}ms)`);\n report.add(\"tls\", `OK (${tlsResult.ms}ms)`);\n } else {\n fail(\"TLS handshake\", tlsResult.error ?? \"failed\", [\n \"Check system certificates or proxy MITM settings\",\n ]);\n passed = false;\n report.add(\"tls\", `FAIL ${tlsResult.error} (${tlsResult.ms}ms)`);\n }\n }\n return passed;\n}\n\nasync function checkNetwork(config: OkxConfig, client: OkxRestClient, report: Report): Promise<boolean> {\n let passed = true;\n section(\"Network\");\n\n const url = new URL(config.baseUrl);\n const hostname = url.hostname;\n const defaultPort = url.protocol === \"https:\" ? 443 : 80;\n const port = url.port ? parseInt(url.port, 10) : defaultPort;\n\n const dnsResult = await checkDns(hostname);\n if (dnsResult.ok) {\n ok(\"DNS resolve\", `${hostname} \\u2192 ${dnsResult.ip} (${dnsResult.ms}ms)`);\n report.add(\"dns\", `${hostname} \\u2192 ${dnsResult.ip} (${dnsResult.ms}ms)`);\n } else {\n fail(\"DNS resolve\", `${hostname} \\u2014 ${dnsResult.error}`, [\n \"Check DNS settings or network connection\",\n `Try: nslookup ${hostname}`,\n ]);\n passed = false;\n report.add(\"dns\", `FAIL ${hostname} ${dnsResult.error} (${dnsResult.ms}ms)`);\n }\n\n if (dnsResult.ok) {\n const tcpTlsPassed = await checkTcpTls(hostname, port, url.protocol, report);\n if (!tcpTlsPassed) passed = false;\n }\n\n // Public API check\n const t0 = Date.now();\n try {\n await client.publicGet(\"/api/v5/public/time\");\n const ms = Date.now() - t0;\n ok(\"API /public/time\", `200 (${ms}ms)`);\n report.add(\"api\", `/public/time 200 (${ms}ms)`);\n } catch (e) {\n const ms = Date.now() - t0;\n const msg = e instanceof Error ? e.message : String(e);\n fail(\"API /public/time\", msg, [\n \"OKX API may be down or blocked in your network\",\n `Try: curl ${config.baseUrl}/api/v5/public/time`,\n ]);\n passed = false;\n report.add(\"api\", `FAIL /public/time ${msg} (${ms}ms)`);\n }\n\n return passed;\n}\n\nfunction getAuthHints(msg: string, baseUrl: string): string[] {\n const accountUrl = baseUrl.replace(/\\/+$/, \"\") + \"/account/my-api\";\n if (msg.includes(\"50111\") || msg.includes(\"Invalid OK-ACCESS-KEY\")) {\n return [\"API key is invalid or expired\", `Regenerate at ${accountUrl}`];\n }\n if (msg.includes(\"50112\") || msg.includes(\"Invalid Sign\")) {\n return [\"Secret key or passphrase may be wrong\", `Regenerate API key at ${accountUrl}`];\n }\n if (msg.includes(\"50113\")) {\n return [\"Passphrase is incorrect\"];\n }\n if (msg.includes(\"50100\")) {\n return [\"API key lacks required permissions\", `Update permissions at ${accountUrl}`];\n }\n return [\"Check API credentials and permissions\"];\n}\n\nasync function checkAuth(client: OkxRestClient, config: OkxConfig, report: Report): Promise<boolean> {\n if (!config.hasAuth) {\n report.add(\"auth_api\", \"skipped (no credentials)\");\n return true;\n }\n\n let passed = true;\n section(\"Authentication\");\n\n const t1 = Date.now();\n try {\n await client.privateGet(\"/api/v5/account/balance\");\n const ms = Date.now() - t1;\n ok(\"Account balance\", `200 (${ms}ms)`);\n if (config.demo) {\n ok(\"Demo header\", \"x-simulated-trading: 1\");\n }\n report.add(\"auth_api\", `/account/balance 200 (${ms}ms)`);\n } catch (e) {\n const ms = Date.now() - t1;\n const msg = e instanceof Error ? e.message : String(e);\n const hints = getAuthHints(msg, config.baseUrl);\n fail(\"Account balance\", msg, hints);\n passed = false;\n report.add(\"auth_api\", `FAIL /account/balance ${msg} (${ms}ms)`);\n }\n\n return passed;\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nexport interface DiagnoseOptions {\n mcp?: boolean;\n cli?: boolean;\n all?: boolean;\n output?: string;\n}\n\nexport async function cmdDiagnose(config: OkxConfig | undefined, profile: string, options: DiagnoseOptions = {}): Promise<void> {\n // --mcp only: run MCP server checks\n if (options.mcp && !options.all) {\n return cmdDiagnoseMcp({ output: options.output });\n }\n\n // --all: run CLI checks first, then MCP checks\n if (options.all) {\n await runCliChecks(config, profile, options.output);\n return cmdDiagnoseMcp({ output: options.output });\n }\n\n // --cli or no flag (default): run CLI/general checks only\n return runCliChecks(config, profile, options.output);\n}\n\nfunction checkConfigFile(report: Report): boolean {\n section(\"Config File\");\n const path = configFilePath();\n try {\n readFullConfig();\n ok(\"Config parse\", `${path} OK`);\n report.add(\"config_parse\", \"OK\");\n return true;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n fail(\"Config parse\", msg, [\n \"If passphrase contains special characters (# \\\\ \\\" '), wrap in quotes:\",\n \" Contains # \\\\ \\\" → passphrase = 'value'\",\n \" Contains ' → passphrase = \\\"value\\\"\",\n \" Contains both → passphrase = '''value'''\",\n \"Or re-run: okx config init\",\n ]);\n report.add(\"config_parse\", `FAIL ${msg}`);\n return false;\n }\n}\n\nasync function runCliChecks(config: OkxConfig | undefined, profile: string, outputPath?: string): Promise<void> {\n process.stdout.write(\"\\n OKX Trade CLI Diagnostics\\n\");\n process.stdout.write(\" \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\n\");\n\n const report = new Report();\n report.add(\"ts\", new Date().toISOString());\n\n const configFilePassed = checkConfigFile(report);\n const envPassed = checkEnvironment(report);\n\n if (!config) {\n // Config parse failed — skip remaining checks that need config\n fail(\"Config\", \"Could not load config (see Config File check above)\", []);\n report.add(\"result\", \"FAIL\");\n report.print();\n writeReportIfRequested(report, outputPath);\n process.exitCode = 1;\n return;\n }\n\n const cfgPassed = checkConfig(config, profile, report);\n const client = new OkxRestClient(config);\n const netPassed = await checkNetwork(config, client, report);\n const authPassed = await checkAuth(client, config, report);\n\n const allPassed = configFilePassed && envPassed && cfgPassed && netPassed && authPassed;\n\n // --- Result ---\n outputLine(\"\");\n if (allPassed) {\n outputLine(\" Result: All checks passed \\u2713\");\n } else {\n outputLine(\" Result: Some checks failed \\u2717\");\n process.exitCode = 1;\n }\n\n report.add(\"result\", allPassed ? \"PASS\" : \"FAIL\");\n report.print();\n\n writeReportIfRequested(report, outputPath);\n}\n","import fs from \"node:fs\";\n\nimport { createRequire } from \"node:module\";\nimport { output, outputLine, errorLine } from \"../formatter.js\";\n\nconst _require = createRequire(import.meta.url);\n\n// ---------------------------------------------------------------------------\n// Version helpers (shared between diagnose.ts and diagnose-mcp.ts)\n// ---------------------------------------------------------------------------\n\nexport function readCliVersion(): string {\n for (const rel of [\"../package.json\", \"../../package.json\"]) {\n try {\n return (_require(rel) as { version: string }).version;\n } catch (_err: unknown) {\n // Path not found in this layout (bundled vs source) — try next\n }\n }\n return \"0.0.0\";\n}\n\n// ---------------------------------------------------------------------------\n// Report collector — accumulates raw data for the copy-paste block\n// ---------------------------------------------------------------------------\n\nexport interface ReportLine { key: string; value: string }\n\nexport class Report {\n private lines: ReportLine[] = [];\n\n add(key: string, value: string): void {\n this.lines.push({ key, value });\n }\n\n print(): void {\n const sep = \"\\u2500\".repeat(52);\n outputLine(\"\");\n outputLine(` \\u2500\\u2500 Diagnostic Report (copy & share) ${sep.slice(35)}`);\n for (const { key, value } of this.lines) {\n outputLine(` ${key.padEnd(14)} ${value}`);\n }\n outputLine(` ${sep}`);\n outputLine(\"\");\n }\n\n /** Write report to a file path, returns true on success. */\n writeToFile(filePath: string): boolean {\n try {\n const sep = \"-\".repeat(52);\n const lines: string[] = [\n `-- Diagnostic Report (copy & share) ${sep.slice(35)}`,\n ];\n for (const { key, value } of this.lines) {\n lines.push(`${key.padEnd(14)} ${value}`);\n }\n lines.push(sep, \"\");\n fs.writeFileSync(filePath, lines.join(\"\\n\"), \"utf8\");\n return true;\n } catch (_e) {\n return false;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Display helpers\n// ---------------------------------------------------------------------------\n\nexport function ok(label: string, detail: string): void {\n outputLine(` \\u2713 ${label.padEnd(14)} ${detail}`);\n}\n\nexport function fail(label: string, detail: string, hints: string[]): void {\n outputLine(` \\u2717 ${label.padEnd(14)} ${detail}`);\n for (const hint of hints) {\n outputLine(` \\u2192 ${hint}`);\n }\n}\n\nexport function warn(label: string, detail: string, hints: string[] = []): void {\n outputLine(` \\u26a0 ${label.padEnd(14)} ${detail}`);\n for (const hint of hints) {\n outputLine(` \\u2192 ${hint}`);\n }\n}\n\nexport function section(title: string): void {\n outputLine(\"\");\n outputLine(` ${title}`);\n}\n\n// ---------------------------------------------------------------------------\n// Output file helper — shared between diagnose.ts and diagnose-mcp.ts\n// ---------------------------------------------------------------------------\n\nexport function writeReportIfRequested(report: Report, outputPath?: string): void {\n if (!outputPath) return;\n const written = report.writeToFile(outputPath);\n if (written) {\n outputLine(` Report saved to: ${outputPath}`);\n } else {\n errorLine(` Warning: failed to write report to: ${outputPath}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Sanitization — strip secrets / long hex / UUIDs before sharing\n// ---------------------------------------------------------------------------\n\nexport function sanitize(value: string): string {\n // UUID-like patterns (e.g. 550e8400-e29b-41d4-a716-446655440000)\n value = value.replace(\n /\\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\b/gi,\n \"****-uuid-****\",\n );\n // Long hex strings (32+ chars) — likely keys/tokens\n value = value.replace(/\\b[0-9a-f]{32,}\\b/gi, \"****hex****\");\n // Bearer/token patterns\n value = value.replace(/Bearer\\s+\\S{8,}/gi, \"Bearer ****\");\n return value;\n}\n","import { EOL } from \"node:os\";\n\n// ---------------------------------------------------------------------------\n// Output interface — defines the contract for any IO sink.\n// The default implementation writes to process.stdout/stderr.\n// Swap it out in tests or to redirect to a file.\n// ---------------------------------------------------------------------------\n\nexport interface CliOutput {\n out(message: string): void;\n err(message: string): void;\n}\n\nconst stdioOutput: CliOutput = {\n out: (message) => process.stdout.write(message),\n err: (message) => process.stderr.write(message),\n};\n\nlet activeOutput: CliOutput = stdioOutput;\n\nexport function setOutput(impl: CliOutput): void {\n activeOutput = impl;\n}\n\nexport function resetOutput(): void {\n activeOutput = stdioOutput;\n}\n\n// Emit a raw string to stdout. Use this when the message already\n// contains newlines (e.g. multi-line blocks, pre-formatted output).\nexport function output(message: string): void {\n activeOutput.out(message);\n}\n\n// Emit a raw string to stderr. Use this when the message already\n// contains newlines (e.g. multi-line blocks, pre-formatted output).\nexport function errorOutput(message: string): void {\n activeOutput.err(message);\n}\n\n// Emit a single line to stdout. Automatically appends the platform newline\n// (os.EOL) so callers never hard-code \"\\n\".\nexport function outputLine(message: string): void {\n activeOutput.out(message + EOL);\n}\n\n// Emit a single line to stderr. Automatically appends the platform newline\n// (os.EOL) so callers never hard-code \"\\n\".\nexport function errorLine(message: string): void {\n activeOutput.err(message + EOL);\n}\n\n// ---------------------------------------------------------------------------\n// Structured output helpers (always write to stdout)\n// ---------------------------------------------------------------------------\n\nexport function printJson(data: unknown): void {\n activeOutput.out(JSON.stringify(data, null, 2) + EOL);\n}\n\nexport function printTable(rows: Record<string, unknown>[]): void {\n if (rows.length === 0) {\n activeOutput.out(\"(no data)\" + EOL);\n return;\n }\n const keys = Object.keys(rows[0]);\n const widths = keys.map((k) =>\n Math.max(k.length, ...rows.map((r) => String(r[k] ?? \"\").length)),\n );\n const header = keys.map((k, i) => k.padEnd(widths[i])).join(\" \");\n const divider = widths.map((w) => \"-\".repeat(w)).join(\" \");\n activeOutput.out(header + EOL + divider + EOL);\n for (const row of rows) {\n activeOutput.out(keys.map((k, i) => String(row[k] ?? \"\").padEnd(widths[i])).join(\" \") + EOL);\n }\n}\n\nexport function printKv(obj: Record<string, unknown>, indent = 0): void {\n const pad = \" \".repeat(indent);\n for (const [k, v] of Object.entries(obj)) {\n if (v !== null && typeof v === \"object\" && !Array.isArray(v)) {\n activeOutput.out(`${pad}${k}:${EOL}`);\n printKv(v as Record<string, unknown>, indent + 2);\n } else {\n activeOutput.out(`${pad}${k.padEnd(20 - indent)} ${v}${EOL}`);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Exit-code helper\n// ---------------------------------------------------------------------------\n\n// OKX write endpoints return HTTP 200 with top-level code=\"0\" even when an\n// individual order is rejected (e.g. insufficient balance). The real per-item\n// result is in each element's `sCode` field (\"0\" = success, anything else =\n// business failure). This function detects that case and sets exit code 1 so\n// that callers (LLMs, scripts) can rely on exit code alone to detect failure.\nexport function markFailedIfSCodeError(data: unknown): void {\n // Read-only endpoints return plain arrays without sCode — skip them.\n if (!Array.isArray(data)) return;\n for (const item of data) {\n if (item !== null && typeof item === \"object\") {\n const sCode = (item as Record<string, unknown>)[\"sCode\"];\n // sCode absent → not a write-response item, ignore.\n // sCode \"0\" or 0 → success.\n // anything else → business failure (e.g. \"51008\" = insufficient balance).\n if (sCode !== undefined && sCode !== \"0\" && sCode !== 0) {\n process.exitCode = 1;\n return;\n }\n }\n }\n}\n","/**\n * MCP server diagnostics — `okx diagnose --mcp`\n *\n * All checks use Node.js built-ins only (no external dependencies).\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { spawnSync, spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n getConfigPath,\n allToolSpecs,\n CLIENT_NAMES,\n DEFAULT_MODULES,\n} from \"@agent-tradekit/core\";\nimport type { ClientId } from \"@agent-tradekit/core\";\nimport {\n Report,\n ok,\n fail,\n warn,\n section,\n sanitize,\n readCliVersion,\n writeReportIfRequested,\n} from \"./diagnose-utils.js\";\nimport { outputLine } from \"../formatter.js\";\n\nconst _require = createRequire(import.meta.url);\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// ---------------------------------------------------------------------------\n// Version helpers\n// ---------------------------------------------------------------------------\n\nfunction readMcpVersion(): string {\n // Try to read from the installed @okx_ai/okx-trade-mcp package\n const candidates = [\n // Installed as global or local dependency\n \"@okx_ai/okx-trade-mcp/package.json\",\n // Relative paths for monorepo dev layout\n \"../../../mcp/package.json\",\n \"../../../../packages/mcp/package.json\",\n ];\n for (const rel of candidates) {\n try {\n const pkg = _require(rel) as { version?: string };\n if (pkg.version) return pkg.version;\n } catch (_e) {\n // try next\n }\n }\n return \"(unknown)\";\n}\n\n// ---------------------------------------------------------------------------\n// Check helpers\n// ---------------------------------------------------------------------------\n\nfunction checkMcpPackageVersion(report: Report): void {\n section(\"MCP Package\");\n const mcpVersion = readMcpVersion();\n const cliVersion = readCliVersion();\n ok(\"MCP version\", mcpVersion);\n ok(\"CLI version\", cliVersion);\n report.add(\"mcp_ver\", mcpVersion);\n report.add(\"cli_ver\", cliVersion);\n}\n\nfunction checkNodeCompat(report: Report): boolean {\n section(\"Node.js Compatibility\");\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.slice(1), 10);\n if (nodeMajor >= 18) {\n ok(\"Node.js\", `${nodeVersion} (>= 18 required)`);\n report.add(\"node\", `${nodeVersion} OK`);\n return true;\n } else {\n fail(\"Node.js\", `${nodeVersion} (>= 18 required)`, [\"Upgrade Node.js to v18 or later\"]);\n report.add(\"node\", `${nodeVersion} FAIL`);\n return false;\n }\n}\n\nexport function checkMcpEntryPoint(report: Report): { entryPath: string | null; passed: boolean } {\n section(\"MCP Entry Point\");\n\n // Try to resolve the okx-trade-mcp binary\n let entryPath: string | null = null;\n\n // 1. Check PATH for the installed binary\n const which = spawnSync(process.platform === \"win32\" ? \"where\" : \"which\", [\"okx-trade-mcp\"], {\n encoding: \"utf8\",\n });\n if (which.status === 0 && which.stdout.trim()) {\n entryPath = which.stdout.trim().split(\"\\n\")[0].trim();\n }\n\n // 2. If not found in PATH, try common monorepo locations\n if (!entryPath) {\n const candidates = [\n // Installed locally\n path.join(process.cwd(), \"node_modules\", \".bin\", \"okx-trade-mcp\"),\n // Monorepo workspace (e.g. running from source)\n path.join(__dirname, \"..\", \"..\", \"..\", \"..\", \"mcp\", \"dist\", \"index.js\"),\n ];\n for (const candidate of candidates) {\n try {\n fs.accessSync(candidate, fs.constants.X_OK | fs.constants.R_OK);\n entryPath = candidate;\n break;\n } catch (_e) {\n // not found or not accessible — try next\n }\n }\n }\n\n if (entryPath) {\n ok(\"entry point\", entryPath);\n report.add(\"mcp_entry\", entryPath);\n return { entryPath, passed: true };\n } else {\n fail(\"entry point\", \"okx-trade-mcp not found in PATH\", [\n \"Install globally: npm install -g @okx_ai/okx-trade-mcp\",\n \"Or install locally and use npx okx-trade-mcp\",\n ]);\n report.add(\"mcp_entry\", \"NOT_FOUND\");\n return { entryPath: null, passed: false };\n }\n}\n\n/** Server name token used to detect okx-trade-mcp entries in any client config. */\nconst MCP_SERVER_NAME = \"okx-trade-mcp\";\n\n// ---------------------------------------------------------------------------\n// MCP client tool count limits (as of 2026-03)\n// Source: Cursor docs & community reports; update when clients change limits.\n// ---------------------------------------------------------------------------\nconst CLIENT_LIMITS: Partial<Record<ClientId, { perServer: number; total: number }>> = {\n cursor: { perServer: 40, total: 80 },\n};\n\n/**\n * Check if a JSON config file (mcpServers format) contains an okx-trade-mcp entry.\n * Returns \"found\" | \"not-configured\" | \"parse-error\" | \"missing\".\n */\nfunction checkJsonMcpConfig(configPath: string): \"found\" | \"not-configured\" | \"parse-error\" | \"missing\" {\n if (!fs.existsSync(configPath)) return \"missing\";\n try {\n const raw = fs.readFileSync(configPath, \"utf8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const mcpServers = parsed[\"mcpServers\"] as Record<string, unknown> | undefined;\n if (!mcpServers) return \"not-configured\";\n const entries = Object.entries(mcpServers);\n const found = entries.find(([name, v]) => {\n if (name.includes(MCP_SERVER_NAME)) return true;\n const val = v as Record<string, unknown>;\n const cmd = String(val[\"command\"] ?? \"\");\n const args = (val[\"args\"] as string[] | undefined) ?? [];\n return cmd.includes(MCP_SERVER_NAME) || args.some((a) => a.includes(MCP_SERVER_NAME));\n });\n return found ? \"found\" : \"not-configured\";\n } catch (_e) {\n return \"parse-error\";\n }\n}\n\n/**\n * Check Claude Code configuration by looking at ~/.claude/settings.json\n * and ~/.claude.json for mcpServers entries containing okx-trade-mcp.\n * Iterates all candidates: a parse error in one file does not prevent\n * checking the other.\n */\nfunction checkClaudeCodeConfig(): \"found\" | \"not-configured\" | \"parse-error\" | \"missing\" {\n const home = os.homedir();\n const candidates = [\n path.join(home, \".claude\", \"settings.json\"),\n path.join(home, \".claude.json\"),\n ];\n let anyFound = false;\n let anyParseError = false;\n for (const cfgPath of candidates) {\n if (!fs.existsSync(cfgPath)) continue;\n anyFound = true;\n const result = checkJsonMcpConfig(cfgPath);\n if (result === \"found\") return \"found\";\n if (result === \"parse-error\") anyParseError = true;\n }\n if (!anyFound) return \"missing\";\n if (anyParseError) return \"parse-error\";\n return \"not-configured\";\n}\n\n/**\n * Check all known MCP clients and return overall pass/fail and list of configured clients.\n * - Found + valid → ✓, added to configuredClients\n * - Found + invalid → ✗ with fix guidance\n * - Not found → skip (no output, no fail)\n * - At least one client configured → overall pass\n */\nexport function checkMcpClients(report: Report): { passed: boolean; configuredClients: ClientId[] } {\n section(\"MCP Client Config\");\n\n // Clients with JSON config files detectable globally\n const jsonClients: ClientId[] = [\"claude-desktop\", \"cursor\", \"windsurf\"];\n const configuredClients: ClientId[] = [];\n let anyFailed = false;\n\n for (const clientId of jsonClients) {\n const configPath = getConfigPath(clientId);\n if (!configPath) continue; // platform doesn't support this client\n\n const name = CLIENT_NAMES[clientId];\n const status = checkJsonMcpConfig(configPath);\n\n if (status === \"missing\") {\n // Client not installed — skip silently\n continue;\n }\n\n if (status === \"found\") {\n ok(name, `configured (${sanitize(configPath)})`);\n report.add(`client_${clientId}`, `OK ${sanitize(configPath)}`);\n configuredClients.push(clientId);\n } else if (status === \"not-configured\") {\n fail(name, \"okx-trade-mcp not found in mcpServers\", [\n `Run: okx setup --client ${clientId}`,\n ]);\n report.add(`client_${clientId}`, \"NOT_CONFIGURED\");\n anyFailed = true;\n } else {\n fail(name, `JSON parse error in ${sanitize(configPath)}`, [\n `Check ${sanitize(configPath)} for JSON syntax errors`,\n `Then run: okx setup --client ${clientId}`,\n ]);\n report.add(`client_${clientId}`, \"PARSE_ERROR\");\n anyFailed = true;\n }\n }\n\n // Claude Code — special handling (uses claude mcp add, config paths vary)\n // \"not-configured\" is treated as a warning rather than a failure: Claude Code may\n // be installed for other purposes and not used for OKX trading. Only a parse\n // error is counted as a failure.\n const claudeCodeStatus = checkClaudeCodeConfig();\n if (claudeCodeStatus !== \"missing\") {\n const name = CLIENT_NAMES[\"claude-code\"];\n if (claudeCodeStatus === \"found\") {\n ok(name, \"configured\");\n report.add(\"client_claude-code\", \"OK\");\n configuredClients.push(\"claude-code\");\n } else if (claudeCodeStatus === \"not-configured\") {\n warn(name, \"installed but okx-trade-mcp not configured\", [\n \"Run: okx setup --client claude-code\",\n ]);\n report.add(\"client_claude-code\", \"NOT_CONFIGURED\");\n // not set anyFailed — Claude Code may be used for other purposes\n } else {\n fail(name, \"settings file has JSON parse error\", [\n \"Run: okx setup --client claude-code\",\n ]);\n report.add(\"client_claude-code\", \"PARSE_ERROR\");\n anyFailed = true;\n }\n }\n\n // vscode is project-level — skip for global diagnose\n\n if (configuredClients.length === 0 && !anyFailed) {\n // No client config found at all\n fail(\"no client\", \"no MCP client configuration found\", [\n \"Run: okx setup --client <client>\",\n \"Supported clients: claude-desktop, cursor, windsurf, claude-code\",\n ]);\n report.add(\"client_cfg\", \"NONE_FOUND\");\n return { passed: false, configuredClients };\n }\n\n const passed = configuredClients.length > 0 && !anyFailed;\n report.add(\"client_cfg\", passed ? `OK (${configuredClients.join(\",\")})` : \"FAIL\");\n return { passed, configuredClients };\n}\n\n/**\n * Check tool count and warn if exceeding known client limits.\n * Tool count warnings do not affect overall pass/fail — they are advisory only.\n *\n * @param getSpecs - Optional override for retrieving tool specs (used in tests).\n */\nexport function checkToolCount(\n report: Report,\n configuredClients: ClientId[],\n getSpecs: () => ReturnType<typeof allToolSpecs> = allToolSpecs,\n): void {\n section(\"Tool Count\");\n\n const specs = getSpecs();\n const totalCount = specs.length;\n\n // Count tools for default modules (the suggested --modules set)\n const defaultModuleSet = new Set<string>(DEFAULT_MODULES);\n const defaultCount = specs.filter((s) => defaultModuleSet.has(s.module)).length;\n const defaultModulesArg = DEFAULT_MODULES.join(\",\");\n\n // Determine which limits apply based on configured clients\n const applicableLimits = configuredClients\n .map((id) => ({ id, limits: CLIENT_LIMITS[id] }))\n .filter((x): x is { id: ClientId; limits: { perServer: number; total: number } } => x.limits !== undefined);\n\n if (applicableLimits.length === 0) {\n // No clients with known limits — just report count\n ok(\"total tools\", `${totalCount} tools loaded`);\n report.add(\"tool_count\", `${totalCount}`);\n return;\n }\n\n // Check against each limit\n let anyExceeded = false;\n for (const { id, limits } of applicableLimits) {\n const name = CLIENT_NAMES[id];\n if (totalCount > limits.total) {\n warn(\n \"tool count\",\n `${totalCount} tools loaded — exceeds ${name} limit (${limits.total} total / ${limits.perServer} per server)`,\n [\n `Use --modules to reduce: okx-trade-mcp --modules ${defaultModulesArg} (${defaultCount} tools)`,\n ],\n );\n report.add(\"tool_count\", `${totalCount} EXCEEDS_${id.toUpperCase()}_LIMIT`);\n anyExceeded = true;\n } else if (totalCount > limits.perServer) {\n warn(\n \"tool count\",\n `${totalCount} tools loaded — exceeds ${name} per-server limit (${limits.perServer})`,\n [\n `Use --modules to reduce: okx-trade-mcp --modules ${defaultModulesArg} (${defaultCount} tools)`,\n ],\n );\n report.add(\"tool_count\", `${totalCount} EXCEEDS_${id.toUpperCase()}_PER_SERVER_LIMIT`);\n anyExceeded = true;\n }\n }\n\n if (!anyExceeded) {\n ok(\"total tools\", `${totalCount} tools loaded (within limits for all configured clients)`);\n report.add(\"tool_count\", `${totalCount} OK`);\n }\n}\n\n/**\n * Read the last 8 KB of a log file and return the last 5 non-empty lines.\n * Throws if the file does not exist or cannot be read.\n */\nfunction readLogTail(logPath: string): string[] {\n const stat = fs.statSync(logPath);\n const readSize = Math.min(8192, stat.size);\n const buffer = Buffer.alloc(readSize);\n const fd = fs.openSync(logPath, \"r\");\n try {\n fs.readSync(fd, buffer, 0, readSize, Math.max(0, stat.size - readSize));\n } finally {\n fs.closeSync(fd);\n }\n return buffer.toString(\"utf8\").split(\"\\n\").filter((l) => l.trim()).slice(-5);\n}\n\n/** Build the platform-specific list of MCP log file candidates. */\nfunction getMcpLogCandidates(): string[] {\n if (process.platform === \"darwin\") {\n const logsDir = path.join(os.homedir(), \"Library\", \"Logs\", \"Claude\");\n const candidates = [\n path.join(logsDir, \"mcp.log\"),\n path.join(logsDir, \"mcp-server-okx-trade-mcp.log\"),\n ];\n try {\n const extra = fs.readdirSync(logsDir)\n .filter((f) => f.startsWith(\"mcp\") && f.endsWith(\".log\"))\n .map((f) => path.join(logsDir, f));\n candidates.push(...extra);\n } catch (_e) {\n // logsDir not found or not readable — skip\n }\n return candidates;\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return [path.join(appData, \"Claude\", \"logs\", \"mcp.log\")];\n }\n // Linux — XDG\n const configHome = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\");\n return [path.join(configHome, \"Claude\", \"logs\", \"mcp.log\")];\n}\n\n/** Check recent MCP log lines (macOS-specific path, gracefully skipped elsewhere). */\nexport function checkMcpLogs(report: Report): void {\n section(\"MCP Server Logs (recent)\");\n\n const seen = new Set<string>();\n for (const logPath of getMcpLogCandidates()) {\n if (seen.has(logPath)) continue;\n seen.add(logPath);\n\n try {\n const lines = readLogTail(logPath);\n ok(\"log file\", logPath);\n report.add(\"mcp_log\", logPath);\n if (lines.length > 0) {\n ok(\"last lines\", `(${lines.length} shown)`);\n for (const line of lines) outputLine(` ${sanitize(line)}`);\n } else {\n ok(\"last lines\", \"(empty log)\");\n }\n return;\n } catch (_e) {\n // File does not exist or is unreadable — try next candidate\n }\n }\n\n ok(\"log file\", \"(not found — logs only appear after MCP server has been started)\");\n report.add(\"mcp_log\", \"not_found\");\n}\n\ninterface HandshakeResponse {\n ok: true; serverName: string; serverVer: string;\n}\ninterface HandshakeError {\n ok: false; errMsg: string;\n}\ntype ParsedHandshake = HandshakeResponse | HandshakeError | null;\n\n/**\n * Parse a single newline-delimited JSON-RPC line from the MCP server's stdout.\n * Returns a typed result when the line is a response to request id=1, or null\n * if the line is not yet actionable (startup noise, unrelated message, etc.).\n */\nfunction parseHandshakeResponse(line: string): ParsedHandshake {\n const trimmed = line.trim();\n if (!trimmed) return null;\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>;\n if (parsed[\"id\"] === 1 && parsed[\"result\"]) {\n const result = parsed[\"result\"] as Record<string, unknown>;\n const info = result[\"serverInfo\"] as Record<string, unknown> | undefined;\n return {\n ok: true,\n serverName: String(info?.[\"name\"] ?? \"MCP server\"),\n serverVer: String(info?.[\"version\"] ?? \"?\"),\n };\n }\n if (parsed[\"id\"] === 1 && parsed[\"error\"]) {\n const errMsg = (parsed[\"error\"] as Record<string, unknown>)[\"message\"] ?? \"unknown error\";\n return { ok: false, errMsg: String(errMsg) };\n }\n } catch (_e) {\n // not valid JSON — possibly startup noise, keep buffering\n }\n return null;\n}\n\n/** Perform a stdio handshake with the MCP server (spawn, send initialize, check response). */\nexport async function checkStdioHandshake(entryPath: string, report: Report): Promise<boolean> {\n section(\"stdio Handshake\");\n\n const TIMEOUT_MS = 5000;\n const initMessage = JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"initialize\",\n params: {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"okx-diagnose\", version: \"1.0\" },\n },\n });\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const settle = (passed: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(passed);\n };\n\n const child = spawn(process.execPath, [entryPath], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n const timer = setTimeout(() => {\n child.kill();\n fail(\"handshake\", `timed out after ${TIMEOUT_MS}ms`, [\n \"MCP server may be hanging on startup (check credentials/config)\",\n `Try: node ${entryPath} --help`,\n ]);\n report.add(\"handshake\", `TIMEOUT ${TIMEOUT_MS}ms`);\n settle(false);\n }, TIMEOUT_MS);\n\n child.on(\"error\", (err: Error) => {\n fail(\"handshake\", `spawn error: ${err.message}`, [\n `Ensure ${entryPath} is executable`,\n \"Check Node.js version compatibility\",\n ]);\n report.add(\"handshake\", `SPAWN_ERROR ${err.message}`);\n settle(false);\n });\n\n let responseBuffer = \"\";\n child.stdout.on(\"data\", (chunk: Buffer) => {\n responseBuffer += chunk.toString(\"utf8\");\n const lines = responseBuffer.split(\"\\n\");\n responseBuffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const parsed = parseHandshakeResponse(line);\n if (!parsed) continue;\n if (parsed.ok) {\n ok(\"handshake\", `OK — ${parsed.serverName} v${parsed.serverVer}`);\n report.add(\"handshake\", `OK ${parsed.serverName}@${parsed.serverVer}`);\n } else {\n fail(\"handshake\", `JSON-RPC error: ${parsed.errMsg}`, [\n \"MCP server returned an error during initialization\",\n ]);\n report.add(\"handshake\", `RPC_ERROR ${parsed.errMsg}`);\n }\n child.kill();\n settle(parsed.ok);\n return;\n }\n });\n\n child.stderr.on(\"data\", (_chunk: Buffer) => {\n // Ignore stderr output (MCP server logs to stderr normally)\n });\n\n // Send the initialize request\n try {\n child.stdin.write(initMessage + \"\\n\");\n } catch (_e) {\n fail(\"handshake\", \"failed to write to stdin\", [\"Check that MCP server accepts stdin\"]);\n report.add(\"handshake\", \"STDIN_WRITE_FAIL\");\n settle(false);\n }\n });\n}\n\n/** Check that the MCP module can be required without errors (module loading test). */\nexport function checkModuleLoading(entryPath: string | null, report: Report): boolean {\n section(\"Module Loading\");\n\n if (!entryPath) {\n ok(\"module load\", \"(skipped — entry point not found)\");\n report.add(\"module_load\", \"skipped\");\n return true;\n }\n\n // Try a quick --version call as a smoke test for module loading\n const result = spawnSync(process.execPath, [entryPath, \"--version\"], {\n encoding: \"utf8\",\n timeout: 5000,\n env: { ...process.env },\n });\n\n if (result.status === 0 && result.stdout.trim()) {\n ok(\"module load\", `version output: ${result.stdout.trim()}`);\n report.add(\"module_load\", `OK v${result.stdout.trim()}`);\n return true;\n } else {\n const errMsg = result.stderr?.trim() || result.error?.message || \"non-zero exit\";\n fail(\"module load\", `failed: ${sanitize(errMsg)}`, [\n \"MCP server may have import errors or missing dependencies\",\n `Try: node ${entryPath} --version`,\n ]);\n report.add(\"module_load\", `FAIL ${sanitize(errMsg)}`);\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface DiagnoseMcpOptions {\n output?: string;\n}\n\nexport async function cmdDiagnoseMcp(options: DiagnoseMcpOptions = {}): Promise<void> {\n outputLine(\"\");\n outputLine(\" OKX MCP Server Diagnostics\");\n outputLine(\" \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\");\n\n const report = new Report();\n report.add(\"ts\", new Date().toISOString());\n report.add(\"mode\", \"mcp\");\n report.add(\"os\", `${process.platform} ${process.arch} ${os.release()}`);\n\n checkMcpPackageVersion(report);\n const nodePassed = checkNodeCompat(report);\n const { entryPath, passed: entryPassed } = checkMcpEntryPoint(report);\n const { passed: cfgPassed, configuredClients } = checkMcpClients(report);\n checkMcpLogs(report);\n\n const moduleLoadPassed = checkModuleLoading(entryPath, report);\n\n // Tool count check — advisory only, does not affect pass/fail\n checkToolCount(report, configuredClients);\n\n let handshakePassed = false;\n if (entryPath && entryPassed && moduleLoadPassed) {\n handshakePassed = await checkStdioHandshake(entryPath, report);\n } else {\n section(\"stdio Handshake\");\n ok(\"handshake\", \"(skipped — entry point not available)\");\n report.add(\"handshake\", \"skipped\");\n handshakePassed = true; // don't count as failure if entry not found\n }\n\n const allPassed = nodePassed && entryPassed && cfgPassed && moduleLoadPassed && handshakePassed;\n\n // --- Result ---\n outputLine(\"\");\n if (allPassed) {\n outputLine(\" Result: All checks passed \\u2713\");\n } else {\n outputLine(\" Result: Some checks failed \\u2717\");\n process.exitCode = 1;\n }\n\n report.add(\"result\", allPassed ? \"PASS\" : \"FAIL\");\n report.print();\n\n writeReportIfRequested(report, options.output);\n}\n","import type { OkxConfig } from \"@agent-tradekit/core\";\nimport { loadConfig } from \"@agent-tradekit/core\";\n\nexport interface LoadProfileOptions {\n profile?: string;\n modules?: string;\n readOnly?: boolean;\n demo?: boolean;\n site?: string;\n userAgent?: string;\n sourceTag?: string;\n verbose?: boolean;\n}\n\n/**\n * Load config for CLI commands.\n * Delegates to core's loadConfig which handles the full priority chain:\n * env vars > ~/.okx/config.toml (selected profile) > defaults\n */\nexport function loadProfileConfig(opts: LoadProfileOptions): OkxConfig {\n return loadConfig({\n profile: opts.profile,\n modules: opts.modules,\n readOnly: opts.readOnly ?? false,\n demo: opts.demo ?? false,\n site: opts.site,\n userAgent: opts.userAgent,\n sourceTag: opts.sourceTag,\n verbose: opts.verbose,\n });\n}\n","import { EOL } from \"node:os\";\nimport { SUPPORTED_CLIENTS } from \"./commands/client-setup.js\";\nimport { configFilePath } from \"@agent-tradekit/core\";\nimport { output, outputLine, errorLine } from \"./formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Help tree data structures\n// ---------------------------------------------------------------------------\n\ninterface CommandInfo {\n /** Full usage line, e.g. \"okx bot grid create --instId <id> ...\" */\n usage: string;\n /** Short description of what the command does */\n description: string;\n}\n\ninterface GroupInfo {\n /** One-line description shown in parent overview */\n description: string;\n /** Optional direct usage line when the group has no sub-commands */\n usage?: string;\n /** Leaf commands within this group */\n commands?: Record<string, CommandInfo>;\n /** Nested sub-groups (e.g. bot → grid, spot → algo) */\n subgroups?: Record<string, GroupInfo>;\n}\n\ntype HelpTree = Record<string, GroupInfo>;\n\n// ---------------------------------------------------------------------------\n// Help data — descriptions are intentionally kept in sync with core ToolSpec\n// ---------------------------------------------------------------------------\n\nconst HELP_TREE: HelpTree = {\n market: {\n description: \"Market data (ticker, orderbook, candles, trades)\",\n commands: {\n ticker: {\n usage: \"okx market ticker <instId>\",\n description: \"Get latest ticker data for an instrument\",\n },\n tickers: {\n usage: \"okx market tickers <instType>\",\n description: \"Get all tickers for an instrument type (SPOT|SWAP|FUTURES|OPTION)\",\n },\n orderbook: {\n usage: \"okx market orderbook <instId> [--sz <n>]\",\n description: \"Get order book depth for an instrument\",\n },\n candles: {\n usage: \"okx market candles <instId> [--bar <bar>] [--limit <n>]\",\n description: \"Get candlestick (OHLCV) data\",\n },\n instruments: {\n usage: \"okx market instruments --instType <type> [--instId <id>]\",\n description: \"List tradable instruments of a given type\",\n },\n \"funding-rate\": {\n usage: \"okx market funding-rate <instId> [--history] [--limit <n>]\",\n description: \"Get current or historical funding rate for perpetual swaps\",\n },\n \"mark-price\": {\n usage: \"okx market mark-price --instType <MARGIN|SWAP|FUTURES|OPTION> [--instId <id>]\",\n description: \"Get mark price for instruments\",\n },\n trades: {\n usage: \"okx market trades <instId> [--limit <n>]\",\n description: \"Get recent trades for an instrument\",\n },\n \"index-ticker\": {\n usage: \"okx market index-ticker [--instId <id>] [--quoteCcy <ccy>]\",\n description: \"Get index ticker data\",\n },\n \"index-candles\": {\n usage: \"okx market index-candles <instId> [--bar <bar>] [--limit <n>] [--history]\",\n description: \"Get index candlestick data\",\n },\n \"price-limit\": {\n usage: \"okx market price-limit <instId>\",\n description: \"Get price limit for an instrument\",\n },\n \"open-interest\": {\n usage: \"okx market open-interest --instType <SWAP|FUTURES|OPTION> [--instId <id>]\",\n description: \"Get open interest for instruments\",\n },\n \"stock-tokens\": {\n usage: \"okx market stock-tokens [--instType <SPOT|SWAP>] [--instId <id>]\",\n description: \"List all stock token instruments (instCategory=3, e.g. AAPL-USDT-SWAP)\",\n },\n },\n },\n\n account: {\n description: \"Account balance, positions, bills, and configuration\",\n commands: {\n balance: {\n usage: \"okx account balance [<ccy>]\",\n description: \"Get trading account balance\",\n },\n \"asset-balance\": {\n usage: \"okx account asset-balance [--ccy <ccy>]\",\n description: \"Get funding account asset balance\",\n },\n positions: {\n usage: \"okx account positions [--instType <type>] [--instId <id>]\",\n description: \"Get current open positions\",\n },\n \"positions-history\": {\n usage: \"okx account positions-history [--instType <type>] [--instId <id>] [--limit <n>]\",\n description: \"Get historical positions\",\n },\n bills: {\n usage: \"okx account bills [--instType <type>] [--ccy <ccy>] [--limit <n>] [--archive]\",\n description: \"Get account bill history\",\n },\n fees: {\n usage: \"okx account fees --instType <type> [--instId <id>]\",\n description: \"Get trading fee rates\",\n },\n config: {\n usage: \"okx account config\",\n description: \"Get account configuration\",\n },\n \"set-position-mode\": {\n usage: \"okx account set-position-mode --posMode <long_short_mode|net_mode>\",\n description: \"Set position mode (long/short or net)\",\n },\n \"max-size\": {\n usage: \"okx account max-size --instId <id> --tdMode <cross|isolated> [--px <price>]\",\n description: \"Get maximum order size for an instrument\",\n },\n \"max-avail-size\": {\n usage: \"okx account max-avail-size --instId <id> --tdMode <cross|isolated|cash>\",\n description: \"Get maximum available tradable amount\",\n },\n \"max-withdrawal\": {\n usage: \"okx account max-withdrawal [--ccy <ccy>]\",\n description: \"Get maximum withdrawable amount\",\n },\n transfer: {\n usage: \"okx account transfer --ccy <ccy> --amt <n> --from <acct> --to <acct> [--transferType <0|1|2|3>]\",\n description: \"Transfer funds between accounts\",\n },\n audit: {\n usage: \"okx account audit [--tool <name>] [--since <ISO-date>] [--limit <n>]\",\n description: \"Audit account activity and tool call history\",\n },\n },\n },\n\n spot: {\n description: \"Spot trading (orders, algo orders)\",\n commands: {\n orders: {\n usage: \"okx spot orders [--instId <id>] [--history]\",\n description: \"List open or historical spot orders\",\n },\n get: {\n usage: \"okx spot get --instId <id> --ordId <id>\",\n description: \"Get details of a specific spot order\",\n },\n fills: {\n usage: \"okx spot fills [--instId <id>] [--ordId <id>]\",\n description: \"Get trade fill history for spot orders\",\n },\n place: {\n usage: \"okx spot place --instId <id> --side <buy|sell> --ordType <type> --sz <n> [--px <price>] [--tdMode <cash|cross|isolated>] [--tpTriggerPx <price>] [--tpOrdPx <price|-1>] [--slTriggerPx <price>] [--slOrdPx <price|-1>]\",\n description: \"Place a new spot order (supports attached TP/SL)\",\n },\n amend: {\n usage: \"okx spot amend --instId <id> --ordId <id> [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending spot order\",\n },\n cancel: {\n usage: \"okx spot cancel <instId> --ordId <id>\",\n description: \"Cancel a pending spot order\",\n },\n batch: {\n usage: \"okx spot batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel spot orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Spot algo orders (conditional, OCO, take-profit/stop-loss)\",\n commands: {\n orders: {\n usage: \"okx spot algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List spot algo orders\",\n },\n place: {\n usage: \"okx spot algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>] [--tdMode <cash|cross|isolated>]\",\n description: \"Place a spot algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx spot algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending spot algo order\",\n },\n cancel: {\n usage: \"okx spot algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending spot algo order\",\n },\n },\n },\n },\n },\n\n swap: {\n description: \"Perpetual swap trading (orders, algo orders)\",\n commands: {\n positions: {\n usage: \"okx swap positions [<instId>]\",\n description: \"Get current perpetual swap positions\",\n },\n orders: {\n usage: \"okx swap orders [--instId <id>] [--history] [--archive]\",\n description: \"List open or historical swap orders\",\n },\n get: {\n usage: \"okx swap get --instId <id> --ordId <id>\",\n description: \"Get details of a specific swap order\",\n },\n fills: {\n usage: \"okx swap fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for swap orders\",\n },\n place: {\n usage: \"okx swap place --instId <id> --side <buy|sell> --ordType <type> --sz <n> [--posSide <side>] [--px <price>] [--tdMode <cross|isolated>] [--tpTriggerPx <price>] [--tpOrdPx <price|-1>] [--slTriggerPx <price>] [--slOrdPx <price|-1>]\",\n description: \"Place a new perpetual swap order (supports attached TP/SL)\",\n },\n cancel: {\n usage: \"okx swap cancel <instId> --ordId <id>\",\n description: \"Cancel a pending swap order\",\n },\n amend: {\n usage: \"okx swap amend --instId <id> --ordId <id> [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending swap order\",\n },\n close: {\n usage: \"okx swap close --instId <id> --mgnMode <cross|isolated> [--posSide <net|long|short>] [--autoCxl]\",\n description: \"Close a swap position\",\n },\n leverage: {\n usage: \"okx swap leverage --instId <id> --lever <n> --mgnMode <cross|isolated> [--posSide <side>]\",\n description: \"Set leverage for a swap instrument\",\n },\n \"get-leverage\": {\n usage: \"okx swap get-leverage --instId <id> --mgnMode <cross|isolated>\",\n description: \"Get current leverage setting for a swap instrument\",\n },\n batch: {\n usage: \"okx swap batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel swap orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Perpetual swap algo orders (trailing stop, conditional, OCO)\",\n commands: {\n orders: {\n usage: \"okx swap algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List swap algo orders\",\n },\n trail: {\n usage: \"okx swap algo trail --instId <id> --side <buy|sell> --sz <n> --callbackRatio <ratio>\\n [--activePx <price>] [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a trailing stop algo order for perpetual swap\",\n },\n place: {\n usage: \"okx swap algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>]\\n [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a swap algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx swap algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending swap algo order\",\n },\n cancel: {\n usage: \"okx swap algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending swap algo order\",\n },\n },\n },\n },\n },\n\n futures: {\n description: \"Futures trading (orders, positions, algo orders, leverage)\",\n commands: {\n orders: {\n usage: \"okx futures orders [--instId <id>] [--history] [--archive]\",\n description: \"List open or historical futures orders\",\n },\n positions: {\n usage: \"okx futures positions [--instId <id>]\",\n description: \"Get current futures positions\",\n },\n fills: {\n usage: \"okx futures fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for futures orders\",\n },\n place: {\n usage: \"okx futures place --instId <id> --side <buy|sell> --ordType <type> --sz <n>\\n [--tdMode <cross|isolated>] [--posSide <net|long|short>] [--px <price>] [--reduceOnly]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>] [--slTriggerPx <price>] [--slOrdPx <price|-1>]\",\n description: \"Place a new futures order (supports attached TP/SL)\",\n },\n cancel: {\n usage: \"okx futures cancel <instId> --ordId <id>\",\n description: \"Cancel a pending futures order\",\n },\n amend: {\n usage: \"okx futures amend --instId <id> [--ordId <id>] [--clOrdId <id>] [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending futures order\",\n },\n get: {\n usage: \"okx futures get --instId <id> --ordId <id>\",\n description: \"Get details of a specific futures order\",\n },\n close: {\n usage: \"okx futures close --instId <id> --mgnMode <cross|isolated> [--posSide <net|long|short>] [--autoCxl]\",\n description: \"Close a futures position\",\n },\n \"get-leverage\": {\n usage: \"okx futures get-leverage --instId <id> --mgnMode <cross|isolated>\",\n description: \"Get current leverage for a futures instrument\",\n },\n leverage: {\n usage: \"okx futures leverage --instId <id> --lever <n> --mgnMode <cross|isolated> [--posSide <net|long|short>]\",\n description: \"Set leverage for a futures instrument\",\n },\n batch: {\n usage: \"okx futures batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel futures orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Futures algo orders (trailing stop, conditional, OCO)\",\n commands: {\n orders: {\n usage: \"okx futures algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List futures algo orders\",\n },\n trail: {\n usage: \"okx futures algo trail --instId <id> --side <buy|sell> --sz <n> --callbackRatio <ratio>\\n [--activePx <price>] [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a trailing stop algo order for futures\",\n },\n place: {\n usage: \"okx futures algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>]\\n [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a futures algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx futures algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending futures algo order\",\n },\n cancel: {\n usage: \"okx futures algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending futures algo order\",\n },\n },\n },\n },\n },\n\n option: {\n description: \"Options trading (orders, positions, greeks)\",\n commands: {\n orders: {\n usage: \"okx option orders [--instId <id>] [--uly <uly>] [--history] [--archive]\",\n description: \"List open or historical option orders\",\n },\n get: {\n usage: \"okx option get --instId <id> [--ordId <id>] [--clOrdId <id>]\",\n description: \"Get details of a specific option order\",\n },\n positions: {\n usage: \"okx option positions [--instId <id>] [--uly <uly>]\",\n description: \"Get current option positions\",\n },\n fills: {\n usage: \"okx option fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for option orders\",\n },\n instruments: {\n usage: \"okx option instruments --uly <uly> [--expTime <date>]\",\n description: \"List tradable option instruments for an underlying\",\n },\n greeks: {\n usage: \"okx option greeks --uly <uly> [--expTime <date>]\",\n description: \"Get option greeks (delta, gamma, theta, vega)\",\n },\n place: {\n usage: \"okx option place --instId <id> --tdMode <cash|cross|isolated> --side <buy|sell> --ordType <type> --sz <n>\\n [--px <price>] [--reduceOnly] [--clOrdId <id>]\",\n description: \"Place a new option order\",\n },\n cancel: {\n usage: \"okx option cancel --instId <id> [--ordId <id>] [--clOrdId <id>]\",\n description: \"Cancel a pending option order\",\n },\n amend: {\n usage: \"okx option amend --instId <id> [--ordId <id>] [--clOrdId <id>] [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending option order\",\n },\n \"batch-cancel\": {\n usage: \"okx option batch-cancel --orders '<json>'\",\n description: \"Batch cancel option orders\",\n },\n },\n },\n\n earn: {\n description: \"Earn products — Simple Earn, On-chain Earn, and DCD (Dual Currency Deposit)\",\n subgroups: {\n savings: {\n description: \"Simple Earn — flexible savings and lending\",\n commands: {\n balance: {\n usage: \"okx earn savings balance [<ccy>]\",\n description: \"Get savings balance (optionally filter by currency)\",\n },\n purchase: {\n usage: \"okx earn savings purchase --ccy <ccy> --amt <n> [--rate <rate>]\",\n description: \"Purchase Simple Earn (flexible savings). Rate defaults to 0.01 (1%)\",\n },\n redeem: {\n usage: \"okx earn savings redeem --ccy <ccy> --amt <n>\",\n description: \"Redeem Simple Earn (flexible savings)\",\n },\n \"set-rate\": {\n usage: \"okx earn savings set-rate --ccy <ccy> --rate <rate>\",\n description: \"Set lending rate for a currency\",\n },\n \"lending-history\": {\n usage: \"okx earn savings lending-history [--ccy <ccy>] [--limit <n>]\",\n description: \"Get personal lending records (requires auth)\",\n },\n \"rate-history\": {\n usage: \"okx earn savings rate-history [--ccy <ccy>] [--limit <n>]\",\n description: \"Query Simple Earn lending rates (public, no auth needed)\",\n },\n },\n },\n onchain: {\n description: \"On-chain Earn — staking and DeFi products\",\n commands: {\n offers: {\n usage: \"okx earn onchain offers [--productId <id>] [--protocolType <type>] [--ccy <ccy>]\",\n description: \"Browse available on-chain earn products (staking, DeFi)\",\n },\n purchase: {\n usage: \"okx earn onchain purchase --productId <id> --ccy <ccy> --amt <n> [--term <term>] [--tag <tag>]\",\n description: \"Purchase an on-chain earn product (stake/deposit)\",\n },\n redeem: {\n usage: \"okx earn onchain redeem --ordId <id> --protocolType <type> [--allowEarlyRedeem]\",\n description: \"Redeem an on-chain earn position\",\n },\n cancel: {\n usage: \"okx earn onchain cancel --ordId <id> --protocolType <type>\",\n description: \"Cancel a pending on-chain earn order\",\n },\n orders: {\n usage: \"okx earn onchain orders [--productId <id>] [--protocolType <type>] [--ccy <ccy>] [--state <state>]\",\n description: \"List active on-chain earn orders\",\n },\n history: {\n usage: \"okx earn onchain history [--productId <id>] [--protocolType <type>] [--ccy <ccy>]\",\n description: \"Get on-chain earn order history\",\n },\n },\n },\n \"auto-earn\": {\n description: \"Auto-earn — automatically lend, stake, or earn on idle assets\",\n commands: {\n status: {\n usage: \"okx earn auto-earn status [<ccy>]\",\n description: \"Query auto-earn status for all or a specific currency\",\n },\n on: {\n usage: \"okx earn auto-earn on <ccy>\",\n description: \"Enable auto-earn for a currency (auto-detects lend/stake vs USDG earn)\",\n },\n off: {\n usage: \"okx earn auto-earn off <ccy>\",\n description: \"Disable auto-earn for a currency\",\n },\n },\n },\n dcd: {\n description: \"DCD (Dual Currency Deposit) — structured products with fixed yield\",\n commands: {\n pairs: {\n usage: \"okx earn dcd pairs\",\n description: \"List available DCD currency pairs\",\n },\n products: {\n usage: \"okx earn dcd products --baseCcy <ccy> --quoteCcy <ccy> --optType <C|P>\\n [--minYield <n>] [--strikeNear <price>]\\n [--termDays <n>] [--minTermDays <n>] [--maxTermDays <n>]\\n [--expDate <YYYY-MM-DD|YYYY-MM-DDTHH:mm>]\",\n description: \"List active DCD products (baseCcy, quoteCcy, optType required). Client-side filters: minYield (e.g. 0.05=5%), strikeNear (±10%), term range, expDate\",\n },\n \"quote-and-buy\": {\n usage: \"okx earn dcd quote-and-buy --productId <id> --sz <n> --notionalCcy <ccy> [--clOrdId <id>] [--minAnnualizedYield <pct>]\",\n description: \"[CAUTION] Subscribe to a DCD product atomically (quote + execute in one step)\",\n },\n \"redeem-execute\": {\n usage: \"okx earn dcd redeem-execute --ordId <id>\",\n description: \"[CAUTION] Re-quote and execute early redemption in one step (recommended for AI agent use)\",\n },\n order: {\n usage: \"okx earn dcd order --ordId <id>\",\n description: \"Query current state of a DCD order\",\n },\n orders: {\n usage: \"okx earn dcd orders [--ordId <id>] [--productId <id>] [--uly <uly>] [--state <state>] [--limit <n>]\",\n description: \"Get DCD order history. State: initial|live|pending_settle|settled|pending_redeem|redeemed|rejected\",\n },\n },\n },\n },\n },\n\n bot: {\n description: \"Trading bot strategies (grid, dca)\",\n subgroups: {\n grid: {\n description: \"Grid trading bot — create, monitor, and stop grid orders\",\n commands: {\n orders: {\n usage: \"okx bot grid orders --algoOrdType <grid|contract_grid|moon_grid> [--instId <id>] [--algoId <id>] [--history]\",\n description: \"List active or historical grid bot orders\",\n },\n details: {\n usage: \"okx bot grid details --algoOrdType <type> --algoId <id>\",\n description: \"Get details of a specific grid bot order\",\n },\n \"sub-orders\": {\n usage: \"okx bot grid sub-orders --algoOrdType <type> --algoId <id> [--live]\",\n description: \"List sub-orders of a grid bot (filled or live)\",\n },\n create: {\n usage: \"okx bot grid create --instId <id> --algoOrdType <grid|contract_grid> --maxPx <px> --minPx <px> --gridNum <n>\\n [--runType <1|2>] [--quoteSz <n>] [--baseSz <n>]\\n [--direction <long|short|neutral>] [--lever <n>] [--sz <n>] [--basePos] [--no-basePos]\\n [--tpTriggerPx <px>] [--slTriggerPx <px>] [--tpRatio <n>] [--slRatio <n>] [--algoClOrdId <id>]\",\n description: \"Create a new grid bot order (contract grid opens base position by default)\",\n },\n stop: {\n usage: \"okx bot grid stop --algoId <id> --algoOrdType <type> --instId <id> [--stopType <1|2|3|5|6>]\",\n description: \"Stop a running grid bot order\",\n },\n },\n },\n dca: {\n description: \"DCA (Martingale) bot — spot or contract recurring buys\",\n commands: {\n orders: {\n usage: \"okx bot dca orders [--algoOrdType <spot_dca|contract_dca>] [--algoId <id>] [--instId <id>] [--history]\",\n description: \"List DCA bots (spot and/or contract)\",\n },\n details: {\n usage: \"okx bot dca details --algoOrdType <spot_dca|contract_dca> --algoId <id>\",\n description: \"Get DCA bot details (spot or contract)\",\n },\n \"sub-orders\": {\n usage: \"okx bot dca sub-orders --algoOrdType <spot_dca|contract_dca> --algoId <id> [--cycleId <id>]\",\n description: \"Get DCA cycles/orders (spot or contract)\",\n },\n create: {\n usage: \"okx bot dca create --algoOrdType <spot_dca|contract_dca> --instId <id> --direction <long|short>\\n --initOrdAmt <n> --maxSafetyOrds <n> --tpPct <n>\\n [--lever <n>] [--safetyOrdAmt <n>] [--pxSteps <n>] [--pxStepsMult <n>] [--volMult <n>]\\n [--slPct <n>] [--slMode <limit|market>] [--allowReinvest <true|false>]\\n [--triggerStrategy <instant|price|rsi>] [--triggerPx <price>]\\n [--triggerCond <cross_up|cross_down>] [--thold <n>] [--timeframe <tf>] [--timePeriod <n>]\\n [--algoClOrdId <id>] [--reserveFunds <true|false>] [--tradeQuoteCcy <ccy>]\\n Note: --lever required for contract_dca; safetyOrdAmt, pxSteps, pxStepsMult, volMult required when maxSafetyOrds > 0\\n triggerStrategy: contract_dca supports instant|price|rsi; spot_dca supports instant|rsi\",\n description: \"Create a DCA (Martingale) bot (spot or contract)\",\n },\n stop: {\n usage: \"okx bot dca stop --algoOrdType <spot_dca|contract_dca> --algoId <id> [--stopType <1|2>]\\n Note: --stopType required for spot_dca (1=sell all, 2=keep tokens)\",\n description: \"Stop a DCA bot (spot or contract)\",\n },\n },\n },\n },\n },\n\n config: {\n description: \"Manage CLI configuration profiles\",\n commands: {\n init: {\n usage: \"okx config init [--lang zh]\",\n description: \"Initialize a new configuration profile interactively\",\n },\n show: {\n usage: \"okx config show\",\n description: `Show current configuration (file: ${configFilePath()})`,\n },\n set: {\n usage: \"okx config set <key> <value>\",\n description: \"Set a configuration value\",\n },\n \"setup-clients\": {\n usage: \"okx config setup-clients\",\n description: \"Set up MCP client integrations (Cursor, Windsurf, etc.)\",\n },\n },\n },\n\n setup: {\n description: \"Set up client integrations (Cursor, Windsurf, Claude, etc.)\",\n usage: `okx setup --client <${SUPPORTED_CLIENTS.join(\"|\")}> [--profile <name>] [--modules <list>]`,\n },\n\n diagnose: {\n description: \"Run network / MCP server diagnostics\",\n usage: \"okx diagnose [--cli | --mcp | --all] [--profile <name>] [--demo] [--output <file>]\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Rendering helpers\n// ---------------------------------------------------------------------------\n\n/** Render the global overview (no path arguments). */\nfunction printGlobalHelp(): void {\n const lines: string[] = [\n \"\",\n `Usage: okx [--profile <name>] [--demo] [--json] <module> <action> [args...]`,\n \"\",\n \"Global Options:\",\n ` --profile <name> Use a named profile from ${configFilePath()}`,\n \" --demo Use simulated trading (demo) mode\",\n \" --json Output raw JSON\",\n \" --verbose Show detailed network request/response info (stderr)\",\n \" --version, -v Show version\",\n \" --help Show this help\",\n \"\",\n \"Modules:\",\n ];\n\n const colWidth = 12;\n for (const [name, group] of Object.entries(HELP_TREE)) {\n lines.push(` ${name.padEnd(colWidth)}${group.description}`);\n }\n\n lines.push(\"\", 'Run \"okx <module> --help\" for module details.', \"\");\n output(lines.join(EOL));\n}\n\n/** Render module-level help (one path argument, e.g. \"spot\"). */\nfunction printModuleHelp(moduleName: string): void {\n const group = HELP_TREE[moduleName];\n if (!group) {\n errorLine(`Unknown module: ${moduleName}`);\n process.exitCode = 1;\n return;\n }\n\n const hasSubgroups = group.subgroups && Object.keys(group.subgroups).length > 0;\n const hasCommands = group.commands && Object.keys(group.commands).length > 0;\n\n const lines: string[] = [\"\"];\n\n if (hasSubgroups && !hasCommands) {\n // Pure subgroup module (e.g. bot)\n const subgroupNames = Object.keys(group.subgroups!);\n lines.push(`Usage: okx ${moduleName} <strategy> <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\");\n lines.push(\"Strategies:\");\n const colWidth = Math.max(...subgroupNames.map((n) => n.length)) + 4;\n for (const [sgName, sg] of Object.entries(group.subgroups!)) {\n lines.push(` ${sgName.padEnd(colWidth)}${sg.description}`);\n }\n lines.push(\"\", `Run \"okx ${moduleName} <strategy> --help\" for details.`);\n } else if (hasSubgroups && hasCommands) {\n // Mixed: has both direct commands and subgroups (e.g. spot, swap)\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n lines.push(\"\", \"Subgroups:\");\n const subgroupEntries = Object.entries(group.subgroups!);\n const colWidth = Math.max(...subgroupEntries.map(([n]) => n.length)) + 4;\n for (const [sgName, sg] of subgroupEntries) {\n lines.push(` ${sgName.padEnd(colWidth)}${sg.description}`);\n }\n lines.push(\"\", `Run \"okx ${moduleName} <subgroup> --help\" for subgroup details.`);\n } else if (hasCommands) {\n // Plain module with direct commands only (e.g. market, account)\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n } else if (group.usage) {\n // Module with no sub-commands (e.g. setup)\n lines.push(`Usage: ${group.usage}`);\n lines.push(\"\", `${group.description}.`);\n if (group.commands) {\n lines.push(\"\");\n for (const cmd of Object.values(group.commands)) {\n lines.push(` ${cmd.description}`);\n lines.push(` Usage: ${cmd.usage}`);\n }\n }\n }\n\n lines.push(\"\");\n output(lines.join(EOL));\n}\n\n/** Render subgroup-level help (two path arguments, e.g. \"bot\", \"grid\"). */\nfunction printSubgroupHelp(moduleName: string, subgroupName: string): void {\n const group = HELP_TREE[moduleName];\n if (!group) {\n errorLine(`Unknown module: ${moduleName}`);\n process.exitCode = 1;\n return;\n }\n const subgroup = group.subgroups?.[subgroupName];\n if (!subgroup) {\n errorLine(`Unknown subgroup: ${moduleName} ${subgroupName}`);\n process.exitCode = 1;\n return;\n }\n\n const lines: string[] = [\n \"\",\n `Usage: okx ${moduleName} ${subgroupName} <action> [args...]`,\n \"\",\n `${subgroup.description}.`,\n \"\",\n \"Commands:\",\n ];\n\n if (subgroup.commands) {\n printCommandList(lines, subgroup.commands);\n }\n\n lines.push(\"\");\n output(lines.join(EOL));\n}\n\n/** Append a formatted command list to the lines array. */\nfunction printCommandList(lines: string[], commands: Record<string, CommandInfo>): void {\n const names = Object.keys(commands);\n const colWidth = Math.max(...names.map((n) => n.length)) + 4;\n\n for (const [name, cmd] of Object.entries(commands)) {\n lines.push(` ${name.padEnd(colWidth)}${cmd.description}`);\n // Indent usage lines to align with the description column\n const usageLines = cmd.usage.split(\"\\n\");\n lines.push(` ${\" \".repeat(colWidth)}Usage: ${usageLines[0]}`);\n for (const extra of usageLines.slice(1)) {\n lines.push(` ${\" \".repeat(colWidth)} ${extra.trimStart()}`);\n }\n lines.push(\"\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Print help text to stdout.\n *\n * - `printHelp()` — global module overview\n * - `printHelp(\"market\")` — module detail with all commands\n * - `printHelp(\"bot\")` — module overview listing sub-strategies\n * - `printHelp(\"bot\", \"grid\")` — subgroup detail with all commands\n * - `printHelp(\"spot\", \"algo\")` — subgroup detail with all commands\n */\nexport function printHelp(...path: string[]): void {\n const [moduleName, subgroupName] = path;\n if (!moduleName) {\n printGlobalHelp();\n } else if (!subgroupName) {\n printModuleHelp(moduleName);\n } else {\n printSubgroupHelp(moduleName, subgroupName);\n }\n}\n","import * as fs from \"node:fs\";\nimport { runSetup, printSetupUsage, getConfigPath, SUPPORTED_CLIENTS } from \"@agent-tradekit/core\";\nimport { outputLine } from \"../formatter.js\";\nimport type { ClientId, SetupOptions } from \"@agent-tradekit/core\";\n\nexport type { ClientId, SetupOptions };\nexport { runSetup, printSetupUsage, SUPPORTED_CLIENTS };\n\n/** Clients whose config files can be auto-detected on disk. */\nconst DETECTABLE_CLIENTS: ClientId[] = [\"claude-desktop\", \"cursor\", \"windsurf\"];\n\n/**\n * Non-interactive setup for a specific client.\n */\nexport function cmdSetupClient(options: SetupOptions): void {\n runSetup(options);\n}\n\n/**\n * Auto-detect installed clients and print what was found.\n * Kept for backward compatibility with `okx config setup-clients`.\n */\nexport function cmdSetupClients(): void {\n const detected: { id: ClientId; path: string }[] = [];\n for (const id of DETECTABLE_CLIENTS) {\n const p = getConfigPath(id);\n if (p && fs.existsSync(p)) {\n detected.push({ id, path: p });\n }\n }\n\n if (detected.length > 0) {\n outputLine(\"Detected clients:\");\n for (const { id, path } of detected) {\n outputLine(` ${id.padEnd(16)} ${path}`);\n }\n outputLine(\"\");\n }\n\n printSetupUsage();\n}\n","import { parseArgs } from \"node:util\";\n\nexport interface CliValues {\n profile?: string;\n demo?: boolean;\n json?: boolean;\n help?: boolean;\n version?: boolean;\n client?: string;\n modules?: string;\n bar?: string;\n limit?: string;\n sz?: string;\n instId?: string;\n history?: boolean;\n ordId?: string;\n side?: string;\n ordType?: string;\n px?: string;\n posSide?: string;\n tdMode?: string;\n tgtCcy?: string;\n lever?: string;\n mgnMode?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n algoId?: string;\n reduceOnly?: boolean;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n algoOrdType?: string;\n gridNum?: string;\n maxPx?: string;\n minPx?: string;\n runType?: string;\n quoteSz?: string;\n baseSz?: string;\n direction?: string;\n basePos?: boolean;\n tpRatio?: string;\n slRatio?: string;\n algoClOrdId?: string;\n stopType?: string;\n live?: boolean;\n instType?: string;\n quoteCcy?: string;\n archive?: boolean;\n posMode?: string;\n ccy?: string;\n from?: string;\n to?: string;\n transferType?: string;\n subAcct?: string;\n amt?: string;\n autoCxl?: boolean;\n clOrdId?: string;\n newPx?: string;\n // dca bot (spot & contract)\n initOrdAmt?: string;\n safetyOrdAmt?: string;\n maxSafetyOrds?: string;\n pxSteps?: string;\n pxStepsMult?: string;\n volMult?: string;\n tpPct?: string;\n slPct?: string;\n slMode?: string;\n allowReinvest?: string;\n triggerStrategy?: string;\n triggerPx?: string;\n triggerCond?: string;\n thold?: string;\n timeframe?: string;\n timePeriod?: string;\n cycleId?: string;\n reserveFunds?: string;\n tradeQuoteCcy?: string;\n lang?: string;\n // option\n uly?: string;\n expTime?: string;\n // batch\n action?: string;\n orders?: string;\n // earn\n rate?: string;\n // audit\n since?: string;\n tool?: string;\n // config profile\n force?: boolean;\n // onchain-earn\n productId?: string;\n protocolType?: string;\n term?: string;\n tag?: string;\n allowEarlyRedeem?: boolean;\n state?: string;\n // dcd\n quoteId?: string;\n notionalCcy?: string;\n optType?: string;\n baseCcy?: string;\n beginId?: string;\n endId?: string;\n begin?: string;\n end?: string;\n minYield?: string;\n strikeNear?: string;\n termDays?: string;\n minTermDays?: string;\n maxTermDays?: string;\n expDate?: string;\n minAnnualizedYield?: string;\n // indicator\n params?: string;\n list?: boolean;\n \"backtest-time\"?: string;\n // diagnostics (diagnose-specific flags)\n verbose?: boolean;\n mcp?: boolean; // diagnose --mcp: run MCP server checks only\n cli?: boolean; // diagnose --cli: run CLI/general checks only (explicit alias for default)\n all?: boolean; // diagnose --all: run CLI checks then MCP checks\n output?: string; // diagnose --output: save diagnostic report to file\n}\n\nexport const CLI_OPTIONS = {\n profile: { type: \"string\" },\n demo: { type: \"boolean\", default: false },\n json: { type: \"boolean\", default: false },\n help: { type: \"boolean\", default: false },\n version: { type: \"boolean\", short: \"v\", default: false },\n // setup command\n client: { type: \"string\" },\n modules: { type: \"string\" },\n // market candles\n bar: { type: \"string\" },\n limit: { type: \"string\" },\n sz: { type: \"string\" },\n // orders\n instId: { type: \"string\" },\n history: { type: \"boolean\", default: false },\n ordId: { type: \"string\" },\n // trade\n side: { type: \"string\" },\n ordType: { type: \"string\" },\n px: { type: \"string\" },\n posSide: { type: \"string\" },\n tdMode: { type: \"string\" },\n tgtCcy: { type: \"string\" },\n // leverage\n lever: { type: \"string\" },\n mgnMode: { type: \"string\" },\n // algo orders\n tpTriggerPx: { type: \"string\" },\n tpOrdPx: { type: \"string\" },\n slTriggerPx: { type: \"string\" },\n slOrdPx: { type: \"string\" },\n algoId: { type: \"string\" },\n reduceOnly: { type: \"boolean\", default: false },\n // algo amend\n newSz: { type: \"string\" },\n newTpTriggerPx: { type: \"string\" },\n newTpOrdPx: { type: \"string\" },\n newSlTriggerPx: { type: \"string\" },\n newSlOrdPx: { type: \"string\" },\n // trailing stop\n callbackRatio: { type: \"string\" },\n callbackSpread: { type: \"string\" },\n activePx: { type: \"string\" },\n // grid bot\n algoOrdType: { type: \"string\" },\n gridNum: { type: \"string\" },\n maxPx: { type: \"string\" },\n minPx: { type: \"string\" },\n runType: { type: \"string\" },\n quoteSz: { type: \"string\" },\n baseSz: { type: \"string\" },\n direction: { type: \"string\" },\n basePos: { type: \"boolean\", default: true },\n tpRatio: { type: \"string\" },\n slRatio: { type: \"string\" },\n algoClOrdId: { type: \"string\" },\n stopType: { type: \"string\" },\n live: { type: \"boolean\", default: false },\n // market extras\n instType: { type: \"string\" },\n quoteCcy: { type: \"string\" },\n // account extras\n archive: { type: \"boolean\", default: false },\n posMode: { type: \"string\" },\n ccy: { type: \"string\" },\n from: { type: \"string\" },\n to: { type: \"string\" },\n transferType: { type: \"string\" },\n subAcct: { type: \"string\" },\n amt: { type: \"string\" },\n // swap/order extras\n autoCxl: { type: \"boolean\", default: false },\n clOrdId: { type: \"string\" },\n newPx: { type: \"string\" },\n // dca bot (spot & contract)\n initOrdAmt: { type: \"string\" },\n safetyOrdAmt: { type: \"string\" },\n maxSafetyOrds: { type: \"string\" },\n pxSteps: { type: \"string\" },\n pxStepsMult: { type: \"string\" },\n volMult: { type: \"string\" },\n tpPct: { type: \"string\" },\n slPct: { type: \"string\" },\n slMode: { type: \"string\" },\n allowReinvest: { type: \"string\" },\n triggerStrategy: { type: \"string\" },\n triggerPx: { type: \"string\" },\n triggerCond: { type: \"string\" },\n thold: { type: \"string\" },\n timeframe: { type: \"string\" },\n timePeriod: { type: \"string\" },\n cycleId: { type: \"string\" },\n reserveFunds: { type: \"string\" },\n tradeQuoteCcy: { type: \"string\" },\n // i18n\n lang: { type: \"string\" },\n // option\n uly: { type: \"string\" },\n expTime: { type: \"string\" },\n // batch\n action: { type: \"string\" },\n orders: { type: \"string\" },\n // earn\n rate: { type: \"string\" },\n // audit\n since: { type: \"string\" },\n tool: { type: \"string\" },\n // config profile\n force: { type: \"boolean\", default: false },\n // onchain-earn\n productId: { type: \"string\" },\n protocolType: { type: \"string\" },\n term: { type: \"string\" },\n tag: { type: \"string\" },\n allowEarlyRedeem: { type: \"boolean\", default: false },\n state: { type: \"string\" },\n // dcd\n quoteId: { type: \"string\" },\n notionalCcy: { type: \"string\" },\n optType: { type: \"string\" },\n baseCcy: { type: \"string\" },\n beginId: { type: \"string\" },\n endId: { type: \"string\" },\n begin: { type: \"string\" },\n end: { type: \"string\" },\n minYield: { type: \"string\" },\n strikeNear: { type: \"string\" },\n termDays: { type: \"string\" },\n minTermDays: { type: \"string\" },\n maxTermDays: { type: \"string\" },\n expDate: { type: \"string\" },\n minAnnualizedYield: { type: \"string\" },\n // indicator\n params: { type: \"string\" },\n list: { type: \"boolean\", default: false },\n \"backtest-time\": { type: \"string\" },\n // diagnostics — cli/mcp/all/output are diagnose-specific; verbose is shared\n verbose: { type: \"boolean\", default: false },\n mcp: { type: \"boolean\", default: false }, // diagnose --mcp only: MCP server checks\n cli: { type: \"boolean\", default: false }, // diagnose --cli only: CLI/general checks (explicit alias for default)\n all: { type: \"boolean\", default: false }, // diagnose --all: run both CLI and MCP checks\n output: { type: \"string\" }, // diagnose --output only: save report to file\n} as const;\n\nexport function parseCli(argv: string[]): { values: CliValues; positionals: string[] } {\n // Pre-process --no-<flag> for boolean options (parseArgs doesn't support negation natively)\n const negated = new Set<string>();\n const filtered = argv.filter((arg) => {\n if (arg.startsWith(\"--no-\")) {\n const key = arg.slice(5);\n if (key in CLI_OPTIONS && (CLI_OPTIONS as Record<string, { type: string }>)[key].type === \"boolean\") {\n negated.add(key);\n return false;\n }\n }\n return true;\n });\n\n const { values, positionals } = parseArgs({\n args: filtered,\n options: CLI_OPTIONS,\n allowPositionals: true,\n });\n\n for (const key of negated) {\n (values as Record<string, unknown>)[key] = false;\n }\n\n return { values: values as CliValues, positionals };\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, printJson, printKv, printTable } from \"../formatter.js\";\nimport { resolveIndicatorCode } from \"@agent-tradekit/core\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdMarketInstruments(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_instruments\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).slice(0, 50).map((t) => ({\n instId: t[\"instId\"],\n ctVal: t[\"ctVal\"],\n lotSz: t[\"lotSz\"],\n minSz: t[\"minSz\"],\n tickSz: t[\"tickSz\"],\n state: t[\"state\"],\n })),\n );\n}\n\nexport async function cmdMarketFundingRate(\n run: ToolRunner,\n instId: string,\n opts: { history: boolean; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_funding_rate\", { instId, history: opts.history, limit: opts.limit });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (opts.history) {\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n fundingRate: r[\"fundingRate\"],\n realizedRate: r[\"realizedRate\"],\n fundingTime: new Date(Number(r[\"fundingTime\"])).toLocaleString(),\n })),\n );\n } else {\n const r = items?.[0];\n if (!r) { outputLine(\"No data\"); return; }\n printKv({\n instId: r[\"instId\"],\n fundingRate: r[\"fundingRate\"],\n nextFundingRate: r[\"nextFundingRate\"],\n fundingTime: new Date(Number(r[\"fundingTime\"])).toLocaleString(),\n nextFundingTime: new Date(Number(r[\"nextFundingTime\"])).toLocaleString(),\n });\n }\n}\n\nexport async function cmdMarketMarkPrice(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_mark_price\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n instType: r[\"instType\"],\n markPx: r[\"markPx\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketTrades(\n run: ToolRunner,\n instId: string,\n opts: { limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_trades\", { instId, limit: opts.limit });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n tradeId: t[\"tradeId\"],\n px: t[\"px\"],\n sz: t[\"sz\"],\n side: t[\"side\"],\n ts: new Date(Number(t[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketIndexTicker(\n run: ToolRunner,\n opts: { instId?: string; quoteCcy?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_ticker\", { instId: opts.instId, quoteCcy: opts.quoteCcy });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n instId: t[\"instId\"],\n idxPx: t[\"idxPx\"],\n high24h: t[\"high24h\"],\n low24h: t[\"low24h\"],\n ts: new Date(Number(t[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketIndexCandles(\n run: ToolRunner,\n instId: string,\n opts: { bar?: string; limit?: number; history: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_candles\", { instId, bar: opts.bar, limit: opts.limit, history: opts.history });\n const candles = getData(result) as string[][];\n if (opts.json) return printJson(candles);\n printTable(\n (candles ?? []).map(([ts, o, h, l, c]) => ({\n time: new Date(Number(ts)).toLocaleString(),\n open: o, high: h, low: l, close: c,\n })),\n );\n}\n\nexport async function cmdMarketPriceLimit(\n run: ToolRunner,\n instId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_price_limit\", { instId });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n const r = items?.[0];\n if (!r) { outputLine(\"No data\"); return; }\n printKv({\n instId: r[\"instId\"],\n buyLmt: r[\"buyLmt\"],\n sellLmt: r[\"sellLmt\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdMarketOpenInterest(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_open_interest\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n oi: r[\"oi\"],\n oiCcy: r[\"oiCcy\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketTicker(\n run: ToolRunner,\n instId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_ticker\", { instId });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { outputLine(\"No data\"); return; }\n const t = items[0];\n printKv({\n instId: t[\"instId\"],\n last: t[\"last\"],\n \"24h open\": t[\"open24h\"],\n \"24h high\": t[\"high24h\"],\n \"24h low\": t[\"low24h\"],\n \"24h vol\": t[\"vol24h\"],\n \"24h change %\": (() => {\n const last = Number(t[\"last\"]);\n const open24h = Number(t[\"open24h\"]);\n return open24h !== 0 ? (((last - open24h) / open24h) * 100).toFixed(2) + \"%\" : \"N/A\";\n })(),\n time: new Date(Number(t[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdMarketTickers(\n run: ToolRunner,\n instType: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_tickers\", { instType });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n instId: t[\"instId\"],\n last: t[\"last\"],\n \"24h high\": t[\"high24h\"],\n \"24h low\": t[\"low24h\"],\n \"24h vol\": t[\"vol24h\"],\n })),\n );\n}\n\nexport async function cmdMarketOrderbook(\n run: ToolRunner,\n instId: string,\n sz: number | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_orderbook\", { instId, sz });\n const data = getData(result);\n if (json) return printJson(data);\n const book = (data as Record<string, unknown>[])[0];\n if (!book) { outputLine(\"No data\"); return; }\n const asks = (book[\"asks\"] as string[][]).slice(0, 5);\n const bids = (book[\"bids\"] as string[][]).slice(0, 5);\n outputLine(\"Asks (price / size):\");\n asks.reverse();\n for (const [p, s] of asks) outputLine(` ${p.padStart(16)} ${s}`);\n outputLine(\"Bids (price / size):\");\n for (const [p, s] of bids) outputLine(` ${p.padStart(16)} ${s}`);\n}\n\nexport async function cmdMarketCandles(\n run: ToolRunner,\n instId: string,\n opts: { bar?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_candles\", { instId, bar: opts.bar, limit: opts.limit });\n const candles = getData(result) as string[][];\n if (opts.json) return printJson(candles);\n printTable(\n (candles ?? []).map(([ts, o, h, l, c, vol]) => ({\n time: new Date(Number(ts)).toLocaleString(),\n open: o, high: h, low: l, close: c, vol,\n })),\n );\n}\n\nexport async function cmdMarketIndicator(\n run: ToolRunner,\n indicator: string,\n instId: string,\n opts: {\n bar?: string;\n params?: string;\n list?: boolean;\n limit?: number;\n backtestTime?: number;\n json: boolean;\n },\n): Promise<void> {\n const params = opts.params\n ? opts.params.split(\",\").map((p) => Number(p.trim())).filter((n) => !Number.isNaN(n))\n : undefined;\n\n const result = await run(\"market_get_indicator\", {\n instId,\n indicator,\n bar: opts.bar,\n params: params && params.length > 0 ? params : undefined,\n returnList: opts.list ?? false,\n limit: opts.limit,\n backtestTime: opts.backtestTime,\n });\n\n // Response shape: data = Array<{ data: [{instId, timeframes}], mode, summary, timestamp }>\n const outerArray = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(outerArray);\n\n if (!outerArray?.length) { process.stdout.write(\"No data\\n\"); return; }\n\n const apiCode = resolveIndicatorCode(indicator);\n const response = outerArray[0];\n const innerArray = response[\"data\"] as Record<string, unknown>[] | undefined;\n const instData = innerArray?.[0];\n const timeframes = instData?.[\"timeframes\"] as Record<string, unknown> | undefined;\n\n if (!timeframes) {\n process.stdout.write(JSON.stringify(outerArray, null, 2) + \"\\n\");\n return;\n }\n\n for (const [tf, tfData] of Object.entries(timeframes)) {\n const indicators = (tfData as Record<string, unknown>)?.[\"indicators\"] as Record<string, unknown> | undefined;\n const values = indicators?.[apiCode] as Record<string, unknown>[] | undefined;\n if (!values?.length) continue;\n\n process.stdout.write(`${instId} · ${apiCode} · ${tf}\\n`);\n process.stdout.write(\"─\".repeat(40) + \"\\n\");\n\n if (opts.list) {\n const tableRows = values.map((entry) => ({\n ts: new Date(Number(entry[\"ts\"])).toLocaleString(),\n ...entry[\"values\"] as Record<string, unknown>,\n }));\n printTable(tableRows);\n } else {\n const latest = values[0];\n printKv({\n ts: new Date(Number(latest[\"ts\"])).toLocaleString(),\n ...latest[\"values\"] as Record<string, unknown>,\n });\n }\n }\n}\n\nexport async function cmdMarketStockTokens(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_stock_tokens\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).slice(0, 50).map((t) => ({\n instId: t[\"instId\"],\n instCategory: t[\"instCategory\"],\n ctVal: t[\"ctVal\"],\n lotSz: t[\"lotSz\"],\n minSz: t[\"minSz\"],\n tickSz: t[\"tickSz\"],\n state: t[\"state\"],\n })),\n );\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { ToolRunner } from \"@agent-tradekit/core\";\nimport {outputLine, printJson, printKv, printTable} from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdAccountBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_balance\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const details = (data?.[0]?.[\"details\"] as Record<string, unknown>[]) ?? [];\n printTable(\n details\n .filter((d) => Number(d[\"eq\"]) > 0)\n .map((d) => ({\n currency: d[\"ccy\"],\n equity: d[\"eq\"],\n available: d[\"availEq\"],\n frozen: d[\"frozenBal\"],\n })),\n );\n}\n\nexport async function cmdAccountAssetBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_asset_balance\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n printTable(\n (data ?? [])\n .filter((r) => Number(r[\"bal\"]) > 0)\n .map((r) => ({\n ccy: r[\"ccy\"],\n bal: r[\"bal\"],\n availBal: r[\"availBal\"],\n frozenBal: r[\"frozenBal\"],\n })),\n );\n}\n\nexport async function cmdAccountPositions(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_positions\", { instType: opts.instType, instId: opts.instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { outputLine(\"No open positions\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n instType: p[\"instType\"],\n side: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdAccountBills(\n run: ToolRunner,\n opts: { archive: boolean; instType?: string; ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const toolName = opts.archive ? \"account_get_bills_archive\" : \"account_get_bills\";\n const result = await run(toolName, { instType: opts.instType, ccy: opts.ccy, limit: opts.limit });\n const bills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(bills);\n printTable(\n (bills ?? []).map((b) => ({\n billId: b[\"billId\"],\n instId: b[\"instId\"],\n type: b[\"type\"],\n ccy: b[\"ccy\"],\n balChg: b[\"balChg\"],\n bal: b[\"bal\"],\n ts: new Date(Number(b[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdAccountFees(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_trade_fee\", { instType: opts.instType, instId: opts.instId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const fee = data?.[0];\n if (!fee) { outputLine(\"No data\"); return; }\n printKv({\n level: fee[\"level\"],\n maker: fee[\"maker\"],\n taker: fee[\"taker\"],\n makerU: fee[\"makerU\"],\n takerU: fee[\"takerU\"],\n ts: new Date(Number(fee[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdAccountConfig(\n run: ToolRunner,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_config\", {});\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const cfg = data?.[0];\n if (!cfg) { outputLine(\"No data\"); return; }\n printKv({\n uid: cfg[\"uid\"],\n acctLv: cfg[\"acctLv\"],\n posMode: cfg[\"posMode\"],\n autoLoan: cfg[\"autoLoan\"],\n greeksType: cfg[\"greeksType\"],\n level: cfg[\"level\"],\n levelTmp: cfg[\"levelTmp\"],\n });\n}\n\nexport async function cmdAccountSetPositionMode(\n run: ToolRunner,\n posMode: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_set_position_mode\", { posMode });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n outputLine(`Position mode set: ${r?.[\"posMode\"]}`);\n}\n\nexport async function cmdAccountMaxSize(\n run: ToolRunner,\n opts: { instId: string; tdMode: string; px?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_max_size\", { instId: opts.instId, tdMode: opts.tdMode, px: opts.px });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n if (!r) { outputLine(\"No data\"); return; }\n printKv({ instId: r[\"instId\"], maxBuy: r[\"maxBuy\"], maxSell: r[\"maxSell\"] });\n}\n\nexport async function cmdAccountMaxAvailSize(\n run: ToolRunner,\n opts: { instId: string; tdMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_max_avail_size\", { instId: opts.instId, tdMode: opts.tdMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n if (!r) { outputLine(\"No data\"); return; }\n printKv({ instId: r[\"instId\"], availBuy: r[\"availBuy\"], availSell: r[\"availSell\"] });\n}\n\nexport async function cmdAccountMaxWithdrawal(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_max_withdrawal\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n ccy: r[\"ccy\"],\n maxWd: r[\"maxWd\"],\n maxWdEx: r[\"maxWdEx\"],\n })),\n );\n}\n\nexport async function cmdAccountPositionsHistory(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_positions_history\", { instType: opts.instType, instId: opts.instId, limit: opts.limit });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((p) => ({\n instId: p[\"instId\"],\n direction: p[\"direction\"],\n openAvgPx: p[\"openAvgPx\"],\n closeAvgPx: p[\"closeAvgPx\"],\n realizedPnl: p[\"realizedPnl\"],\n uTime: new Date(Number(p[\"uTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdAccountTransfer(\n run: ToolRunner,\n opts: {\n ccy: string;\n amt: string;\n from: string;\n to: string;\n transferType?: string;\n subAcct?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"account_transfer\", {\n ccy: opts.ccy,\n amt: opts.amt,\n from: opts.from,\n to: opts.to,\n type: opts.transferType,\n subAcct: opts.subAcct,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Transfer: ${r?.[\"transId\"]} (${r?.[\"ccy\"]} ${r?.[\"amt\"]})`);\n}\n\ninterface LogEntry {\n timestamp: string;\n tool: string;\n level: string;\n durationMs?: number;\n error?: boolean;\n}\n\nfunction readAuditLogs(logDir: string, days = 7): LogEntry[] {\n const entries: LogEntry[] = [];\n const now = new Date();\n for (let i = 0; i < days; i++) {\n const d = new Date(now);\n d.setUTCDate(now.getUTCDate() - i);\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n const filePath = path.join(logDir, `trade-${yyyy}-${mm}-${dd}.log`);\n let content: string;\n try { content = fs.readFileSync(filePath, \"utf8\"); } catch { continue; }\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try { entries.push(JSON.parse(trimmed) as LogEntry); } catch { /* skip */ }\n }\n }\n return entries;\n}\n\nexport function cmdAccountAudit(\n opts: { limit?: string; tool?: string; since?: string; json: boolean },\n): void {\n const logDir = path.join(os.homedir(), \".okx\", \"logs\");\n const limit = Math.min(Number(opts.limit) || 20, 100);\n\n let entries = readAuditLogs(logDir);\n\n if (opts.tool) entries = entries.filter((e) => e.tool === opts.tool);\n if (opts.since) {\n const sinceTime = new Date(opts.since).getTime();\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= sinceTime);\n }\n\n entries.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n entries = entries.slice(0, limit);\n\n if (opts.json) return printJson(entries);\n if (!entries.length) { outputLine(\"No audit log entries\"); return; }\n printTable(\n entries.map((e) => ({\n timestamp: e.timestamp,\n tool: e.tool,\n level: e.level,\n duration: e.durationMs != null ? `${e.durationMs}ms` : \"-\",\n status: e.error ? \"ERROR\" : \"OK\",\n })),\n );\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { errorLine, outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction emitBatchResults(items: Record<string, unknown>[]): void {\n for (const r of items) {\n const isError = r[\"sCode\"] !== \"0\" && r[\"sCode\"] !== 0;\n const id = r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\";\n if (isError) {\n errorLine(`${id}: ${r[\"sMsg\"]} (sCode ${r[\"sCode\"]})`);\n } else {\n outputLine(`${id}: OK`);\n }\n }\n}\n\nexport async function cmdSpotOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\"; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n filled: o[\"fillSz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSpotPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode?: string;\n side: string;\n ordType: string;\n sz: string;\n tgtCcy?: string;\n px?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n px: opts.px,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order placed\", \"ordId\");\n}\n\nexport async function cmdSpotCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const { instId, ordId, clOrdId, json } = opts;\n if (!ordId && !clOrdId) throw new Error(\"Either --ordId or --clOrdId is required\");\n const result = await run(\"spot_cancel_order\", { instId, ...(ordId ? { ordId } : { clOrdId }) });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Cancelled\", \"ordId\");\n}\n\nexport async function cmdSpotAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode?: string;\n side: string;\n ordType: string;\n sz: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order placed\", \"algoId\");\n}\n\nexport async function cmdSpotAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order amended\", \"algoId\");\n}\n\nexport async function cmdSpotAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"spot_cancel_algo_order\", { instId, algoId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order cancelled\", \"algoId\");\n}\n\nexport async function cmdSpotGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_order\", { instId: opts.instId, ordId: opts.ordId, clOrdId: opts.clOrdId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { outputLine(\"No data\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdSpotAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order amended\", \"ordId\");\n}\n\nexport async function cmdSpotAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { outputLine(\"No algo orders\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSpotFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_fills\", { instId: opts.instId, ordId: opts.ordId });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdSpotAlgoTrailPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n sz: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n tdMode?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: \"move_order_stop\",\n sz: opts.sz,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Trailing stop placed\", \"algoId\");\n}\n\nexport async function cmdSpotBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n errorLine(\"Error: --orders must be a valid JSON array\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n errorLine(\"Error: --orders must be a non-empty JSON array\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"spot_batch_orders\",\n amend: \"spot_batch_amend\",\n cancel: \"spot_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n errorLine(\"Error: --action must be one of: place, amend, cancel\");\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"spot_batch_orders\" ? { action: opts.action, orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitBatchResults(data ?? []);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { errorLine, outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction emitBatchResults(items: Record<string, unknown>[]): void {\n for (const r of items) {\n const isError = r[\"sCode\"] !== \"0\" && r[\"sCode\"] !== 0;\n const id = r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\";\n if (isError) {\n errorLine(`${id}: ${r[\"sMsg\"]} (sCode ${r[\"sCode\"]})`);\n } else {\n outputLine(`${id}: OK`);\n }\n }\n}\n\nexport async function cmdSwapPositions(\n run: ToolRunner,\n instId: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_get_positions\", { instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { outputLine(\"No open positions\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n side: p[\"posSide\"],\n size: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n uplRatio: p[\"uplRatio\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdSwapOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\"; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSwapPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n px?: string;\n tdMode: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n posSide: opts.posSide,\n px: opts.px,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order placed\", \"ordId\");\n}\n\nexport async function cmdSwapCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const { instId, ordId, clOrdId, json } = opts;\n if (!ordId && !clOrdId) throw new Error(\"Either --ordId or --clOrdId is required\");\n const result = await run(\"swap_cancel_order\", { instId, ...(ordId ? { ordId } : { clOrdId }) });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Cancelled\", \"ordId\");\n}\n\nexport async function cmdSwapAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n tdMode: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n reduceOnly?: boolean;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n posSide: opts.posSide,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n reduceOnly: opts.reduceOnly,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order placed\", \"algoId\");\n}\n\nexport async function cmdSwapAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order amended\", \"algoId\");\n}\n\nexport async function cmdSwapAlgoTrailPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n sz: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n posSide?: string;\n tdMode: string;\n reduceOnly?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_move_stop_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n sz: opts.sz,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n posSide: opts.posSide,\n reduceOnly: opts.reduceOnly,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Trailing stop placed\", \"algoId\");\n}\n\nexport async function cmdSwapAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_cancel_algo_orders\", { orders: [{ instId, algoId }] });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order cancelled\", \"algoId\");\n}\n\nexport async function cmdSwapAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { outputLine(\"No algo orders\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSwapFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_fills\", { instId: opts.instId, ordId: opts.ordId, archive: opts.archive });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdSwapGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_order\", { instId: opts.instId, ordId: opts.ordId, clOrdId: opts.clOrdId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { outputLine(\"No data\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdSwapClose(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; posSide?: string; autoCxl?: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_close_position\", {\n instId: opts.instId,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n autoCxl: opts.autoCxl,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Position closed: ${r?.[\"instId\"]} ${r?.[\"posSide\"] ?? \"\"}`);\n}\n\nexport async function cmdSwapGetLeverage(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_leverage\", { instId: opts.instId, mgnMode: opts.mgnMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n instId: r[\"instId\"],\n mgnMode: r[\"mgnMode\"],\n posSide: r[\"posSide\"],\n lever: r[\"lever\"],\n })),\n );\n}\n\nexport async function cmdSwapAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order amended\", \"ordId\");\n}\n\nexport async function cmdSwapSetLeverage(\n run: ToolRunner,\n opts: { instId: string; lever: string; mgnMode: string; posSide?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_set_leverage\", {\n instId: opts.instId,\n lever: opts.lever,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Leverage set: ${r?.[\"lever\"]}x ${r?.[\"instId\"]}`);\n}\n\nexport async function cmdSwapBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n errorLine(\"Error: --orders must be a valid JSON array\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n errorLine(\"Error: --orders must be a non-empty JSON array\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"swap_batch_orders\",\n amend: \"swap_batch_amend\",\n cancel: \"swap_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n errorLine(\"Error: --action must be one of: place, amend, cancel\");\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"swap_batch_orders\" ? { action: opts.action, orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitBatchResults(data ?? []);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { errorLine, outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction emitBatchResults(items: Record<string, unknown>[]): void {\n for (const r of items) {\n const isError = r[\"sCode\"] !== \"0\" && r[\"sCode\"] !== 0;\n const id = r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\";\n if (isError) {\n errorLine(`${id}: ${r[\"sMsg\"]} (sCode ${r[\"sCode\"]})`);\n } else {\n outputLine(`${id}: OK`);\n }\n }\n}\n\nexport async function cmdFuturesOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\" | \"archive\"; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdFuturesPositions(\n run: ToolRunner,\n instId: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"futures_get_positions\", { instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { outputLine(\"No open positions\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n side: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdFuturesFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_fills\", { instId: opts.instId, ordId: opts.ordId, archive: opts.archive });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdFuturesPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n tdMode: string;\n tgtCcy?: string;\n posSide?: string;\n px?: string;\n reduceOnly?: boolean;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n posSide: opts.posSide,\n px: opts.px,\n reduceOnly: opts.reduceOnly,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order placed\", \"ordId\");\n}\n\nexport async function cmdFuturesCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const { instId, ordId, clOrdId, json } = opts;\n if (!ordId && !clOrdId) throw new Error(\"Either --ordId or --clOrdId is required\");\n const result = await run(\"futures_cancel_order\", { instId, ...(ordId ? { ordId } : { clOrdId }) });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Cancelled\", \"ordId\");\n}\n\nexport async function cmdFuturesGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_order\", { instId: opts.instId, ordId: opts.ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { outputLine(\"No data\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdFuturesAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order amended\", \"ordId\");\n}\n\nexport async function cmdFuturesClose(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; posSide?: string; autoCxl?: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_close_position\", {\n instId: opts.instId,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n autoCxl: opts.autoCxl,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Position closed: ${r?.[\"instId\"]} ${r?.[\"posSide\"] ?? \"\"}`);\n}\n\nexport async function cmdFuturesSetLeverage(\n run: ToolRunner,\n opts: { instId: string; lever: string; mgnMode: string; posSide?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_set_leverage\", {\n instId: opts.instId,\n lever: opts.lever,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n outputLine(`Leverage set: ${r?.[\"lever\"]}x ${r?.[\"instId\"]}`);\n}\n\nexport async function cmdFuturesGetLeverage(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_leverage\", { instId: opts.instId, mgnMode: opts.mgnMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n instId: r[\"instId\"],\n mgnMode: r[\"mgnMode\"],\n posSide: r[\"posSide\"],\n lever: r[\"lever\"],\n })),\n );\n}\n\nexport async function cmdFuturesBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n errorLine(\"Error: --orders must be a valid JSON array\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n errorLine(\"Error: --orders must be a non-empty JSON array\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"futures_batch_orders\",\n amend: \"futures_batch_amend\",\n cancel: \"futures_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n errorLine(\"Error: --action must be one of: place, amend, cancel\");\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"futures_batch_orders\" ? { orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitBatchResults(data ?? []);\n}\n\nexport async function cmdFuturesAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n tdMode: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n reduceOnly?: boolean;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n posSide: opts.posSide,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n reduceOnly: opts.reduceOnly,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order placed\", \"algoId\");\n}\n\nexport async function cmdFuturesAlgoTrailPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n sz: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n posSide?: string;\n tdMode: string;\n reduceOnly?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_place_move_stop_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n sz: opts.sz,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n posSide: opts.posSide,\n reduceOnly: opts.reduceOnly,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Trailing stop placed\", \"algoId\");\n}\n\nexport async function cmdFuturesAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order amended\", \"algoId\");\n}\n\nexport async function cmdFuturesAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"futures_cancel_algo_orders\", { orders: [{ instId, algoId }] });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order cancelled\", \"algoId\");\n}\n\nexport async function cmdFuturesAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { outputLine(\"No algo orders\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { errorLine, outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction emitBatchResults(items: Record<string, unknown>[]): void {\n for (const r of items) {\n const isError = r[\"sCode\"] !== \"0\" && r[\"sCode\"] !== 0;\n const id = r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\";\n if (isError) {\n errorLine(`${id}: ${r[\"sMsg\"]} (sCode ${r[\"sCode\"]})`);\n } else {\n outputLine(`${id}: OK`);\n }\n }\n}\n\nexport async function cmdOptionOrders(\n run: ToolRunner,\n opts: { instId?: string; uly?: string; status: \"live\" | \"history\" | \"archive\"; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_orders\", {\n instId: opts.instId,\n uly: opts.uly,\n status: opts.status,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdOptionGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { outputLine(\"No data\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdOptionPositions(\n run: ToolRunner,\n opts: { instId?: string; uly?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_positions\", {\n instId: opts.instId,\n uly: opts.uly,\n });\n const positions = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { outputLine(\"No open positions\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n posSide: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n delta: p[\"deltaPA\"],\n gamma: p[\"gammaPA\"],\n theta: p[\"thetaPA\"],\n vega: p[\"vegaPA\"],\n })),\n );\n}\n\nexport async function cmdOptionFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_fills\", {\n instId: opts.instId,\n ordId: opts.ordId,\n archive: opts.archive,\n });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdOptionInstruments(\n run: ToolRunner,\n opts: { uly: string; expTime?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_instruments\", {\n uly: opts.uly,\n expTime: opts.expTime,\n });\n const instruments = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(instruments);\n printTable(\n (instruments ?? []).map((i) => ({\n instId: i[\"instId\"],\n uly: i[\"uly\"],\n expTime: i[\"expTime\"],\n stk: i[\"stk\"],\n optType: i[\"optType\"],\n state: i[\"state\"],\n })),\n );\n}\n\nexport async function cmdOptionGreeks(\n run: ToolRunner,\n opts: { uly: string; expTime?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_greeks\", {\n uly: opts.uly,\n expTime: opts.expTime,\n });\n const greeks = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(greeks);\n printTable(\n (greeks ?? []).map((g) => ({\n instId: g[\"instId\"],\n delta: g[\"deltaBS\"],\n gamma: g[\"gammaBS\"],\n theta: g[\"thetaBS\"],\n vega: g[\"vegaBS\"],\n iv: g[\"markVol\"],\n markPx: g[\"markPx\"],\n })),\n );\n}\n\nexport async function cmdOptionPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode: string;\n side: string;\n ordType: string;\n sz: string;\n px?: string;\n reduceOnly?: boolean;\n clOrdId?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"option_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n px: opts.px,\n reduceOnly: opts.reduceOnly,\n clOrdId: opts.clOrdId,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Order placed\", \"ordId\");\n}\n\nexport async function cmdOptionCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_cancel_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Cancelled\", \"ordId\");\n}\n\nexport async function cmdOptionAmend(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; newSz?: string; newPx?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Amended\", \"ordId\");\n}\n\nexport async function cmdOptionBatchCancel(\n run: ToolRunner,\n opts: { orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n errorLine(\"Error: --orders must be a valid JSON array\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n errorLine(\"Error: --orders must be a non-empty JSON array\");\n process.exitCode = 1;\n return;\n }\n const result = await run(\"option_batch_cancel\", { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitBatchResults(data ?? []);\n}\n\nexport async function cmdOptionAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode: string;\n side: string;\n ordType: string;\n sz: string;\n tgtCcy?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n reduceOnly?: boolean;\n clOrdId?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"option_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tgtCcy: opts.tgtCcy,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n reduceOnly: opts.reduceOnly,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order placed\", \"algoId\");\n}\n\nexport async function cmdOptionAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"option_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order amended\", \"algoId\");\n}\n\nexport async function cmdOptionAlgoCancel(\n run: ToolRunner,\n opts: { instId: string; algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_cancel_algo_orders\", { orders: [{ instId: opts.instId, algoId: opts.algoId }] });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"Algo order cancelled\", \"algoId\");\n}\n\nexport async function cmdOptionAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { outputLine(\"No algo orders\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n","import { writeFullConfig } from \"@agent-tradekit/core\";\nimport type { OkxTomlConfig } from \"@agent-tradekit/core\";\n\nexport function writeCliConfig(config: OkxTomlConfig): void {\n writeFullConfig(config);\n}\n","import { readFullConfig, configFilePath, OKX_SITES, SITE_IDS, tomlStringify } from \"@agent-tradekit/core\";\nimport type { SiteId } from \"@agent-tradekit/core\";\nimport { writeCliConfig } from \"../config/toml.js\";\nimport { output, errorOutput, outputLine, errorLine, printJson, printKv } from \"../formatter.js\";\nimport type { OkxTomlConfig, OkxProfile } from \"@agent-tradekit/core\";\nimport { createInterface } from \"node:readline\";\nimport { spawnSync } from \"node:child_process\";\n\nexport type Lang = \"en\" | \"zh\";\n\nconst messages = {\n en: {\n title: \"OKX Trade CLI — Configuration Wizard\",\n selectSite: \"Select site:\",\n sitePrompt: \"Site (1/2/3, default: 1): \",\n demoPrompt: \"Use demo trading? (Y/n) \",\n hintDemo: \"The page will redirect to demo trading API management\",\n hintLive: \"The page will redirect to live trading API management\",\n createApiKey: (url: string) => `\\nGo to ${url} to create an API Key (trade permission required)\\n`,\n hint: (h: string) => `Tip: ${h}\\n\\n`,\n profilePrompt: (name: string) => `Profile name (default: ${name}): `,\n profileExists: (name: string) => `Profile \"${name}\" already exists. Overwrite? (y/N) `,\n cancelled: \"Cancelled.\",\n emptyApiKey: \"Error: API Key cannot be empty\",\n emptySecretKey: \"Error: Secret Key cannot be empty\",\n emptyPassphrase: \"Error: Passphrase cannot be empty\",\n demoSelected: \"Demo trading mode selected. Switch to live anytime via okx config set.\",\n saved: (p: string) => `\\nConfig saved to ${p}\\n`,\n defaultProfile: (name: string) => `Default profile set to: ${name}\\n`,\n usage: \"Usage: okx account balance\\n\",\n writeFailed: (msg: string) => `Failed to write config: ${msg}\\n`,\n permissionDenied: (p: string) => `Permission denied. Check read/write access for ${p} and its parent directory.\\n`,\n manualWrite: (p: string) => `Please manually write the following to ${p}:\\n\\n`,\n },\n zh: {\n title: \"OKX Trade CLI — 配置向导\",\n selectSite: \"请选择站点:\",\n sitePrompt: \"站点 (1/2/3, 默认: 1): \",\n demoPrompt: \"使用模拟盘?(Y/n) \",\n hintDemo: \"页面会自动跳转到模拟盘 API 管理\",\n hintLive: \"页面会自动跳转到实盘 API 管理\",\n createApiKey: (url: string) => `\\n请前往 ${url} 创建 API Key(需要 trade 权限)\\n`,\n hint: (h: string) => `提示:${h}\\n\\n`,\n profilePrompt: (name: string) => `Profile 名称 (默认: ${name}): `,\n profileExists: (name: string) => `Profile \"${name}\" 已存在,是否覆盖?(y/N) `,\n cancelled: \"已取消。\",\n emptyApiKey: \"错误: API Key 不能为空\",\n emptySecretKey: \"错误: Secret Key 不能为空\",\n emptyPassphrase: \"错误: Passphrase 不能为空\",\n demoSelected: \"已选择模拟盘模式,可随时通过 okx config set 切换为实盘。\",\n saved: (p: string) => `\\n配置已保存到 ${p}\\n`,\n defaultProfile: (name: string) => `已设为默认 profile: ${name}\\n`,\n usage: \"使用方式: okx account balance\\n\",\n writeFailed: (msg: string) => `写入配置文件失败: ${msg}\\n`,\n permissionDenied: (p: string) => `权限不足,请检查 ${p} 及其父目录的读写权限。\\n`,\n manualWrite: (p: string) => `请手动将以下内容写入 ${p}:\\n\\n`,\n },\n} as const;\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string): Promise<string> {\n return new Promise((resolve) => rl.question(question, resolve));\n}\n\nexport function cmdConfigShow(json: boolean): void {\n const config = readFullConfig();\n if (json) return printJson(config);\n outputLine(`Config: ${configFilePath()}`);\n outputLine(\"\");\n outputLine(`default_profile: ${config.default_profile ?? \"(not set)\"}`);\n outputLine(\"\");\n for (const [name, profile] of Object.entries(config.profiles)) {\n outputLine(`[${name}]`);\n printKv({\n api_key: profile.api_key ? maskSecret(profile.api_key) : \"(not set)\",\n demo: profile.demo ?? false,\n base_url: profile.base_url ?? \"(default)\",\n }, 2);\n outputLine(\"\");\n }\n}\n\nexport function cmdConfigSet(key: string, value: string): void {\n const config = readFullConfig();\n if (key === \"default_profile\") {\n config.default_profile = value;\n writeCliConfig(config);\n outputLine(`default_profile set to \"${value}\"`);\n } else {\n errorLine(`Unknown config key: ${key}`);\n process.exitCode = 1;\n }\n}\n\nexport type SiteKey = SiteId;\n\n/** Maps raw user input (\"1\"/\"2\"/\"3\", site names like \"global\"/\"eea\"/\"us\", or empty) to a site key. */\nexport function parseSiteKey(raw: string): SiteKey {\n const lower = raw.toLowerCase();\n if (lower === \"eea\" || raw === \"2\") return \"eea\";\n if (lower === \"us\" || raw === \"3\") return \"us\";\n if (lower === \"global\" || raw === \"1\") return \"global\";\n return \"global\";\n}\n\n/** Infers site key from a base_url value (for backward-compat with old profiles lacking a site field). */\nexport function inferSiteFromBaseUrl(baseUrl?: string): SiteKey {\n if (!baseUrl) return \"global\";\n for (const id of SITE_IDS) {\n const site = OKX_SITES[id];\n if (baseUrl === site.apiBaseUrl || baseUrl === site.webUrl) return id;\n }\n return \"global\";\n}\n\n/** Masks a secret value, showing only the last 4 characters. */\nexport function maskSecret(value?: string): string {\n if (!value || value.length < 4) return \"****\";\n return \"***\" + value.slice(-4);\n}\n\n/** Builds the targeted API creation URL for the given site and trading mode. */\nexport function buildApiUrl(siteKey: SiteKey, demo: boolean): string {\n const query = demo ? \"?go-demo-trading=1\" : \"?go-live-trading=1\";\n return `${OKX_SITES[siteKey].webUrl}/account/my-api${query}`;\n}\n\n/** Builds a profile entry, omitting base_url for the global site. */\nexport function buildProfileEntry(\n siteKey: SiteKey,\n apiKey: string,\n secretKey: string,\n passphrase: string,\n demo: boolean,\n): OkxProfile {\n const entry: OkxProfile = { api_key: apiKey, secret_key: secretKey, passphrase, demo };\n if (siteKey !== \"global\") {\n entry.base_url = OKX_SITES[siteKey].webUrl;\n }\n return entry;\n}\n\nexport async function cmdConfigInit(lang: Lang = \"en\"): Promise<void> {\n const t = messages[lang];\n outputLine(t.title);\n outputLine(\"\");\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n // Step 1: site selection\n outputLine(t.selectSite);\n outputLine(\" 1) Global (www.okx.com) [default]\");\n outputLine(\" 2) EEA (my.okx.com)\");\n outputLine(\" 3) US (app.okx.com)\");\n const siteRaw = (await prompt(rl, t.sitePrompt)).trim();\n const siteKey = parseSiteKey(siteRaw);\n\n // Step 2: demo / live selection — must happen before URL construction\n const demoRaw = (await prompt(rl, t.demoPrompt)).trim().toLowerCase();\n const demo = demoRaw !== \"n\";\n\n // Step 3: open targeted API creation page\n const apiUrl = buildApiUrl(siteKey, demo);\n const hintText = demo ? t.hintDemo : t.hintLive;\n output(t.createApiKey(apiUrl));\n output(t.hint(hintText));\n\n // Try to open the URL; silently ignore failures\n try {\n const opener = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n spawnSync(opener, [apiUrl], { stdio: \"ignore\", shell: process.platform === \"win32\" });\n } catch {\n // silently ignore\n }\n\n const defaultProfileName = demo ? \"okx-demo\" : \"okx-prod\";\n const profileNameRaw = await prompt(rl, t.profilePrompt(defaultProfileName));\n const profileName = profileNameRaw.trim() || defaultProfileName;\n\n // Check if profile already exists\n const config = readFullConfig();\n if (config.profiles[profileName]) {\n const overwrite = (await prompt(rl, t.profileExists(profileName))).trim().toLowerCase();\n if (overwrite !== \"y\") {\n outputLine(t.cancelled);\n return;\n }\n }\n\n const apiKey = (await prompt(rl, \"API Key: \")).trim();\n if (!apiKey) {\n errorLine(t.emptyApiKey);\n process.exitCode = 1;\n return;\n }\n\n const secretKey = (await prompt(rl, \"Secret Key: \")).trim();\n if (!secretKey) {\n errorLine(t.emptySecretKey);\n process.exitCode = 1;\n return;\n }\n\n const passphrase = (await prompt(rl, \"Passphrase: \")).trim();\n if (!passphrase) {\n errorLine(t.emptyPassphrase);\n process.exitCode = 1;\n return;\n }\n\n if (demo) {\n outputLine(t.demoSelected);\n }\n\n const profileEntry = buildProfileEntry(siteKey, apiKey, secretKey, passphrase, demo);\n config.profiles[profileName] = profileEntry;\n\n // Auto-set as default_profile\n if (!config.default_profile || config.default_profile !== profileName) {\n config.default_profile = profileName;\n }\n\n const configPath = configFilePath();\n try {\n writeCliConfig(config);\n output(t.saved(configPath));\n output(t.defaultProfile(profileName));\n output(t.usage);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const isPermission = err instanceof Error && \"code\" in err && (err.code === \"EACCES\" || err.code === \"EPERM\");\n errorOutput(t.writeFailed(message));\n if (isPermission) {\n errorOutput(t.permissionDenied(configPath));\n }\n errorOutput(t.manualWrite(configPath));\n outputLine(tomlStringify(config as unknown as Record<string, unknown>));\n process.exitCode = 1;\n }\n } finally {\n rl.close();\n }\n}\n\n/**\n * Non-interactive profile creation / update.\n * Usage: okx config add-profile AK=xxx SK=yyy PP=zzz [site=global|eea|us] [demo=true|false] [name=xxx] [--force]\n */\nexport function cmdConfigAddProfile(kvPairs: string[], force: boolean): void {\n // Parse key=value pairs (split on first '=' only to handle values containing '=')\n const params: Record<string, string> = {};\n for (const pair of kvPairs) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1);\n params[key.toUpperCase()] = value;\n }\n\n const ak = params[\"AK\"];\n const sk = params[\"SK\"];\n const pp = params[\"PP\"];\n\n // Validate required fields\n const missing: string[] = [];\n if (!ak) missing.push(\"AK\");\n if (!sk) missing.push(\"SK\");\n if (!pp) missing.push(\"PP\");\n if (missing.length > 0) {\n errorLine(`Error: missing required parameter(s): ${missing.join(\", \")}`);\n errorLine(\"Usage: okx config add-profile AK=<key> SK=<secret> PP=<passphrase> [site=global|eea|us] [demo=true|false] [name=<name>] [--force]\");\n process.exitCode = 1;\n return;\n }\n\n const siteKey = parseSiteKey(params[\"SITE\"] ?? \"\");\n const demo = params[\"DEMO\"] !== undefined ? params[\"DEMO\"].toLowerCase() !== \"false\" : true;\n const defaultName = demo ? \"demo\" : \"live\";\n const profileName = params[\"NAME\"] ?? defaultName;\n\n const config = readFullConfig();\n\n // Check for conflict\n if (config.profiles[profileName] && !force) {\n errorLine(`Error: profile \"${profileName}\" already exists. Use --force to overwrite.`);\n process.exitCode = 1;\n return;\n }\n\n // Build profile entry and set site field\n const entry = buildProfileEntry(siteKey, ak, sk, pp, demo);\n entry.site = siteKey;\n config.profiles[profileName] = entry;\n config.default_profile = profileName;\n\n writeCliConfig(config);\n outputLine(`Profile \"${profileName}\" saved to ${configFilePath()}`);\n outputLine(`Default profile set to: ${profileName}`);\n}\n\n/**\n * Lists all profiles, masking sensitive fields.\n * Default profile is marked with *.\n */\nexport function cmdConfigListProfile(): void {\n const config = readFullConfig();\n const entries = Object.entries(config.profiles);\n if (entries.length === 0) {\n outputLine(\"No profiles found. Run: okx config add-profile AK=<key> SK=<secret> PP=<passphrase>\");\n return;\n }\n outputLine(`Config: ${configFilePath()}`);\n outputLine(\"\");\n for (const [name, profile] of entries) {\n const isDefault = name === config.default_profile;\n const marker = isDefault ? \" *\" : \"\";\n const site = profile.site ?? inferSiteFromBaseUrl(profile.base_url);\n const mode = profile.demo !== false ? \"demo (模拟盘)\" : \"live (实盘)\";\n outputLine(`[${name}]${marker}`);\n outputLine(` api_key: ${maskSecret(profile.api_key)}`);\n outputLine(` secret_key: ${maskSecret(profile.secret_key)}`);\n outputLine(` passphrase: ${maskSecret(profile.passphrase)}`);\n outputLine(` site: ${site}`);\n outputLine(` mode: ${mode}`);\n outputLine(\"\");\n }\n}\n\n/**\n * Switches the default profile.\n * Usage: okx config use <profile-name>\n */\nexport function cmdConfigUse(profileName: string): void {\n if (!profileName) {\n errorLine(\"Error: profile name is required.\");\n errorLine(\"Usage: okx config use <profile-name>\");\n process.exitCode = 1;\n return;\n }\n\n const config = readFullConfig();\n const available = Object.keys(config.profiles);\n\n if (!config.profiles[profileName]) {\n errorLine(`Error: profile \"${profileName}\" does not exist.`);\n if (available.length > 0) {\n errorLine(`Available profiles: ${available.join(\", \")}`);\n } else {\n errorLine(\"No profiles configured. Run: okx config add-profile AK=<key> SK=<secret> PP=<passphrase>\");\n }\n process.exitCode = 1;\n return;\n }\n\n config.default_profile = profileName;\n writeCliConfig(config);\n outputLine(`Default profile set to: \"${profileName}\"`);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction extractData(result: unknown): Record<string, unknown>[] {\n if (result && typeof result === \"object\") {\n const data = (result as Record<string, unknown>)[\"data\"];\n if (Array.isArray(data)) return data as Record<string, unknown>[];\n }\n return [];\n}\n\nfunction printDataList(\n data: Record<string, unknown>[],\n json: boolean,\n emptyMsg: string,\n mapper: (r: Record<string, unknown>) => Record<string, unknown>,\n): void {\n if (json) { printJson(data); return; }\n if (!data.length) { outputLine(emptyMsg); return; }\n printTable(data.map(mapper));\n}\n\nexport async function cmdEarnSavingsBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const data = extractData(await run(\"earn_get_savings_balance\", { ccy }));\n printDataList(data, json, \"No savings balance\", (r) => ({\n ccy: r[\"ccy\"], amt: r[\"amt\"], earnings: r[\"earnings\"],\n rate: r[\"rate\"], loanAmt: r[\"loanAmt\"], pendingAmt: r[\"pendingAmt\"],\n }));\n}\n\nexport async function cmdEarnSavingsPurchase(\n run: ToolRunner,\n opts: { ccy: string; amt: string; rate?: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_savings_purchase\", { ccy: opts.ccy, amt: opts.amt, rate: opts.rate }));\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { outputLine(\"No response data\"); return; }\n printKv({ ccy: r[\"ccy\"], amt: r[\"amt\"], side: r[\"side\"], rate: r[\"rate\"] });\n}\n\nexport async function cmdEarnSavingsRedeem(\n run: ToolRunner,\n opts: { ccy: string; amt: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_savings_redeem\", { ccy: opts.ccy, amt: opts.amt }));\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { outputLine(\"No response data\"); return; }\n printKv({ ccy: r[\"ccy\"], amt: r[\"amt\"], side: r[\"side\"] });\n}\n\nexport async function cmdEarnSetLendingRate(\n run: ToolRunner,\n opts: { ccy: string; rate: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_set_lending_rate\", { ccy: opts.ccy, rate: opts.rate }));\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n outputLine(`Lending rate set: ${r?.[\"ccy\"]} → ${r?.[\"rate\"]}`);\n}\n\nexport async function cmdEarnLendingHistory(\n run: ToolRunner,\n opts: { ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_get_lending_history\", { ccy: opts.ccy, limit: opts.limit }));\n printDataList(data, opts.json, \"No lending history\", (r) => ({\n ccy: r[\"ccy\"], amt: r[\"amt\"], earnings: r[\"earnings\"],\n rate: r[\"rate\"], ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n }));\n}\n\nexport async function cmdEarnLendingRateHistory(\n run: ToolRunner,\n opts: { ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_get_lending_rate_history\", { ccy: opts.ccy, limit: opts.limit }));\n printDataList(data, opts.json, \"No rate history data\", (r) => ({\n ccy: r[\"ccy\"], lendingRate: r[\"lendingRate\"],\n rate: r[\"rate\"], ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n }));\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, errorLine, printJson, printTable } from \"../formatter.js\";\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface BalanceDetail {\n ccy: string;\n eq?: string; // equity — used as invested amount for USDG earn currencies\n autoLendStatus: string; // \"unsupported\" | \"off\" | \"pending\" | \"active\"\n autoStakingStatus: string; // \"unsupported\" | \"off\" | \"pending\" | \"active\"\n autoLendAmt: string;\n autoLendMtAmt: string;\n autoLendApr: string;\n [key: string]: unknown;\n}\n\ntype EarnType = \"0\" | \"1\";\n\n/**\n * Known currencies that use earnType=\"1\" (USDG earn).\n * Source: OKX API docs for POST /api/v5/account/set-auto-earn.\n * Update this list when OKX adds new USDG earn currencies.\n */\nconst USDG_EARN_CURRENCIES = new Set([\"USDG\", \"BUIDL\"]);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction isSupported(status: string | undefined): boolean {\n return !!status && status !== \"unsupported\";\n}\n\n/**\n * Infer earnType from balance detail.\n *\n * - autoLendStatus or autoStakingStatus != \"unsupported\" → earnType \"0\" (lend+stake)\n * - Known USDG-earn currencies (USDG, BUIDL) → earnType \"1\"\n * - Otherwise → null (not supported)\n */\nexport function inferEarnType(detail: BalanceDetail): EarnType | null {\n if (isSupported(detail.autoLendStatus) || isSupported(detail.autoStakingStatus)) return \"0\";\n if (USDG_EARN_CURRENCIES.has(detail.ccy)) return \"1\";\n return null;\n}\n\nasync function getBalanceDetails(\n run: ToolRunner,\n ccy?: string,\n): Promise<BalanceDetail[]> {\n const result = await run(\"account_get_balance\", ccy ? { ccy } : {});\n const data = result.data as Record<string, unknown>[] | undefined;\n const first = data?.[0] as Record<string, unknown> | undefined;\n return (first?.details as BalanceDetail[]) ?? [];\n}\n\nfunction earnTypeLabel(et: EarnType): string {\n return et === \"1\" ? \"USDG earn\" : \"lend+stake\";\n}\n\n/* ------------------------------------------------------------------ */\n/* Commands */\n/* ------------------------------------------------------------------ */\n\nexport async function cmdAutoEarnStatus(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const details = await getBalanceDetails(run, ccy);\n\n const relevant = details.filter((d) => inferEarnType(d) !== null);\n\n if (json) { printJson(relevant); return; }\n\n if (!relevant.length) {\n outputLine(ccy ? `${ccy} does not support auto-earn` : \"No currencies support auto-earn\");\n return;\n }\n\n printTable(relevant.map((d) => {\n const et = inferEarnType(d)!;\n return {\n ccy: d.ccy,\n earnType: earnTypeLabel(et),\n autoLend: d.autoLendStatus,\n autoStaking: d.autoStakingStatus,\n invested: et === \"1\" ? (d.eq || \"-\") : (d.autoLendAmt || \"-\"),\n matched: d.autoLendMtAmt || \"-\",\n apr: d.autoLendApr ? `${(Number(d.autoLendApr) * 100).toFixed(2)}%` : \"-\",\n };\n }));\n}\n\nexport async function cmdAutoEarnOn(\n run: ToolRunner,\n ccy: string,\n json: boolean,\n): Promise<void> {\n const details = await getBalanceDetails(run, ccy);\n const detail = details.find((d) => d.ccy === ccy);\n if (!detail) {\n errorLine(`Currency ${ccy} not found in account balance`);\n process.exitCode = 1;\n return;\n }\n\n const earnType = inferEarnType(detail);\n if (earnType === null) {\n errorLine(`${ccy} does not support auto-earn`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(\"earn_auto_set\", { ccy, action: \"turn_on\", earnType });\n\n if (json) { printJson(result.data); return; }\n outputLine(`Auto-earn enabled for ${ccy} (${earnTypeLabel(earnType)})`);\n}\n\nexport async function cmdAutoEarnOff(\n run: ToolRunner,\n ccy: string,\n json: boolean,\n): Promise<void> {\n const details = await getBalanceDetails(run, ccy);\n const detail = details.find((d) => d.ccy === ccy);\n if (!detail) {\n errorLine(`Currency ${ccy} not found in account balance`);\n process.exitCode = 1;\n return;\n }\n\n const earnType = inferEarnType(detail);\n if (earnType === null) {\n errorLine(`${ccy} does not support auto-earn`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(\"earn_auto_set\", { ccy, action: \"turn_off\", earnType });\n\n if (json) { printJson(result.data); return; }\n outputLine(`Auto-earn disabled for ${ccy} (${earnTypeLabel(earnType)})`);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, errorLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction emitWriteResult(item: Record<string, unknown> | undefined, label: string, idKey: string): void {\n const isError = item?.[\"sCode\"] !== \"0\" && item?.[\"sCode\"] !== 0;\n if (isError) {\n errorLine(`Error: ${item?.[\"sMsg\"]} (sCode ${item?.[\"sCode\"]})`);\n } else {\n outputLine(`${label}: ${item?.[idKey]} (OK)`);\n }\n}\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdGridOrders(\n run: ToolRunner,\n opts: {\n algoOrdType: string;\n instId?: string;\n algoId?: string;\n status: \"active\" | \"history\";\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_get_orders\", {\n algoOrdType: opts.algoOrdType,\n instId: opts.instId,\n algoId: opts.algoId,\n status: opts.status,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { outputLine(\"No grid bots\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"algoOrdType\"],\n state: o[\"state\"],\n pnl: o[\"pnlRatio\"],\n gridNum: o[\"gridNum\"],\n maxPx: o[\"maxPx\"],\n minPx: o[\"minPx\"],\n createdAt: new Date(Number(o[\"cTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdGridDetails(\n run: ToolRunner,\n opts: { algoOrdType: string; algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"grid_get_order_details\", {\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n });\n const detail = ((getData(result) as Record<string, unknown>[]) ?? [])[0];\n if (!detail) { outputLine(\"Bot not found\"); return; }\n if (opts.json) return printJson(detail);\n printKv({\n algoId: detail[\"algoId\"],\n instId: detail[\"instId\"],\n type: detail[\"algoOrdType\"],\n state: detail[\"state\"],\n maxPx: detail[\"maxPx\"],\n minPx: detail[\"minPx\"],\n gridNum: detail[\"gridNum\"],\n runType: detail[\"runType\"] === \"1\" ? \"arithmetic\" : \"geometric\",\n pnl: detail[\"pnl\"],\n pnlRatio: detail[\"pnlRatio\"],\n investAmt: detail[\"investAmt\"],\n totalAnnRate: detail[\"totalAnnRate\"],\n createdAt: new Date(Number(detail[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdGridSubOrders(\n run: ToolRunner,\n opts: {\n algoOrdType: string;\n algoId: string;\n type: \"filled\" | \"live\";\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_get_sub_orders\", {\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n type: opts.type,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { outputLine(\"No sub-orders\"); return; }\n printTable(\n orders.map((o) => ({\n ordId: o[\"ordId\"],\n side: o[\"side\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillPx: o[\"fillPx\"],\n fillSz: o[\"fillSz\"],\n state: o[\"state\"],\n fee: o[\"fee\"],\n })),\n );\n}\n\nexport async function cmdGridCreate(\n run: ToolRunner,\n opts: {\n instId: string;\n algoOrdType: string;\n maxPx: string;\n minPx: string;\n gridNum: string;\n runType?: string;\n quoteSz?: string;\n baseSz?: string;\n direction?: string;\n lever?: string;\n sz?: string;\n basePos?: boolean;\n tpTriggerPx?: string;\n slTriggerPx?: string;\n tpRatio?: string;\n slRatio?: string;\n algoClOrdId?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_create_order\", {\n instId: opts.instId,\n algoOrdType: opts.algoOrdType,\n maxPx: opts.maxPx,\n minPx: opts.minPx,\n gridNum: opts.gridNum,\n runType: opts.runType,\n quoteSz: opts.quoteSz,\n baseSz: opts.baseSz,\n direction: opts.direction,\n lever: opts.lever,\n sz: opts.sz,\n basePos: opts.basePos,\n tpTriggerPx: opts.tpTriggerPx,\n slTriggerPx: opts.slTriggerPx,\n tpRatio: opts.tpRatio,\n slRatio: opts.slRatio,\n algoClOrdId: opts.algoClOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n emitWriteResult(data?.[0], \"Grid bot created\", \"algoId\");\n}\n\nexport async function cmdGridStop(\n run: ToolRunner,\n opts: {\n algoId: string;\n algoOrdType: string;\n instId: string;\n stopType?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_stop_order\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n instId: opts.instId,\n stopType: opts.stopType,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n emitWriteResult(data?.[0], \"Grid bot stopped\", \"algoId\");\n}\n\n// ---------------------------------------------------------------------------\n// DCA (Spot & Contract) commands\n// ---------------------------------------------------------------------------\n\nexport async function cmdDcaCreate(\n run: ToolRunner,\n opts: {\n instId: string;\n algoOrdType: string;\n lever?: string;\n direction: string;\n initOrdAmt: string;\n maxSafetyOrds: string;\n tpPct: string;\n safetyOrdAmt?: string;\n pxSteps?: string;\n pxStepsMult?: string;\n volMult?: string;\n slPct?: string;\n slMode?: string;\n allowReinvest?: string;\n triggerStrategy?: string;\n triggerPx?: string;\n triggerCond?: string;\n thold?: string;\n timeframe?: string;\n timePeriod?: string;\n algoClOrdId?: string;\n reserveFunds?: string;\n tradeQuoteCcy?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"dca_create_order\", {\n instId: opts.instId,\n algoOrdType: opts.algoOrdType,\n lever: opts.lever,\n direction: opts.direction,\n initOrdAmt: opts.initOrdAmt,\n maxSafetyOrds: opts.maxSafetyOrds,\n tpPct: opts.tpPct,\n safetyOrdAmt: opts.safetyOrdAmt,\n pxSteps: opts.pxSteps,\n pxStepsMult: opts.pxStepsMult,\n volMult: opts.volMult,\n slPct: opts.slPct,\n slMode: opts.slMode,\n allowReinvest: opts.allowReinvest,\n triggerStrategy: opts.triggerStrategy,\n triggerPx: opts.triggerPx,\n triggerCond: opts.triggerCond,\n thold: opts.thold,\n timeframe: opts.timeframe,\n timePeriod: opts.timePeriod,\n algoClOrdId: opts.algoClOrdId,\n reserveFunds: opts.reserveFunds,\n tradeQuoteCcy: opts.tradeQuoteCcy,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"DCA bot created\", \"algoId\");\n}\n\nexport async function cmdDcaStop(\n run: ToolRunner,\n opts: { algoId: string; algoOrdType: string; stopType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_stop_order\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n stopType: opts.stopType,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n emitWriteResult(data?.[0], \"DCA bot stopped\", \"algoId\");\n}\n\nexport async function cmdDcaOrders(\n run: ToolRunner,\n opts: { algoOrdType?: string; algoId?: string; instId?: string; history: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_orders\", {\n status: opts.history ? \"history\" : \"active\",\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n instId: opts.instId,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { outputLine(\"No DCA bots\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"algoOrdType\"],\n state: o[\"state\"],\n pnl: o[\"pnl\"],\n pnlRatio: o[\"pnlRatio\"],\n createdAt: new Date(Number(o[\"cTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdDcaDetails(\n run: ToolRunner,\n opts: { algoId: string; algoOrdType: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_order_details\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n });\n const detail = ((getData(result) as Record<string, unknown>[]) ?? [])[0];\n if (!detail) { outputLine(\"DCA bot not found\"); return; }\n if (opts.json) return printJson(detail);\n printKv({\n algoId: detail[\"algoId\"],\n algoOrdType: detail[\"algoOrdType\"],\n instId: detail[\"instId\"],\n sz: detail[\"sz\"],\n avgPx: detail[\"avgPx\"],\n initPx: detail[\"initPx\"],\n tpPx: detail[\"tpPx\"],\n slPx: detail[\"slPx\"] || \"-\",\n upl: detail[\"upl\"],\n fee: detail[\"fee\"],\n fundingFee: detail[\"fundingFee\"],\n curCycleId: detail[\"curCycleId\"],\n fillSafetyOrds: detail[\"fillSafetyOrds\"],\n createdAt: new Date(Number(detail[\"startTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdDcaSubOrders(\n run: ToolRunner,\n opts: { algoId: string; algoOrdType: string; cycleId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_sub_orders\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n cycleId: opts.cycleId,\n });\n const rows = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(rows);\n if (!rows.length) { outputLine(\"No sub-orders\"); return; }\n\n if (opts.cycleId) {\n // Orders within a cycle — fields from /orders endpoint\n printTable(\n rows.map((o) => ({\n ordId: o[\"ordId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n filledSz: o[\"filledSz\"],\n avgFillPx: o[\"avgFillPx\"],\n state: o[\"state\"],\n fee: o[\"fee\"],\n })),\n );\n } else {\n // Cycle list — fields from /cycle-list endpoint\n printTable(\n rows.map((o) => ({\n cycleId: o[\"cycleId\"],\n status: o[\"cycleStatus\"],\n current: o[\"currentCycle\"] ? \"yes\" : \"\",\n avgPx: o[\"avgPx\"],\n tpPx: o[\"tpPx\"],\n realizedPnl: o[\"realizedPnl\"],\n fee: o[\"fee\"],\n startTime: o[\"startTime\"] ? new Date(Number(o[\"startTime\"] as string)).toLocaleString() : \"\",\n })),\n );\n }\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport type { CliValues } from \"../parser.js\";\n\nexport function cmdOnchainEarnOffers(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_get_offers\", {\n productId: v.productId,\n protocolType: v.protocolType,\n ccy: v.ccy,\n });\n}\n\nexport function cmdOnchainEarnPurchase(run: ToolRunner, v: CliValues) {\n // Parse investData from ccy + amt flags\n const investData = v.ccy && v.amt ? [{ ccy: v.ccy, amt: v.amt }] : undefined;\n return run(\"onchain_earn_purchase\", {\n productId: v.productId,\n investData,\n term: v.term,\n tag: v.tag,\n });\n}\n\nexport function cmdOnchainEarnRedeem(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_redeem\", {\n ordId: v.ordId,\n protocolType: v.protocolType,\n allowEarlyRedeem: v.allowEarlyRedeem,\n });\n}\n\nexport function cmdOnchainEarnCancel(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_cancel\", {\n ordId: v.ordId,\n protocolType: v.protocolType,\n });\n}\n\nexport function cmdOnchainEarnActiveOrders(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_get_active_orders\", {\n productId: v.productId,\n protocolType: v.protocolType,\n ccy: v.ccy,\n state: v.state,\n });\n}\n\nexport function cmdOnchainEarnOrderHistory(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_get_order_history\", {\n productId: v.productId,\n protocolType: v.protocolType,\n ccy: v.ccy,\n });\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { outputLine, printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction extractArray(result: unknown): Record<string, unknown>[] {\n if (result && typeof result === \"object\") {\n const data = (result as Record<string, unknown>)[\"data\"];\n if (Array.isArray(data)) return data as Record<string, unknown>[];\n }\n return [];\n}\n\nfunction extractProducts(result: unknown): Record<string, unknown>[] {\n if (result && typeof result === \"object\") {\n const data = (result as Record<string, unknown>)[\"data\"];\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const products = (data as Record<string, unknown>)[\"products\"];\n if (Array.isArray(products)) return products as Record<string, unknown>[];\n }\n }\n return [];\n}\n\nexport async function cmdDcdPairs(run: ToolRunner, json: boolean): Promise<void> {\n const result = await run(\"dcd_get_currency_pairs\", {});\n const data = extractArray(result);\n if (json) { printJson(data); return; }\n if (!data.length) { outputLine(\"No currency pairs available\"); return; }\n printTable(data.map((r) => ({\n baseCcy: r[\"baseCcy\"],\n quoteCcy: r[\"quoteCcy\"],\n optType: r[\"optType\"],\n })));\n}\n\ntype ProductFilterOpts = {\n minYield?: number;\n strikeNear?: number;\n termDays?: number;\n minTermDays?: number;\n maxTermDays?: number;\n expDate?: string;\n};\n\nfunction filterByYield(data: Record<string, unknown>[], minYield: number): Record<string, unknown>[] {\n return data.filter((r) => {\n const y = parseFloat(r[\"annualizedYield\"] as string);\n return !isNaN(y) && y >= minYield;\n });\n}\n\nfunction filterByStrike(data: Record<string, unknown>[], ref: number): Record<string, unknown>[] {\n return data.filter((r) => {\n const strike = parseFloat(r[\"strike\"] as string);\n return !isNaN(strike) && Math.abs(strike - ref) / ref <= 0.1;\n });\n}\n\nfunction filterByTerm(\n data: Record<string, unknown>[],\n termDays?: number,\n minTermDays?: number,\n maxTermDays?: number,\n): Record<string, unknown>[] {\n const MS_PER_DAY = 86400_000;\n return data.filter((r) => {\n const exp = Number(r[\"expTime\"]);\n const start = Number(r[\"interestAccrualTime\"]);\n if (!exp || !start) return false;\n const days = Math.round((exp - start) / MS_PER_DAY);\n if (termDays !== undefined && days !== termDays) return false;\n if (minTermDays !== undefined && days < minTermDays) return false;\n if (maxTermDays !== undefined && days > maxTermDays) return false;\n return true;\n });\n}\n\nfunction filterByExpDate(data: Record<string, unknown>[], expDate: string): Record<string, unknown>[] {\n // Accept YYYY-MM-DD (day precision) or YYYY-MM-DDTHH:mm (hour precision)\n const hasTime = expDate.includes(\"T\") || expDate.includes(\" \");\n const precision = hasTime ? 13 : 10;\n const target = new Date(expDate).toISOString().slice(0, precision);\n return data.filter((r) => {\n const exp = Number(r[\"expTime\"]);\n if (!exp) return false;\n return new Date(exp).toISOString().slice(0, precision) === target;\n });\n}\n\nfunction applyProductFilters(data: Record<string, unknown>[], opts: ProductFilterOpts): Record<string, unknown>[] {\n if (opts.minYield !== undefined) data = filterByYield(data, opts.minYield);\n if (opts.strikeNear !== undefined) data = filterByStrike(data, opts.strikeNear);\n if (opts.termDays !== undefined || opts.minTermDays !== undefined || opts.maxTermDays !== undefined) {\n data = filterByTerm(data, opts.termDays, opts.minTermDays, opts.maxTermDays);\n }\n if (opts.expDate !== undefined) data = filterByExpDate(data, opts.expDate);\n return data;\n}\n\nexport async function cmdDcdProducts(\n run: ToolRunner,\n opts: { baseCcy?: string; quoteCcy?: string; optType?: string; json: boolean } & ProductFilterOpts,\n): Promise<void> {\n const result = await run(\"dcd_get_products\", {\n baseCcy: opts.baseCcy,\n quoteCcy: opts.quoteCcy,\n optType: opts.optType,\n });\n const data = applyProductFilters(extractProducts(result), opts);\n\n if (opts.json) { printJson(data); return; }\n if (!data.length) { outputLine(\"No products matched\"); return; }\n printTable(data.map((r) => ({\n productId: r[\"productId\"],\n baseCcy: r[\"baseCcy\"],\n quoteCcy: r[\"quoteCcy\"],\n optType: r[\"optType\"],\n strike: r[\"strike\"],\n // products endpoint returns decimal (e.g. 0.3423 = 34.23%) — multiply by 100\n annualizedYield: r[\"annualizedYield\"] ? `${(parseFloat(r[\"annualizedYield\"] as string) * 100).toFixed(2)}%` : \"—\",\n minSize: r[\"minSize\"],\n expTime: r[\"expTime\"] ? new Date(Number(r[\"expTime\"])).toLocaleDateString() : \"\",\n })));\n}\n\nexport async function cmdDcdRedeemExecute(\n run: ToolRunner,\n opts: { ordId: string; json: boolean },\n): Promise<void> {\n // Step 1: get redeem quote via dcd_redeem preview (no quoteId)\n const quoteResult = await run(\"dcd_redeem\", { ordId: opts.ordId });\n const quoteData = extractArray(quoteResult);\n const q = quoteData[0];\n if (!q) { outputLine(\"Failed to get redeem quote\"); return; }\n\n // Step 2: execute immediately via dcd_redeem with quoteId\n const redeemResult = await run(\"dcd_redeem\", {\n ordId: opts.ordId,\n quoteId: q[\"quoteId\"] as string,\n });\n const redeemData = extractArray(redeemResult);\n const r = redeemData[0];\n if (!r) { outputLine(\"No response data\"); return; }\n\n if (opts.json) {\n printJson({ quote: q, redeem: r });\n return;\n }\n\n printKv({\n ordId: r[\"ordId\"],\n state: r[\"state\"],\n redeemSz: q[\"redeemSz\"] ? `${parseFloat(q[\"redeemSz\"] as string).toFixed(8)} ${q[\"redeemCcy\"]}` : \"—\",\n termRate: (q[\"termRate\"] as string) ? `${q[\"termRate\"]}%` : \"—\",\n });\n}\n\nexport async function cmdDcdOrderState(\n run: ToolRunner,\n opts: { ordId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dcd_get_order_state\", { ordId: opts.ordId });\n const data = extractArray(result);\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { outputLine(\"Order not found\"); return; }\n printKv({\n ordId: r[\"ordId\"],\n state: r[\"state\"],\n productId: r[\"productId\"],\n strike: r[\"strike\"],\n notionalSz: r[\"notionalSz\"],\n settleTime: r[\"settleTime\"] ? new Date(Number(r[\"settleTime\"])).toLocaleDateString() : \"\",\n });\n}\n\nexport async function cmdDcdOrders(\n run: ToolRunner,\n opts: {\n ordId?: string;\n productId?: string;\n uly?: string;\n state?: string;\n beginId?: string;\n endId?: string;\n begin?: string;\n end?: string;\n limit?: number;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"dcd_get_orders\", {\n ordId: opts.ordId,\n productId: opts.productId,\n uly: opts.uly,\n state: opts.state,\n beginId: opts.beginId,\n endId: opts.endId,\n begin: opts.begin,\n end: opts.end,\n limit: opts.limit,\n });\n const data = extractArray(result);\n if (opts.json) { printJson(data); return; }\n if (!data.length) { outputLine(\"No orders found\"); return; }\n printTable(data.map((r) => ({\n ordId: r[\"ordId\"],\n productId: r[\"productId\"],\n state: r[\"state\"],\n baseCcy: r[\"baseCcy\"],\n quoteCcy: r[\"quoteCcy\"],\n strike: r[\"strike\"],\n notionalSz: r[\"notionalSz\"],\n annualizedYield: r[\"annualizedYield\"],\n yieldSz: r[\"yieldSz\"],\n settleTime: r[\"settleTime\"] ? new Date(Number(r[\"settleTime\"])).toLocaleDateString() : \"\", // scheduled settlement time\n settledTime: r[\"settledTime\"] ? new Date(Number(r[\"settledTime\"])).toLocaleDateString() : \"\", // actual settled time (non-empty only after settlement)\n })));\n}\n\nexport async function cmdDcdQuoteAndBuy(\n run: ToolRunner,\n opts: { productId: string; notionalSz: string; notionalCcy: string; clOrdId?: string; minAnnualizedYield?: number; json: boolean },\n): Promise<void> {\n // Atomic subscribe via dcd_subscribe (quote + execute in one step)\n const result = await run(\"dcd_subscribe\", {\n productId: opts.productId,\n notionalSz: opts.notionalSz,\n notionalCcy: opts.notionalCcy,\n clOrdId: opts.clOrdId,\n minAnnualizedYield: opts.minAnnualizedYield,\n }) as unknown as Record<string, unknown>;\n\n const tradeData = extractArray(result);\n const r = tradeData[0];\n const q = result[\"quote\"] as Record<string, unknown> | undefined;\n\n if (!r) { outputLine(\"No quote returned\"); return; }\n\n // Auto-query full order detail via dcd_get_orders (richer than dcd_get_order_state).\n // Wrapped in try/catch: a failure here must NOT mask the successful order placement.\n const ordId = r[\"ordId\"] as string | undefined;\n let stateRow: Record<string, unknown> | undefined;\n if (ordId) {\n try {\n const stateResult = await run(\"dcd_get_orders\", { ordId });\n stateRow = extractArray(stateResult)[0];\n } catch {\n // Secondary query failed — order was already placed, do not propagate\n }\n }\n\n if (opts.json) {\n printJson({ quote: q ?? null, order: r, state: stateRow ?? null });\n return;\n }\n\n if (q) {\n outputLine(\"Quote:\");\n printKv({\n quoteId: q[\"quoteId\"],\n annualizedYield: q[\"annualizedYield\"] ? `${q[\"annualizedYield\"]}%` : \"—\",\n absYield: q[\"absYield\"],\n notionalSz: q[\"notionalSz\"],\n notionalCcy: q[\"notionalCcy\"],\n });\n outputLine(\"\");\n }\n outputLine(\"Order placed:\");\n printKv({ ordId: r[\"ordId\"], quoteId: r[\"quoteId\"], state: r[\"state\"] ?? r[\"status\"] });\n if (stateRow) {\n outputLine(\"\");\n outputLine(\"Order state:\");\n printKv({\n ordId: stateRow[\"ordId\"],\n state: stateRow[\"state\"],\n productId: stateRow[\"productId\"],\n strike: stateRow[\"strike\"],\n notionalSz: stateRow[\"notionalSz\"],\n settleTime: stateRow[\"settleTime\"] ? new Date(Number(stateRow[\"settleTime\"])).toLocaleDateString() : \"\",\n });\n }\n}\n"],"mappings":"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","names":["createRequire","endPtr","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","fs","path","os","elapsed","path","messages","normalizeWrite","response","path","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","parse","os","fs","fs","fs","path","os","createRequire","_require","createRequire","path","fs","os","appData","maskKey","os","path","EOL","fs","path","EOL","path","fs","path","os","getData","getData","getData","emitWriteResult","emitBatchResults","getData","emitWriteResult","emitBatchResults","getData","emitWriteResult","emitBatchResults","spawnSync","emitWriteResult","getData","_require","createRequire","CLI_VERSION","GIT_HASH","CLI_VERSION","GIT_HASH","config"]}