@okx_ai/okx-trade-cli 1.3.0-beta.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../core/src/client/rest-client.ts","../../core/src/doh/binary.ts","../../core/src/doh/cache.ts","../../core/src/doh/resolver.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/tgtccy-conversion.ts","../../core/src/tools/algo-trade.ts","../../core/src/tools/audit.ts","../../core/src/utils/safe-file.ts","../../core/src/skills/downloader.ts","../../core/src/skills/extractor.ts","../../core/src/skills/parser.ts","../../core/src/skills/registry.ts","../../core/src/tools/skills.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/commands/upgrade.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","../src/commands/skill.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { OkxRestClient, toToolErrorPayload, checkForUpdates, createToolRunner, allToolSpecs, TradeLogger } 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 { cmdUpgrade } from \"./commands/upgrade.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 cmdMarketInstrumentsByCategory,\n cmdMarketIndicator,\n cmdMarketIndicatorList,\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 cmdEarnFixedOrderList,\n cmdEarnFixedPurchase,\n cmdEarnFixedRedeem,\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 {\n cmdSkillSearch,\n cmdSkillCategories,\n cmdSkillAdd,\n cmdSkillDownload,\n cmdSkillRemove,\n cmdSkillCheck,\n cmdSkillList,\n} from \"./commands/skill.js\";\nimport { markFailedIfSCodeError, outputLine, errorLine, setOutput, setEnvContext, setJsonEnvEnabled } 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 === \"instruments-by-category\")\n return cmdMarketInstrumentsByCategory(run, {\n instCategory: v.instCategory!,\n instType: v.instType,\n instId: v.instId,\n json,\n });\n if (action === \"indicator\") return handleIndicatorAction(run, rest, v, json);\n}\n\nfunction handleIndicatorAction(\n run: ToolRunner,\n rest: string[],\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n if (rest[0] === \"list\") return cmdMarketIndicatorList(json);\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\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, after: v.after, before: v.before, 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, v.valuation);\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 tgtCcy: v.tgtCcy,\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 if (action === \"fixed-orders\") return cmdEarnFixedOrderList(run, { ccy: v.ccy, state: v.state, json });\n if (action === \"fixed-purchase\") return cmdEarnFixedPurchase(run, { ccy: v.ccy!, amt: v.amt!, term: v.term!, confirm: v.confirm ?? false, json });\n if (action === \"fixed-redeem\") return cmdEarnFixedRedeem(run, { reqId: v.reqId!, 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 requireSkillName(rest: string[], usage: string): string | undefined {\n const name = rest[0];\n if (!name) { errorLine(usage); process.exitCode = 1; }\n return name;\n}\n\nfunction handleSkillAdd(rest: string[], config: import(\"@agent-tradekit/core\").OkxConfig, json: boolean): Promise<void> | void {\n const n = requireSkillName(rest, \"Usage: okx skill add <name>\");\n if (n) return cmdSkillAdd(n, config, json);\n}\n\nfunction handleSkillDownload(rest: string[], v: CliValues, config: import(\"@agent-tradekit/core\").OkxConfig, json: boolean): Promise<void> | void {\n const n = requireSkillName(rest, \"Usage: okx skill download <name> [--dir <path>]\");\n if (n) return cmdSkillDownload(n, v.dir ?? process.cwd(), config, json);\n}\n\nfunction handleSkillRemove(rest: string[], json: boolean): void {\n const n = requireSkillName(rest, \"Usage: okx skill remove <name>\");\n if (n) cmdSkillRemove(n, json);\n}\n\nfunction handleSkillCheck(run: ToolRunner, rest: string[], json: boolean): Promise<void> | void {\n const n = requireSkillName(rest, \"Usage: okx skill check <name>\");\n if (n) return cmdSkillCheck(run, n, json);\n}\n\nexport function handleSkillCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean,\n config: import(\"@agent-tradekit/core\").OkxConfig,\n): Promise<void> | void {\n if (action === \"search\") return cmdSkillSearch(run, { keyword: rest[0] ?? v.keyword, categories: v.categories, page: v.page, limit: v.limit, json });\n if (action === \"categories\") return cmdSkillCategories(run, json);\n if (action === \"list\") return cmdSkillList(json);\n if (action === \"add\") return handleSkillAdd(rest, config, json);\n if (action === \"download\") return handleSkillDownload(rest, v, config, json);\n if (action === \"remove\") return handleSkillRemove(rest, json);\n if (action === \"check\") return handleSkillCheck(run, rest, json);\n errorLine(`Unknown skill command: ${action}`);\n errorLine(\"Valid: search, categories, add, download, remove, check, list\");\n process.exitCode = 1;\n}\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\n/** Wrap a ToolRunner with audit logging via TradeLogger. */\nexport function wrapRunnerWithLogger(baseRunner: ToolRunner, logger: TradeLogger): ToolRunner {\n const writeToolNames = new Set(allToolSpecs().filter((t) => t.isWrite).map((t) => t.name));\n return async (toolName, args) => {\n const startTime = Date.now();\n try {\n const result = await baseRunner(toolName, args);\n if (writeToolNames.has(toolName)) {\n markFailedIfSCodeError(result.data);\n }\n logger.log(\"info\", toolName, args, result, Date.now() - startTime);\n return result;\n } catch (error) {\n logger.log(\"error\", toolName, args, error, Date.now() - startTime);\n throw error;\n }\n };\n}\n\n// Extracted to reduce cognitive complexity of main()\nasync function runDiagnose(v: ReturnType<typeof parseCli>[\"values\"]): Promise<void> {\n let config: ReturnType<typeof loadProfileConfig> | undefined;\n try {\n config = loadProfileConfig({ profile: v.profile, demo: v.demo, live: v.live, 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\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 if (module === \"upgrade\") return cmdUpgrade(CLI_VERSION, { beta: v.beta, check: v.check, force: v.force }, json);\n\n if (module === \"diagnose\") return runDiagnose(v);\n\n const config = loadProfileConfig({ profile: v.profile, demo: v.demo, live: v.live, verbose: v.verbose, userAgent: `okx-trade-cli/${CLI_VERSION}`, sourceTag: \"CLI\" });\n setEnvContext({ demo: config.demo, profile: v.profile ?? \"default\" });\n setJsonEnvEnabled(v.env ?? false);\n\n const client = new OkxRestClient(config);\n const baseRunner = createToolRunner(client, config);\n const logger = new TradeLogger(\"info\");\n const run = wrapRunnerWithLogger(baseRunner, logger);\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 skill: () => handleSkillCommand(run, action, rest, v, json, config),\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 { Agent, ProxyAgent } from \"undici\";\nimport { resolveDoh, reResolveDoh } from \"../doh/resolver.js\";\nimport { writeCache } from \"../doh/cache.js\";\nimport type { DohNode } from \"../doh/types.js\";\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 BinaryRequestOptions,\n BinaryResult,\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 // DoH proxy state (lazy-resolved on first request)\n private dohResolved = false;\n private dohRetried = false;\n private directUnverified = false; // The first direct connection has not yet been verified\n private dohNode: DohNode | null = null;\n private dohAgent: Agent | null = null;\n private dohBaseUrl: string | null = null;\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 /**\n * Lazily resolve the DoH proxy node on the first request.\n * Uses cache-first strategy via the resolver.\n */\n private ensureDoh(): void {\n if (this.dohResolved || this.dispatcher) return;\n this.dohResolved = true;\n try {\n const { hostname, protocol } = new URL(this.config.baseUrl);\n const result = resolveDoh(hostname);\n\n if (!result.mode) {\n // No cache → try direct first. If it works, we'll cache \"direct\".\n this.directUnverified = true;\n if (this.config.verbose) {\n vlog(\"DoH: no cache, trying direct connection first\");\n }\n return;\n }\n\n if (result.mode === \"direct\") {\n if (this.config.verbose) {\n vlog(\"DoH: mode=direct (overseas or cached), using direct connection\");\n }\n return;\n }\n\n // mode=proxy\n if (result.node) {\n this.applyDohNode(result.node, protocol);\n }\n } catch (err) {\n if (this.config.verbose) {\n const cause = err instanceof Error ? err.message : String(err);\n vlog(`DoH resolution failed, falling back to direct: ${cause}`);\n }\n }\n }\n\n /** Apply a DoH node: set up the custom Agent + base URL. */\n private applyDohNode(node: DohNode, protocol: string): void {\n this.dohNode = node;\n this.dohBaseUrl = `${protocol}//${node.host}`;\n this.dohAgent = new Agent({\n connect: {\n lookup: (\n _hostname,\n options,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback: any,\n ) => {\n if ((options as { all?: boolean })?.all) {\n callback(null, [{ address: node.ip, family: 4 }]);\n } else {\n callback(null, node.ip, 4);\n }\n },\n },\n });\n if (this.config.verbose) {\n vlog(`DoH proxy active: \\u2192 ${node.host} (${node.ip}), ttl=${node.ttl}s`);\n }\n }\n\n /**\n * Handle network failure: re-resolve with --exclude and retry once.\n * Returns true if retry should proceed, false if already retried.\n */\n private async handleDohNetworkFailure(): Promise<boolean> {\n if (this.dohRetried) return false;\n this.dohRetried = true;\n\n const failedIp = this.dohNode?.ip ?? \"\";\n const { hostname, protocol } = new URL(this.config.baseUrl);\n\n this.dohNode = null;\n this.dohAgent = null;\n this.dohBaseUrl = null;\n if (!failedIp) this.directUnverified = false;\n\n if (this.config.verbose) {\n vlog(failedIp\n ? `DoH: proxy node ${failedIp} failed, re-resolving with --exclude`\n : \"DoH: direct connection failed, calling binary for DoH resolution\");\n }\n\n try {\n const result = await reResolveDoh(hostname, failedIp, this.dohUserAgent);\n if (result.mode === \"proxy\" && result.node) {\n this.applyDohNode(result.node, protocol);\n this.dohRetried = false; // Considering that MCP is a resident process\n return true;\n }\n } catch {\n // resolution failed — fall through to direct\n }\n\n if (this.config.verbose) {\n vlog(\"DoH: re-resolution failed or switched to direct, retrying with direct connection\");\n }\n return true;\n }\n\n private get activeBaseUrl(): string {\n return this.dohNode ? this.dohBaseUrl! : this.config.baseUrl;\n }\n\n private get activeDispatcher(): Agent | ProxyAgent | undefined {\n return this.dispatcher ?? this.dohAgent ?? undefined;\n }\n\n /** User-Agent for DoH proxy requests: OKX/@okx_ai/{packageName}/{version} */\n private get dohUserAgent(): string {\n return `OKX/@okx_ai/${this.config.userAgent ?? \"unknown\"}`;\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 // ---------------------------------------------------------------------------\n // Binary (non-JSON) download — reuses auth, proxy, rate-limit, verbose\n // ---------------------------------------------------------------------------\n\n private static readonly DEFAULT_MAX_BYTES = 50 * 1024 * 1024; // 50 MB\n\n /**\n * Try to parse a text body as OKX JSON error and throw the appropriate error.\n * Re-throws OkxApiError / AuthenticationError / RateLimitError if matched.\n * Returns the parsed message string (or fallback) if no specific error was thrown.\n */\n private tryThrowJsonError(text: string, path: string, traceId: string | undefined): string {\n try {\n const parsed = JSON.parse(text) as { code?: string; msg?: string };\n if (parsed.code && parsed.code !== \"0\") {\n this.throwOkxError(parsed.code, parsed.msg, { method: \"POST\", path, auth: \"private\" } as RequestConfig, traceId);\n }\n return parsed.msg ?? \"\";\n } catch (e) {\n if (e instanceof OkxApiError || e instanceof AuthenticationError || e instanceof RateLimitError) throw e;\n return \"\";\n }\n }\n\n /**\n * Send a signed POST request and return the raw binary response.\n * Inherits all client capabilities: auth, proxy, rate-limit, verbose, user-agent.\n * Security: validates Content-Type and enforces maxBytes limit.\n */\n public async privatePostBinary(\n path: string,\n body?: Record<string, unknown>,\n opts?: BinaryRequestOptions,\n ): Promise<BinaryResult> {\n this.ensureDoh();\n\n const maxBytes = opts?.maxBytes ?? OkxRestClient.DEFAULT_MAX_BYTES;\n const expectedCT = opts?.expectedContentType ?? \"application/octet-stream\";\n const bodyJson = body ? JSON.stringify(body) : \"\";\n const endpoint = `POST ${path}`;\n\n this.logRequest(\"POST\", `${this.activeBaseUrl}${path}`, \"private\");\n\n const reqConfig = { method: \"POST\", path, auth: \"private\" } as RequestConfig;\n const headers = this.buildHeaders(reqConfig, path, bodyJson, getNow());\n if (this.dohNode) {\n headers.set(\"User-Agent\", this.dohUserAgent);\n }\n\n const t0 = Date.now();\n const response = await this.fetchBinary(path, endpoint, headers, bodyJson, t0);\n const elapsed = Date.now() - t0;\n const traceId = extractTraceId(response.headers);\n\n if (!response.ok) {\n const text = await response.text();\n this.logResponse(response.status, text.length, elapsed, traceId, String(response.status));\n const msg = this.tryThrowJsonError(text, path, traceId) || `HTTP ${response.status}`;\n throw new OkxApiError(msg, { code: String(response.status), endpoint, traceId });\n }\n\n const ct = response.headers.get(\"content-type\") ?? \"\";\n if (!ct.includes(expectedCT)) {\n const text = await response.text();\n this.logResponse(response.status, text.length, elapsed, traceId, \"unexpected-ct\");\n this.tryThrowJsonError(text, path, traceId);\n throw new OkxApiError(`Expected binary response (${expectedCT}) but got: ${ct}`, { code: \"UNEXPECTED_CONTENT_TYPE\", endpoint, traceId });\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n if (buffer.length > maxBytes) {\n throw new OkxApiError(`Response size ${buffer.length} bytes exceeds limit of ${maxBytes} bytes.`, { code: \"RESPONSE_TOO_LARGE\", endpoint, traceId });\n }\n\n if (this.config.verbose) {\n vlog(`\\u2190 ${response.status} | binary ${buffer.length}B | ${elapsed}ms | trace=${traceId ?? \"-\"}`);\n }\n\n return { endpoint, requestTime: new Date().toISOString(), data: buffer, contentType: ct, contentLength: buffer.length, traceId };\n }\n\n /** Execute fetch for binary endpoint, wrapping network errors. */\n private async fetchBinary(path: string, endpoint: string, headers: Headers, bodyJson: string, t0: number): Promise<Response> {\n try {\n const fetchOptions: Record<string, unknown> = {\n method: \"POST\", headers, body: bodyJson || undefined,\n signal: AbortSignal.timeout(this.config.timeoutMs),\n dispatcher: this.activeDispatcher,\n };\n return await fetch(`${this.activeBaseUrl}${path}`, fetchOptions as RequestInit);\n } catch (error) {\n if (this.config.verbose) {\n vlog(`\\u2717 NetworkError after ${Date.now() - t0}ms: ${error instanceof Error ? error.message : String(error)}`);\n }\n throw new NetworkError(`Failed to call OKX endpoint ${endpoint}.`, endpoint, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Header building\n // ---------------------------------------------------------------------------\n\n private buildHeaders(reqConfig: RequestConfig, requestPath: string, bodyJson: string, timestamp: string): Headers {\n const headers = new Headers({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n });\n\n // Direct connection UA (e.g. \"okx-trade-mcp/1.2.9\").\n // DoH proxy requests override this with dohUserAgent in request()/privatePostBinary().\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\n return headers;\n }\n\n // ---------------------------------------------------------------------------\n // JSON request\n // ---------------------------------------------------------------------------\n\n /**\n * Handle network error during a JSON request: refresh DoH and maybe retry.\n * Always either returns a retry result or throws NetworkError.\n */\n private async handleRequestNetworkError<TData>(\n error: unknown,\n reqConfig: RequestConfig,\n requestPath: string,\n t0: number,\n ): Promise<RequestResult<TData>> {\n // Network failure → refresh DoH state for subsequent requests\n if (!this.dohRetried) {\n if (this.config.verbose) {\n const cause = error instanceof Error ? error.message : String(error);\n vlog(`Network failure, refreshing DoH: ${cause}`);\n }\n const shouldRetry = await this.handleDohNetworkFailure();\n // Only auto-retry GET (safe & idempotent).\n // POST/write requests (orders, transfers) must NOT auto-retry:\n // DoH re-resolution takes seconds, price may have moved.\n if (shouldRetry && reqConfig.method === \"GET\") {\n return this.request(reqConfig);\n }\n }\n\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 /**\n * After a successful HTTP response on direct connection, cache mode=direct.\n * (Even if the business response is an error, the network path is valid.)\n */\n private cacheDirectConnectionIfNeeded(): void {\n if (!this.directUnverified || this.dohNode) return;\n this.directUnverified = false;\n const { hostname } = new URL(this.config.baseUrl);\n writeCache(hostname, {\n mode: \"direct\", node: null, failedNodes: [], updatedAt: Date.now(),\n });\n if (this.config.verbose) {\n vlog(\"DoH: direct connection succeeded, cached mode=direct\");\n }\n }\n\n private async request<TData = unknown>(\n reqConfig: RequestConfig,\n ): Promise<RequestResult<TData>> {\n this.ensureDoh();\n\n const queryString = buildQueryString(reqConfig.query);\n const requestPath = queryString.length > 0 ? `${reqConfig.path}?${queryString}` : reqConfig.path;\n\n // Route: proxy_url → DoH proxy → direct\n const url = `${this.activeBaseUrl}${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 = this.buildHeaders(reqConfig, requestPath, bodyJson, timestamp);\n if (this.dohNode) {\n headers.set(\"User-Agent\", this.dohUserAgent);\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 dispatcher: this.activeDispatcher,\n };\n response = await fetch(url, fetchOptions as RequestInit);\n } catch (error) {\n return await this.handleRequestNetworkError<TData>(error, reqConfig, requestPath, t0);\n }\n\n const rawText = await response.text();\n const elapsed = Date.now() - t0;\n const traceId = extractTraceId(response.headers);\n\n this.cacheDirectConnectionIfNeeded();\n\n return this.processResponse<TData>(rawText, response, elapsed, traceId, reqConfig, requestPath);\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { DohBinaryResponse, DohNode } from \"./types.js\";\n\n/** Default timeout for the DoH binary (ms). */\nconst EXEC_TIMEOUT_MS = 30_000;\n\n/** Directory under the user's home where the binary lives. */\nconst DOH_BIN_DIR = join(homedir(), \".okx\", \"bin\");\n\n/**\n * Return the expected path to the okx-doh-resolver binary.\n * Respects the `OKX_DOH_BINARY_PATH` environment variable.\n */\nexport function getDohBinaryPath(): string {\n if (process.env.OKX_DOH_BINARY_PATH) {\n return process.env.OKX_DOH_BINARY_PATH;\n }\n const ext = process.platform === \"win32\" ? \".exe\" : \"\";\n return join(DOH_BIN_DIR, `okx-doh-resolver${ext}`);\n}\n\n/**\n * Execute the okx-doh-resolver binary for the given domain.\n *\n * @returns The resolved DohNode, or null on any failure (binary missing,\n * timeout, non-zero exit, malformed output).\n */\nexport function execDohBinary(\n domain: string,\n exclude: string[] = [],\n userAgent?: string,\n): Promise<DohNode | null> {\n const binPath = getDohBinaryPath();\n const args = [\"--domain\", domain];\n if (exclude.length > 0) {\n args.push(\"--exclude\", exclude.join(\",\"));\n }\n if (userAgent) {\n args.push(\"--user-agent\", userAgent);\n }\n return new Promise((resolve) => {\n execFile(\n binPath,\n args,\n { timeout: EXEC_TIMEOUT_MS, encoding: \"utf-8\" },\n (error, stdout) => {\n if (error) {\n resolve(null);\n return;\n }\n try {\n const result: DohBinaryResponse = JSON.parse(stdout);\n if (result.code === 0 && result.data) {\n resolve(result.data);\n } else {\n resolve(null);\n }\n } catch {\n resolve(null);\n }\n },\n );\n });\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n renameSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\nimport type { DohCacheEntry, DohCacheFile } from \"./types.js\";\n\n/** Default cache file path. */\nexport const DOH_CACHE_PATH = join(homedir(), \".okx\", \"doh-node-cache.json\");\n\n/**\n * Read the cache entry for a specific hostname.\n * Returns null on any error (missing, corrupted, key absent).\n */\nexport function readCache(\n hostname: string,\n cachePath: string = DOH_CACHE_PATH,\n): DohCacheEntry | null {\n try {\n const raw = readFileSync(cachePath, \"utf-8\");\n const file = JSON.parse(raw) as DohCacheFile;\n return file[hostname] ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Write a cache entry for a specific hostname.\n * Merges with existing entries for other hostnames.\n * Writes atomically (write to .tmp then rename).\n */\nexport function writeCache(\n hostname: string,\n entry: DohCacheEntry,\n cachePath: string = DOH_CACHE_PATH,\n): void {\n try {\n const dir = dirname(cachePath);\n mkdirSync(dir, { recursive: true });\n\n let file: DohCacheFile = {};\n try {\n file = JSON.parse(readFileSync(cachePath, \"utf-8\")) as DohCacheFile;\n } catch {\n // File missing or corrupted — start fresh\n }\n\n file[hostname] = entry;\n const tmpPath = `${cachePath}.tmp`;\n writeFileSync(tmpPath, JSON.stringify(file));\n renameSync(tmpPath, cachePath);\n } catch {\n // Best-effort — do not crash\n }\n}\n\n/**\n * Delete the cache file. Does not throw.\n */\nexport function invalidateCache(\n cachePath: string = DOH_CACHE_PATH,\n): void {\n try {\n unlinkSync(cachePath);\n } catch {\n // File may not exist — ignore\n }\n}\n","import { execDohBinary } from \"./binary.js\";\nimport { readCache, writeCache } from \"./cache.js\";\nimport type { DohNode, FailedNode } from \"./types.js\";\n\n/** Failed nodes older than this are automatically removed (ms). */\nconst FAILED_NODE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\nexport interface ResolveResult {\n /** \"proxy\" | \"direct\" | null (binary missing/failed, fallback to direct) */\n mode: \"proxy\" | \"direct\" | null;\n /** The proxy node, if mode=proxy */\n node: DohNode | null;\n}\n\n/**\n * Classify a binary result into mode + write cache.\n * Shared by resolveDoh and reResolveDoh to avoid duplication.\n */\nfunction classifyAndCache(\n node: DohNode | null,\n hostname: string,\n failedNodes: FailedNode[],\n cachePath?: string,\n): ResolveResult {\n if (!node) {\n return { mode: null, node: null };\n }\n\n if (node.ip === hostname || node.host === hostname) {\n writeCache(hostname, {\n mode: \"direct\", node: null, failedNodes, updatedAt: Date.now(),\n }, cachePath);\n return { mode: \"direct\", node: null };\n }\n\n writeCache(hostname, {\n mode: \"proxy\", node, failedNodes, updatedAt: Date.now(),\n }, cachePath);\n return { mode: \"proxy\", node };\n}\n\n/**\n * Filter out failed nodes older than FAILED_NODE_TTL_MS.\n */\nfunction getActiveFailedNodes(nodes: FailedNode[] | undefined): FailedNode[] {\n if (!nodes || nodes.length === 0) return [];\n const now = Date.now();\n return nodes.filter((n) => now - n.failedAt < FAILED_NODE_TTL_MS);\n}\n\n/**\n * Resolve DoH with cache-first strategy\n * @param hostname - The target hostname (e.g. \"www.okx.com\")\n */\nexport function resolveDoh(hostname: string, cachePath?: string): ResolveResult {\n const entry = readCache(hostname, cachePath);\n if (entry) {\n if (entry.mode === \"direct\") {\n return { mode: \"direct\", node: null };\n }\n if (entry.mode === \"proxy\" && entry.node) {\n return { mode: \"proxy\", node: entry.node };\n }\n }\n\n // No cache → let caller try direct first.\n // If direct fails, handleDohNetworkFailure() will call the binary.\n return { mode: null, node: null };\n}\n\n/**\n * Re-resolve after a proxy node failure.\n * Calls binary with --exclude to skip the bad node, updates cache.\n *\n * @param hostname - The target hostname\n * @param failedIp - The IP that just failed\n */\nexport async function reResolveDoh(\n hostname: string,\n failedIp: string,\n userAgent?: string,\n cachePath?: string,\n): Promise<ResolveResult> {\n const entry = readCache(hostname, cachePath);\n const active = getActiveFailedNodes(entry?.failedNodes);\n\n // Append the newly failed IP (deduplicated)\n const now = Date.now();\n const alreadyFailed = failedIp && active.some((n) => n.ip === failedIp);\n const failedNodes: FailedNode[] = failedIp && !alreadyFailed\n ? [...active, { ip: failedIp, failedAt: now }]\n : active;\n\n const excludeIps = failedNodes.map((n) => n.ip);\n const node = await execDohBinary(hostname, excludeIps, userAgent);\n return classifyAndCache(node, hostname, failedNodes, cachePath);\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.\n// Default rule: name.toUpperCase().replace(/-/g, \"_\"), so only add entries that deviate.\nconst INDICATOR_CODE_OVERRIDES: Record<string, string> = {\n // Aliases\n \"boll\": \"BB\", // server supports BB not BOLL\n // Names where default rule produces underscores but backend uses no separator\n \"rainbow\": \"BTCRAINBOW\", // default: RAINBOW\n \"stoch-rsi\": \"STOCHRSI\", // default: STOCH_RSI\n \"bull-engulf\": \"BULLENGULF\", // default: BULL_ENGULF\n \"bear-engulf\": \"BEARENGULF\", // default: BEAR_ENGULF\n \"bull-harami\": \"BULLHARAMI\", // default: BULL_HARAMI\n \"bear-harami\": \"BEARHARAMI\", // default: BEAR_HARAMI\n \"bull-harami-cross\": \"BULLHARAMICROSS\",// default: BULL_HARAMI_CROSS\n \"bear-harami-cross\": \"BEARHARAMICROSS\",// default: BEAR_HARAMI_CROSS\n \"three-soldiers\": \"THREESOLDIERS\", // default: THREE_SOLDIERS\n \"three-crows\": \"THREECROWS\", // default: THREE_CROWS\n \"hanging-man\": \"HANGINGMAN\", // default: HANGING_MAN\n \"inverted-hammer\": \"INVERTEDH\", // default: INVERTED_HAMMER (backend uses INVERTEDH)\n \"shooting-star\": \"SHOOTINGSTAR\", // default: SHOOTING_STAR\n \"nvi-pvi\": \"NVIPVI\", // default: NVI_PVI\n \"top-long-short\": \"TOPLONGSHORT\", // default: TOP_LONG_SHORT\n // Note: range-filter → RANGE_FILTER is correct via the default rule; no override needed.\n};\n\n/** All indicators supported by the /api/v5/aigc/mcp/indicators endpoint. */\nexport const KNOWN_INDICATORS: ReadonlyArray<{ readonly name: string; readonly description: string }> = [\n // Moving Averages\n { name: \"ma\", description: \"Simple Moving Average\" },\n { name: \"ema\", description: \"Exponential Moving Average\" },\n { name: \"wma\", description: \"Weighted Moving Average\" },\n { name: \"dema\", description: \"Double Exponential Moving Average\" },\n { name: \"tema\", description: \"Triple Exponential Moving Average\" },\n { name: \"zlema\", description: \"Zero-Lag Exponential Moving Average\" },\n { name: \"hma\", description: \"Hull Moving Average\" },\n { name: \"kama\", description: \"Kaufman Adaptive Moving Average\" },\n // Trend\n { name: \"macd\", description: \"MACD\" },\n { name: \"sar\", description: \"Parabolic SAR\" },\n { name: \"adx\", description: \"Average Directional Index\" },\n { name: \"aroon\", description: \"Aroon Indicator\" },\n { name: \"cci\", description: \"Commodity Channel Index\" },\n { name: \"dpo\", description: \"Detrended Price Oscillator\" },\n { name: \"envelope\", description: \"Envelope\" },\n { name: \"halftrend\", description: \"HalfTrend\" },\n { name: \"alphatrend\", description: \"AlphaTrend\" },\n // Momentum\n { name: \"rsi\", description: \"Relative Strength Index\" },\n { name: \"stoch-rsi\", description: \"Stochastic RSI\" },\n { name: \"stoch\", description: \"Stochastic Oscillator\" },\n { name: \"roc\", description: \"Rate of Change\" },\n { name: \"mom\", description: \"Momentum\" },\n { name: \"ppo\", description: \"Price Percentage Oscillator\" },\n { name: \"trix\", description: \"TRIX\" },\n { name: \"ao\", description: \"Awesome Oscillator\" },\n { name: \"uo\", description: \"Ultimate Oscillator\" },\n { name: \"wr\", description: \"Williams %R\" },\n // Volatility\n { name: \"bb\", description: \"Bollinger Bands\" },\n { name: \"boll\", description: \"Bollinger Bands (alias for bb)\" },\n { name: \"bbwidth\", description: \"Bollinger Band Width\" },\n { name: \"bbpct\", description: \"Bollinger Band %B\" },\n { name: \"atr\", description: \"Average True Range\" },\n { name: \"keltner\", description: \"Keltner Channel\" },\n { name: \"donchian\", description: \"Donchian Channel\" },\n { name: \"hv\", description: \"Historical Volatility\" },\n { name: \"stddev\", description: \"Standard Deviation\" },\n // Volume\n { name: \"obv\", description: \"On-Balance Volume\" },\n { name: \"vwap\", description: \"Volume Weighted Average Price\" },\n { name: \"mvwap\", description: \"Moving VWAP\" },\n { name: \"cmf\", description: \"Chaikin Money Flow\" },\n { name: \"mfi\", description: \"Money Flow Index\" },\n { name: \"ad\", description: \"Accumulation/Distribution\" },\n // Statistical\n { name: \"lr\", description: \"Linear Regression\" },\n { name: \"slope\", description: \"Linear Regression Slope\" },\n { name: \"angle\", description: \"Linear Regression Angle\" },\n { name: \"variance\", description: \"Variance\" },\n { name: \"meandev\", description: \"Mean Deviation\" },\n { name: \"sigma\", description: \"Sigma\" },\n { name: \"stderr\", description: \"Standard Error\" },\n // Custom\n { name: \"kdj\", description: \"KDJ Stochastic Oscillator\" },\n { name: \"supertrend\", description: \"Supertrend\" },\n // Ichimoku\n { name: \"tenkan\", description: \"Ichimoku Tenkan-sen (Conversion Line)\" },\n { name: \"kijun\", description: \"Ichimoku Kijun-sen (Base Line)\" },\n { name: \"senkoa\", description: \"Ichimoku Senkou Span A (Leading Span A)\" },\n { name: \"senkob\", description: \"Ichimoku Senkou Span B (Leading Span B)\" },\n { name: \"chikou\", description: \"Ichimoku Chikou Span (Lagging Span)\" },\n // Candlestick Patterns\n { name: \"doji\", description: \"Doji candlestick pattern\" },\n { name: \"bull-engulf\", description: \"Bullish Engulfing pattern\" },\n { name: \"bear-engulf\", description: \"Bearish Engulfing pattern\" },\n { name: \"bull-harami\", description: \"Bullish Harami pattern\" },\n { name: \"bear-harami\", description: \"Bearish Harami pattern\" },\n { name: \"bull-harami-cross\", description: \"Bullish Harami Cross pattern\" },\n { name: \"bear-harami-cross\", description: \"Bearish Harami Cross pattern\" },\n { name: \"three-soldiers\", description: \"Three White Soldiers pattern\" },\n { name: \"three-crows\", description: \"Three Black Crows pattern\" },\n { name: \"hanging-man\", description: \"Hanging Man pattern\" },\n { name: \"inverted-hammer\", description: \"Inverted Hammer pattern\" },\n { name: \"shooting-star\", description: \"Shooting Star pattern\" },\n // Bitcoin On-Chain\n { name: \"ahr999\", description: \"AHR999 Bitcoin accumulation index\" },\n { name: \"rainbow\", description: \"Bitcoin Rainbow Chart\" },\n // Other\n { name: \"fisher\", description: \"Fisher Transform\" },\n { name: \"nvi-pvi\", description: \"Negative/Positive Volume Index (returns both)\" },\n { name: \"pmax\", description: \"PMAX\" },\n { name: \"qqe\", description: \"QQE Mod\" },\n { name: \"tdi\", description: \"Traders Dynamic Index\" },\n { name: \"waddah\", description: \"Waddah Attar Explosion\" },\n { name: \"range-filter\", description: \"Range Filter\" },\n { name: \"cho\", description: \"Chande Momentum Oscillator\" },\n { name: \"tr\", description: \"True Range\" },\n { name: \"tp\", description: \"Typical Price\" },\n { name: \"mp\", description: \"Median Price\" },\n { name: \"top-long-short\", description: \"Top Trader Long/Short Ratio (timeframe-independent)\" },\n] as const;\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). Call market_list_indicators to see all supported names.\",\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 name: \"market_list_indicators\",\n module: \"market\",\n description:\n \"List all supported technical indicator names and descriptions. Call this before market_get_indicator to discover valid indicator names. No credentials required.\",\n isWrite: false,\n inputSchema: { type: \"object\", properties: {} },\n handler: async () => ({ data: KNOWN_INDICATORS }),\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 \"skills\",\n] as const;\n\nexport type ModuleId = (typeof MODULES)[number];\n\nexport const DEFAULT_MODULES: ModuleId[] = [\"spot\", \"swap\", \"option\", \"account\", ...BOT_DEFAULT_SUB_MODULES, \"skills\"];\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. Optionally includes total asset valuation across all account types (trading, funding, earn, etc.).\",\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 showValuation: {\n type: \"boolean\",\n description:\n \"Include total asset valuation breakdown by account type (trading/funding/earn). Default false.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const ccy = readString(args, \"ccy\");\n const showValuation = readBoolean(args, \"showValuation\");\n if (showValuation) {\n const balanceResp = await context.client.privateGet(\n \"/api/v5/asset/balances\",\n compactObject({ ccy }),\n privateRateLimit(\"account_get_asset_balance\", 6),\n );\n let valuationData: unknown = null;\n try {\n const valuationResp = await context.client.privateGet(\n \"/api/v5/asset/asset-valuation\",\n {},\n privateRateLimit(\"account_get_asset_valuation\", 1),\n );\n valuationData = valuationResp.data;\n } catch {\n // valuation is best-effort; balance data is still returned\n }\n return { ...normalizeResponse(balanceResp), valuation: valuationData };\n }\n const balanceResp = await context.client.privateGet(\n \"/api/v5/asset/balances\",\n compactObject({ ccy }),\n privateRateLimit(\"account_get_asset_balance\", 6),\n );\n return normalizeResponse(balanceResp);\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 \"Note: `settleCcy` is the current settlement currency for USDS-margined contracts. \" +\n \"`settleCcyList` is the list of available settlement currencies to choose from. \" +\n \"These fields only apply to USDS-margined contracts and can be ignored for standard USDT/coin-margined trading.\",\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","/**\n * tgtCcy conversion layer for SWAP/FUTURES/OPTION orders.\n *\n * OKX API silently ignores tgtCcy for non-SPOT instruments, treating `sz`\n * as contract count regardless. This module detects the case and auto-converts\n * a USDT amount to contract count before the order is sent to the API.\n *\n * Supported modes:\n * - tgtCcy=quote_ccy: sz is nominal value (USDT).\n * Formula: contracts = floor(usdtAmount / (ctVal * lastPx), lotSz precision)\n * - tgtCcy=margin: sz is margin cost (USDT). Actual notional = sz * lever.\n * Formula: contracts = floor(marginAmount * lever / (ctVal * lastPx), lotSz precision)\n */\n\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nexport interface QuoteCcyResult {\n /** Resolved sz: either original value (passthrough) or converted contract count. */\n sz: string;\n /** Resolved tgtCcy: undefined after conversion (stripped from API request). */\n tgtCcy: string | undefined;\n /** Human-readable note about the conversion. Undefined if no conversion occurred. */\n conversionNote?: string;\n}\n\n/**\n * Minimal interface for the client methods we need. Allows easy mocking in tests\n * without depending on the full OkxRestClient class.\n */\ninterface ConversionClient {\n publicGet(\n endpoint: string,\n params: Record<string, unknown>,\n ...rest: unknown[]\n ): Promise<{ endpoint: string; requestTime: string; data: unknown }>;\n privateGet(\n endpoint: string,\n params: Record<string, unknown>,\n ...rest: unknown[]\n ): Promise<{ endpoint: string; requestTime: string; data: unknown }>;\n}\n\ninterface InstrumentParams {\n ctVal: number;\n ctValStr: string;\n minSz: number;\n minSzStr: string;\n lotSz: number;\n lotSzStr: string;\n}\n\nfunction extractInstrumentParams(instId: string, data: unknown): InstrumentParams {\n const instruments = Array.isArray(data) ? (data as Record<string, unknown>[]) : [];\n if (instruments.length === 0) {\n throw new Error(`Failed to fetch instrument info for ${instId}: empty instrument list. Cannot determine ctVal for conversion.`);\n }\n const inst = instruments[0];\n\n const ctValStr = String(inst.ctVal ?? \"\");\n const ctVal = parseFloat(ctValStr);\n if (!isFinite(ctVal) || ctVal <= 0) {\n throw new Error(`Invalid ctVal \"${ctValStr}\" for ${instId}. ctVal must be a positive number for conversion.`);\n }\n\n const minSzStr = String(inst.minSz ?? \"1\");\n const minSz = parseFloat(minSzStr);\n if (!isFinite(minSz) || minSz <= 0) {\n throw new Error(`Invalid minSz \"${minSzStr}\" for ${instId}. minSz must be a positive number for conversion.`);\n }\n\n const lotSzStr = String(inst.lotSz ?? \"1\");\n const lotSz = parseFloat(lotSzStr);\n if (!isFinite(lotSz) || lotSz <= 0) {\n throw new Error(`Invalid lotSz \"${lotSzStr}\" for ${instId}. lotSz must be a positive number for conversion.`);\n }\n\n return { ctVal, ctValStr, minSz, minSzStr, lotSz, lotSzStr };\n}\n\nfunction extractLastPx(instId: string, data: unknown): { lastPx: number; lastStr: string } {\n const tickers = Array.isArray(data) ? (data as Record<string, unknown>[]) : [];\n if (tickers.length === 0) {\n throw new Error(`Failed to fetch ticker price for ${instId}: empty ticker response. Cannot determine last price for conversion.`);\n }\n const lastStr = String(tickers[0].last ?? \"\");\n const lastPx = parseFloat(lastStr);\n if (!isFinite(lastPx) || lastPx <= 0) {\n throw new Error(`Invalid last price \"${lastStr}\" for ${instId}. Last price must be a positive number for conversion.`);\n }\n return { lastPx, lastStr };\n}\n\nfunction extractLeverage(instId: string, mgnMode: string, data: unknown): { lever: number; leverStr: string } {\n const leverageData = Array.isArray(data) ? (data as Record<string, unknown>[]) : [];\n if (leverageData.length === 0) {\n throw new Error(\n `Failed to fetch leverage info for ${instId} (mgnMode=${mgnMode}): empty response. ` +\n `Cannot determine leverage for margin conversion. Please set leverage first using set_leverage.`,\n );\n }\n const leverStr = String(leverageData[0].lever ?? \"1\");\n const lever = parseFloat(leverStr);\n if (!isFinite(lever) || lever <= 0) {\n throw new Error(`Invalid leverage \"${leverStr}\" for ${instId}. Leverage must be a positive number for margin conversion.`);\n }\n return { lever, leverStr };\n}\n\ninterface ConversionParams {\n instId: string;\n sz: string;\n isMarginMode: boolean;\n inst: InstrumentParams;\n lastPx: number;\n lastStr: string;\n lever: number;\n leverStr: string;\n}\n\nfunction computeContracts(p: ConversionParams): { contractsStr: string; conversionNote: string } {\n const { instId, sz, isMarginMode, inst, lastPx, lastStr, lever, leverStr } = p;\n const { ctVal, ctValStr, minSz, minSzStr, lotSz, lotSzStr } = inst;\n\n const userAmount = parseFloat(sz);\n const contractValue = ctVal * lastPx;\n const effectiveNotional = isMarginMode ? userAmount * lever : userAmount;\n const lotSzDecimals = lotSzStr.includes(\".\") ? lotSzStr.split(\".\")[1].length : 0;\n const precision = 10 ** (lotSzDecimals + 4);\n const rawContracts = Math.round((effectiveNotional / contractValue) * precision) / precision;\n const rawLots = Math.round((rawContracts / lotSz) * precision) / precision;\n const contractsRounded = parseFloat((Math.floor(rawLots) * lotSz).toFixed(lotSzDecimals));\n\n if (contractsRounded < minSz) {\n const minAmount = isMarginMode\n ? (minSz * contractValue / lever).toFixed(2)\n : (minSz * contractValue).toFixed(2);\n const unit = isMarginMode ? \"USDT margin\" : \"USDT\";\n throw new Error(\n `sz=${sz} ${unit} is too small for ${instId}. ` +\n `Minimum order size is ${minSzStr} contracts (≈ ${minAmount} ${unit}). ` +\n `(ctVal=${ctValStr}, lastPx=${lastStr}, minSz=${minSzStr}, lotSz=${lotSzStr}` +\n (isMarginMode ? `, lever=${leverStr}` : \"\") + `).\\n`,\n );\n }\n\n const contractsStr = contractsRounded.toFixed(lotSzDecimals);\n const conversionNote = isMarginMode\n ? `Converting ${sz} USDT margin (${leverStr}x leverage) → ${contractsStr} contracts ` +\n `(notional value ≈ ${(contractsRounded * contractValue).toFixed(2)} USDT, ` +\n `ctVal=${ctValStr}, lastPx=${lastStr}, lever=${leverStr}, minSz=${minSzStr}, lotSz=${lotSzStr})`\n : `Converting ${sz} USDT → ${contractsStr} contracts ` +\n `(ctVal=${ctValStr}, lastPx=${lastStr}, minSz=${minSzStr}, lotSz=${lotSzStr})`;\n\n return { contractsStr, conversionNote };\n}\n\n/**\n * Resolve the sz parameter for a contract order.\n *\n * Fast path: if tgtCcy is undefined or \"base_ccy\", returns unchanged.\n * Throws ValidationError for unknown tgtCcy values.\n * Conversion: fetches instrument params + ticker (+ leverage for margin mode),\n * then delegates to computeContracts() for the math.\n */\nexport async function resolveQuoteCcySz(\n instId: string,\n sz: string,\n tgtCcy: string | undefined,\n instType: string,\n client: OkxRestClient | ConversionClient,\n tdMode?: string,\n): Promise<QuoteCcyResult> {\n // passthrough: undefined or base_ccy (default behavior, no conversion needed)\n if (tgtCcy === undefined || tgtCcy === \"base_ccy\") {\n return { sz, tgtCcy, conversionNote: undefined };\n }\n // only quote_ccy and margin enter conversion\n if (tgtCcy !== \"quote_ccy\" && tgtCcy !== \"margin\") {\n throw new ValidationError(\n `Unknown tgtCcy value \"${tgtCcy}\". Valid values: base_ccy, quote_ccy, margin.`,\n `Check the --tgtCcy flag. Use base_ccy (default, sz in contracts), quote_ccy (sz in USDT notional), or margin (sz in USDT margin cost).`,\n );\n }\n\n const isMarginMode = tgtCcy === \"margin\";\n if (isMarginMode && !tdMode) {\n throw new Error(\n \"tdMode (cross or isolated) is required when tgtCcy=margin. \" +\n \"Cannot determine leverage without knowing the margin mode.\",\n );\n }\n\n const mgnMode = tdMode === \"cross\" ? \"cross\" : \"isolated\";\n const fetchPromises: Promise<{ endpoint: string; requestTime: string; data: unknown }>[] = [\n (client as ConversionClient).publicGet(\"/api/v5/public/instruments\", { instType, instId }),\n (client as ConversionClient).publicGet(\"/api/v5/market/ticker\", { instId }),\n ];\n if (isMarginMode) {\n fetchPromises.push((client as ConversionClient).privateGet(\"/api/v5/account/leverage-info\", { instId, mgnMode }));\n }\n const results = await Promise.all(fetchPromises);\n\n const inst = extractInstrumentParams(instId, results[0].data);\n const { lastPx, lastStr } = extractLastPx(instId, results[1].data);\n const { lever, leverStr } = isMarginMode\n ? extractLeverage(instId, mgnMode, results[2].data)\n : { lever: 1, leverStr: \"1\" };\n\n const { contractsStr, conversionNote } = computeContracts({\n instId, sz, isMarginMode, inst, lastPx, lastStr, lever, leverStr,\n });\n\n return { sz: contractsStr, tgtCcy: undefined, conversionNote };\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 { resolveQuoteCcySz } from \"./tgtccy-conversion.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\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n \"SWAP\",\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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 const result = normalizeResponse(response);\n if (resolved.conversionNote) {\n result._conversion = resolved.conversionNote;\n }\n return result;\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\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n \"FUTURES\",\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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 const result = normalizeResponse(response);\n if (resolved.conversionNote) {\n result._conversion = resolved.conversionNote;\n }\n return result;\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 { writeFileSync, renameSync, unlinkSync, mkdirSync } from \"node:fs\";\nimport { join, resolve, basename, sep } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Safely write binary data to a file.\n * - Writes to a .tmp file first, then atomically renames\n * - Validates the target path is within the expected directory\n * - Cleans up .tmp on failure\n */\nexport function safeWriteFile(\n targetDir: string,\n fileName: string,\n data: Buffer,\n): string {\n // Sanitize fileName: strip path components, use only basename\n const safeName = basename(fileName);\n if (!safeName || safeName === \".\" || safeName === \"..\") {\n throw new Error(`Invalid file name: \"${fileName}\"`);\n }\n\n const resolvedDir = resolve(targetDir);\n const filePath = join(resolvedDir, safeName);\n const resolvedPath = resolve(filePath);\n\n // Path traversal check: resolved path must be within target directory\n if (!resolvedPath.startsWith(resolvedDir + sep)) {\n throw new Error(`Path traversal detected: \"${fileName}\" resolves outside target directory`);\n }\n\n mkdirSync(resolvedDir, { recursive: true });\n\n // Atomic write: write to temp file, then rename\n const tmpPath = `${resolvedPath}.${randomUUID()}.tmp`;\n try {\n writeFileSync(tmpPath, data);\n renameSync(tmpPath, resolvedPath);\n } catch (err) {\n // Cleanup temp file on failure\n try { unlinkSync(tmpPath); } catch { /* ignore */ }\n throw err;\n }\n\n return resolvedPath;\n}\n\n/**\n * Validate that a zip entry path is safe (no path traversal, no symlinks in path).\n * Returns the resolved path within targetDir, or throws.\n */\nexport function validateZipEntryPath(targetDir: string, entryName: string): string {\n const resolvedDir = resolve(targetDir);\n const resolvedEntry = resolve(resolvedDir, entryName);\n\n // Must be within targetDir\n if (!resolvedEntry.startsWith(resolvedDir + sep) && resolvedEntry !== resolvedDir) {\n throw new Error(`Zip path traversal detected: \"${entryName}\" resolves outside extraction directory`);\n }\n\n return resolvedEntry;\n}\n","import type { OkxRestClient } from \"../client/rest-client.js\";\nimport { safeWriteFile } from \"../utils/safe-file.js\";\n\n/** Maximum download size: 50 MB */\nconst MAX_DOWNLOAD_BYTES = 50 * 1024 * 1024;\n\n/**\n * Download a skill zip from the marketplace API using OkxRestClient.\n * Inherits all client capabilities: auth, proxy, rate-limit, verbose, user-agent.\n *\n * Security:\n * - Content-Type validation (must be octet-stream)\n * - Size limit enforced (50 MB)\n * - Atomic file write via safeWriteFile (temp + rename)\n * - File name is fixed to `{name}.zip` (ignores server-supplied filename)\n *\n * Returns the file path of the saved zip.\n */\nexport async function downloadSkillZip(\n client: OkxRestClient,\n name: string,\n targetDir: string,\n): Promise<string> {\n const result = await client.privatePostBinary(\n \"/api/v5/skill/download\",\n { name },\n { maxBytes: MAX_DOWNLOAD_BYTES },\n );\n\n // Fixed filename — never trust server-supplied Content-Disposition\n const fileName = `${name}.zip`;\n const filePath = safeWriteFile(targetDir, fileName, result.data);\n\n return filePath;\n}\n","import yauzl from \"yauzl\";\nimport { createWriteStream, mkdirSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { validateZipEntryPath } from \"../utils/safe-file.js\";\n\n/** Limits for zip extraction to prevent abuse. */\nexport interface ExtractLimits {\n /** Maximum total extracted size in bytes. Default: 100 MB. */\n maxTotalBytes?: number;\n /** Maximum number of files in the zip. Default: 1000. */\n maxFiles?: number;\n /** Maximum compression ratio per entry. Default: 100. */\n maxCompressionRatio?: number;\n}\n\nconst DEFAULT_MAX_TOTAL_BYTES = 100 * 1024 * 1024; // 100 MB\nconst DEFAULT_MAX_FILES = 1000;\nconst DEFAULT_MAX_COMPRESSION_RATIO = 100;\n\n/** Mutable counters passed through entry validation. */\ninterface ExtractState {\n fileCount: number;\n totalBytes: number;\n}\n\n/**\n * Validate a single zip entry against all security checks.\n * Throws on violation. Returns the resolved output path on success.\n */\nfunction validateEntry(\n entry: yauzl.Entry,\n targetDir: string,\n state: ExtractState,\n limits: { maxFiles: number; maxTotalBytes: number; maxCompressionRatio: number },\n): string {\n // File count limit\n state.fileCount++;\n if (state.fileCount > limits.maxFiles) {\n throw new Error(\n `Zip contains more than ${limits.maxFiles} entries, exceeding limit of ${limits.maxFiles}. Possible zip bomb.`,\n );\n }\n\n // Path traversal check\n const resolvedPath = validateZipEntryPath(targetDir, entry.fileName);\n\n // Symlink check: Unix external attributes with symlink flag (0xA000)\n const externalAttrs = entry.externalFileAttributes;\n if (externalAttrs) {\n const unixMode = (externalAttrs >>> 16) & 0xFFFF;\n if ((unixMode & 0o120000) === 0o120000) {\n throw new Error(`Zip entry \"${entry.fileName}\" is a symlink. Symlinks are not allowed for security.`);\n }\n }\n\n // Compression ratio check: detect single-entry zip bombs\n if (entry.compressedSize > 0) {\n const ratio = entry.uncompressedSize / entry.compressedSize;\n if (ratio > limits.maxCompressionRatio) {\n throw new Error(\n `Zip entry \"${entry.fileName}\" has compression ratio ${ratio.toFixed(1)}, exceeding limit of ${limits.maxCompressionRatio}. Possible zip bomb.`,\n );\n }\n }\n\n // Zip bomb check: accumulated uncompressed size\n state.totalBytes += entry.uncompressedSize;\n if (state.totalBytes > limits.maxTotalBytes) {\n throw new Error(\n `Extracted size ${state.totalBytes} bytes exceeds limit of ${limits.maxTotalBytes} bytes. Possible zip bomb.`,\n );\n }\n\n return resolvedPath;\n}\n\n/**\n * Safely extract a skill zip file to a target directory.\n *\n * Security measures (validated per-entry in validateEntry):\n * - Path traversal check: every entry path must resolve within targetDir\n * - Zip bomb protection: total extracted size capped at maxTotalBytes\n * - File count limit: prevents zip with excessive entries\n * - Symlink rejection: entries with symlink external attributes are rejected\n *\n * Returns the target directory path.\n */\nexport async function extractSkillZip(\n zipPath: string,\n targetDir: string,\n limits?: ExtractLimits,\n): Promise<string> {\n const maxTotalBytes = limits?.maxTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES;\n const maxFiles = limits?.maxFiles ?? DEFAULT_MAX_FILES;\n const maxCompressionRatio = limits?.maxCompressionRatio ?? DEFAULT_MAX_COMPRESSION_RATIO;\n const resolvedTarget = resolve(targetDir);\n\n mkdirSync(resolvedTarget, { recursive: true });\n\n // Security: archive expansion is guarded by validateEntry() which enforces\n // file count limits, size limits, path traversal checks, and symlink rejection.\n return new Promise<string>((resolvePromise, reject) => {\n yauzl.open(zipPath, { lazyEntries: true }, (err, zipfile) => {\n if (err) return reject(err);\n\n const state: ExtractState = { fileCount: 0, totalBytes: 0 };\n\n zipfile.readEntry();\n zipfile.on(\"entry\", (entry: yauzl.Entry) => {\n if (entry.fileName.endsWith(\"/\")) { zipfile.readEntry(); return; }\n\n let resolvedPath: string;\n try {\n resolvedPath = validateEntry(entry, resolvedTarget, state, { maxFiles, maxTotalBytes, maxCompressionRatio });\n } catch (e) {\n zipfile.close();\n return reject(e);\n }\n\n zipfile.openReadStream(entry, (streamErr, readStream) => {\n if (streamErr) { zipfile.close(); return reject(streamErr); }\n mkdirSync(dirname(resolvedPath), { recursive: true });\n const writeStream = createWriteStream(resolvedPath);\n readStream.pipe(writeStream);\n writeStream.on(\"close\", () => zipfile.readEntry());\n writeStream.on(\"error\", (writeErr) => { zipfile.close(); reject(writeErr); });\n });\n });\n\n zipfile.on(\"end\", () => resolvePromise(resolvedTarget));\n zipfile.on(\"error\", reject);\n });\n });\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SkillMeta } from \"./types.js\";\n\n/**\n * Read and parse _meta.json from an extracted skill directory.\n * Throws if _meta.json is missing or invalid.\n */\nexport function readMetaJson(contentDir: string): SkillMeta {\n const metaPath = join(contentDir, \"_meta.json\");\n if (!existsSync(metaPath)) {\n throw new Error(`_meta.json not found in ${contentDir}. Invalid skill package.`);\n }\n\n const raw = readFileSync(metaPath, \"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Failed to parse _meta.json: invalid JSON`);\n }\n\n const meta = parsed as Record<string, unknown>;\n if (typeof meta.name !== \"string\" || !meta.name) {\n throw new Error(`_meta.json: \"name\" field is required`);\n }\n if (typeof meta.version !== \"string\" || !meta.version) {\n throw new Error(`_meta.json: \"version\" field is required`);\n }\n\n return {\n name: String(meta.name),\n version: String(meta.version),\n title: typeof meta.title === \"string\" ? meta.title : \"\",\n description: typeof meta.description === \"string\" ? meta.description : \"\",\n };\n}\n\n/**\n * Validate that SKILL.md exists in the extracted skill directory.\n */\nexport function validateSkillMdExists(contentDir: string): void {\n const skillMdPath = join(contentDir, \"SKILL.md\");\n if (!existsSync(skillMdPath)) {\n throw new Error(`SKILL.md not found in ${contentDir}. Invalid skill package.`);\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { SkillMeta, SkillRecord, SkillRegistry } from \"./types.js\";\n\nconst DEFAULT_REGISTRY_PATH = join(homedir(), \".okx\", \"skills\", \"registry.json\");\n\n/** Read the local skill registry. Returns empty registry if file doesn't exist. */\nexport function readRegistry(registryPath = DEFAULT_REGISTRY_PATH): SkillRegistry {\n if (!existsSync(registryPath)) {\n return { version: 1, skills: {} };\n }\n try {\n const raw = readFileSync(registryPath, \"utf-8\");\n return JSON.parse(raw) as SkillRegistry;\n } catch {\n return { version: 1, skills: {} };\n }\n}\n\n/** Write the registry back to disk. */\nexport function writeRegistry(registry: SkillRegistry, registryPath = DEFAULT_REGISTRY_PATH): void {\n mkdirSync(dirname(registryPath), { recursive: true });\n writeFileSync(registryPath, JSON.stringify(registry, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/** Add or update a skill record from _meta.json data. */\nexport function upsertSkillRecord(meta: SkillMeta, registryPath = DEFAULT_REGISTRY_PATH): void {\n const registry = readRegistry(registryPath);\n const now = new Date().toISOString();\n const existing = registry.skills[meta.name];\n\n registry.skills[meta.name] = {\n name: meta.name,\n version: meta.version,\n description: meta.description,\n installedAt: existing?.installedAt ?? now,\n updatedAt: now,\n source: \"marketplace\",\n };\n\n writeRegistry(registry, registryPath);\n}\n\n/** Remove a skill from the registry. Returns true if the skill was found and removed. */\nexport function removeSkillRecord(name: string, registryPath = DEFAULT_REGISTRY_PATH): boolean {\n const registry = readRegistry(registryPath);\n if (!(name in registry.skills)) return false;\n delete registry.skills[name];\n writeRegistry(registry, registryPath);\n return true;\n}\n\n/** Get a single skill record by name. */\nexport function getSkillRecord(name: string, registryPath = DEFAULT_REGISTRY_PATH): SkillRecord | undefined {\n const registry = readRegistry(registryPath);\n return registry.skills[name];\n}\n\n/** Get the registry file path (for display). */\nexport function getRegistryPath(): string {\n return DEFAULT_REGISTRY_PATH;\n}\n","import type { ToolSpec, ToolArgs, ToolContext } from \"./types.js\";\nimport { downloadSkillZip } from \"../skills/index.js\";\n\nexport function registerSkillsTools(): ToolSpec[] {\n return [\n {\n name: \"skills_get_categories\",\n module: \"skills\",\n description:\n \"List all available skill categories in OKX Skills Marketplace. \" +\n \"Use the returned categoryId as input to skills_search for category filtering. \" +\n \"Do NOT use for searching or downloading skills — use skills_search or skills_download.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n isWrite: false,\n handler: handleGetCategories,\n },\n {\n name: \"skills_search\",\n module: \"skills\",\n description:\n \"Search for skills in OKX Skills Marketplace by keyword or category. \" +\n \"To get valid category IDs, call skills_get_categories first. \" +\n \"Returns skill names for use with skills_download. \" +\n \"Do NOT use for downloading — use skills_download.\",\n inputSchema: {\n type: \"object\",\n properties: {\n keyword: {\n type: \"string\",\n description: \"Search keyword (matches name, description, tags)\",\n },\n categories: {\n type: \"string\",\n description: \"Filter by category ID\",\n },\n page: {\n type: \"string\",\n description: \"Page number, starting from 1. Default: 1\",\n },\n limit: {\n type: \"string\",\n description: \"Results per page. Default: 20, max: 100\",\n },\n },\n additionalProperties: false,\n },\n isWrite: false,\n handler: handleSearch,\n },\n {\n name: \"skills_download\",\n module: \"skills\",\n description:\n \"Download a skill zip file from OKX Skills Marketplace to a local directory. \" +\n \"Always call skills_search first to confirm the skill name exists. \" +\n \"Downloads the latest approved version. \" +\n \"NOTE: Downloads third-party developer content as a zip — does NOT install to agents. \" +\n \"For full installation use CLI: okx skill add <name>. \" +\n \"Use when the user wants to inspect or manually install a skill package.\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"Skill name (unique identifier)\",\n },\n targetDir: {\n type: \"string\",\n description: \"Directory path where the zip file will be saved\",\n },\n },\n required: [\"name\", \"targetDir\"],\n additionalProperties: false,\n },\n isWrite: true,\n handler: handleDownload,\n },\n ];\n}\n\nasync function handleGetCategories(\n _args: ToolArgs,\n ctx: ToolContext,\n): Promise<unknown> {\n const result = await ctx.client.privateGet(\n \"/api/v5/skill/categories\",\n );\n return result;\n}\n\nasync function handleSearch(\n args: ToolArgs,\n ctx: ToolContext,\n): Promise<unknown> {\n const query: Record<string, string> = {};\n if (args.keyword) query.keyword = String(args.keyword);\n if (args.categories) query.categories = String(args.categories);\n if (args.page) query.page = String(args.page);\n if (args.limit) query.limit = String(args.limit);\n\n const result = await ctx.client.privateGet(\n \"/api/v5/skill/search\",\n query,\n );\n // totalPage is returned at the top level of the API response (not inside data)\n const totalPage = result.raw?.totalPage as string | undefined;\n return { ...result, totalPage };\n}\n\nasync function handleDownload(\n args: ToolArgs,\n ctx: ToolContext,\n): Promise<unknown> {\n const name = String(args.name);\n const targetDir = String(args.targetDir);\n\n const filePath = await downloadSkillZip(ctx.client, name, targetDir);\n\n return {\n endpoint: \"POST /api/v5/skill/download\",\n requestTime: new Date().toISOString(),\n data: {\n name,\n filePath,\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/** Build triggerParams for dca_create_order. */\nfunction buildTriggerParam(\n args: Record<string, unknown>,\n algoOrdType: string,\n): Record<string, string> {\n const triggerStrategy = readString(args, \"triggerStrategy\") ?? \"instant\";\n\n if (triggerStrategy === \"price\" && algoOrdType === \"spot_dca\") {\n throw new OkxApiError(\n \"triggerStrategy 'price' is only supported for contract_dca. spot_dca supports: instant, rsi\",\n { code: \"VALIDATION\", endpoint: `${BASE}/create` },\n );\n }\n\n const param: Record<string, string> = { triggerAction: \"start\", triggerStrategy };\n\n if (triggerStrategy === \"price\") {\n param[\"triggerPx\"] = requireString(args, \"triggerPx\");\n const triggerCond = readString(args, \"triggerCond\");\n if (triggerCond) param[\"triggerCond\"] = triggerCond;\n } else if (triggerStrategy === \"rsi\") {\n param[\"triggerCond\"] = requireString(args, \"triggerCond\");\n param[\"thold\"] = requireString(args, \"thold\");\n param[\"timeframe\"] = requireString(args, \"timeframe\");\n param[\"timePeriod\"] = readString(args, \"timePeriod\") ?? \"14\";\n }\n\n return param;\n}\n\n/** Validate conditional required params when maxSafetyOrds > 0. */\nfunction validateSafetyOrderParams(\n args: Record<string, unknown>,\n maxSafetyOrds: string,\n): void {\n if (Number(maxSafetyOrds) <= 0) return;\n const required = [\"safetyOrdAmt\", \"pxSteps\", \"pxStepsMult\", \"volMult\"] as const;\n for (const field of required) {\n if (!readString(args, field)) {\n throw new OkxApiError(`${field} is required when maxSafetyOrds > 0`, {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n }\n}\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 const triggerParam = buildTriggerParam(args, algoOrdType);\n const maxSafetyOrds = requireString(args, \"maxSafetyOrds\");\n validateSafetyOrderParams(args, maxSafetyOrds);\n\n const allowReinvestRaw = args[\"allowReinvest\"];\n const allowReinvest = allowReinvestRaw !== undefined\n ? allowReinvestRaw === true || allowReinvestRaw === \"true\"\n : undefined;\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,\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 readBoolean,\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 for all currencies or a specific one. \" +\n \"To show market rates alongside balance (市场均利率), call earn_get_lending_rate_history. \" +\n \"earn_get_lending_rate_history also returns fixed-term (定期) product offers, so one call gives a complete view of both flexible and fixed options. \" +\n \"Do NOT use for fixed-term (定期) order queries — use earn_get_fixed_order_list 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_get_fixed_order_list\",\n module: \"earn.savings\",\n description:\n \"Get Simple Earn Fixed (定期赚币) lending order list. \" +\n \"Returns orders sorted by creation time descending. \" +\n \"Use this to check status of fixed-term lending orders (pending/earning/expired/settled/cancelled). \" +\n \"Do NOT use for flexible earn balance — use earn_get_savings_balance instead. \" +\n \"If the result is empty, do NOT display any fixed-term section in the output.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency, e.g. USDT. Omit for all.\",\n },\n state: {\n type: \"string\",\n description:\n \"Order state: pending (匹配中), earning (赚币中), expired (逾期), settled (已结算), cancelled (已撤销). 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/simple-earn-fixed/order-list\",\n compactObject({\n ccy: readString(args, \"ccy\"),\n state: readString(args, \"state\"),\n }),\n privateRateLimit(\"earn_get_fixed_order_list\", 3),\n );\n const result = normalizeResponse(response);\n if (Array.isArray(result[\"data\"])) {\n result[\"data\"] = (result[\"data\"] as Record<string, unknown>[]).map(\n ({ finalSettlementDate: _, ...rest }) => rest,\n );\n }\n return result;\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 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 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 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_fixed_purchase\",\n module: \"earn.savings\",\n description:\n \"Purchase Simple Earn Fixed (定期) product, two-step flow. \" +\n \"First call (confirm omitted or false): returns purchase preview with product details and risk warning. \" +\n \"Preview offer fields: lendQuota = remaining quota (剩余额度), soldOut = whether product is sold out (lendQuota is 0). \" +\n \"YOU MUST display the 'warning' field from the preview response to the user VERBATIM before asking for confirmation — do NOT omit or summarize it. \" +\n \"Second call (confirm=true): executes the purchase. Only proceed after the user explicitly confirms. \" +\n \"IMPORTANT: Orders in 'pending' (匹配中) state can still be cancelled via earn_fixed_redeem; once the status changes to 'earning' (赚币中), funds are LOCKED until maturity — no early redemption allowed.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency, e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Purchase amount\",\n },\n term: {\n type: \"string\",\n description: \"Term, e.g. 90D\",\n },\n confirm: {\n type: \"boolean\",\n description:\n \"Omit or false on the first call to preview the purchase details; \" +\n \"set to true on the second call to execute after user confirms.\",\n },\n },\n required: [\"ccy\", \"amt\", \"term\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const ccy = requireString(args, \"ccy\");\n const amt = requireString(args, \"amt\");\n const term = requireString(args, \"term\");\n const confirm = readBoolean(args, \"confirm\") ?? false;\n\n if (!confirm) {\n // First call: preview mode — fetch offer + current rate, no state change\n const [rateResponse, fixedResponse] = await Promise.all([\n context.client.publicGet(\n \"/api/v5/finance/savings/lending-rate-history\",\n compactObject({ ccy, limit: 1 }),\n publicRateLimit(\"earn_get_lending_rate_history\", 6),\n ),\n context.client.privateGet(\n \"/api/v5/finance/simple-earn-fixed/offers\",\n compactObject({ ccy }),\n privateRateLimit(\"earn_fixed_purchase_preview_offers\", 2),\n ).catch(() => null),\n ]);\n const rateResult = normalizeResponse(rateResponse);\n const fixedResult = fixedResponse ? normalizeResponse(fixedResponse) : { data: [] };\n const rateArr = Array.isArray(rateResult[\"data\"])\n ? (rateResult[\"data\"] as Record<string, unknown>[])\n : [];\n const allOffers = Array.isArray(fixedResult[\"data\"])\n ? (fixedResult[\"data\"] as Record<string, unknown>[])\n : [];\n const matchedOffer = allOffers.find(\n (o) => o[\"term\"] === term && o[\"ccy\"] === ccy,\n );\n const { borrowingOrderQuota: _, ...offerWithoutTotal } = matchedOffer ?? {};\n const offerWithSoldOut = matchedOffer\n ? { ...offerWithoutTotal, soldOut: offerWithoutTotal[\"lendQuota\"] === \"0\" }\n : null;\n\n return {\n preview: true,\n ccy,\n amt,\n term,\n offer: offerWithSoldOut,\n currentFlexibleRate: rateArr[0]?.[\"lendingRate\"] ?? null,\n warning:\n \"⚠️ Orders still in 'pending' state can be cancelled before matching completes. \" +\n \"Once the status changes to 'earning', funds are LOCKED until maturity — early redemption is NOT allowed. \" +\n \"Please call again with confirm=true to proceed.\",\n };\n }\n\n // Second call: execute purchase\n assertNotDemo(context.config, \"earn_fixed_purchase\");\n const response = await context.client.privatePost(\n \"/api/v5/finance/simple-earn-fixed/purchase\",\n { ccy, amt, term },\n privateRateLimit(\"earn_fixed_purchase\", 2),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_fixed_redeem\",\n module: \"earn.savings\",\n description:\n \"Redeem Simple Earn Fixed (定期赚币) order. [CAUTION] Redeems a fixed-term lending order. \" +\n \"Always redeems the full order amount. Only orders in 'pending' (匹配中) state can be redeemed — \" +\n \"orders in 'earning' state are locked until maturity and cannot be redeemed early. \" +\n \"Do NOT use for flexible earn redemption — use earn_savings_redeem instead.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n reqId: {\n type: \"string\",\n description: \"Request ID of the fixed-term order to redeem\",\n },\n },\n required: [\"reqId\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_fixed_redeem\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/simple-earn-fixed/redeem\",\n {\n reqId: requireString(args, \"reqId\"),\n },\n privateRateLimit(\"earn_fixed_redeem\", 2),\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 and fixed-term offers. \" +\n \"Use this tool when the user asks about Simple Earn products, current or historical lending rates, \" +\n \"or when displaying savings balance with market rate context (市场均利率). \" +\n \"Returns lending rate history (lendingRate field, newest-first) AND available fixed-term (定期) offers \" +\n \"with APR, term, min amount, and quota — one call gives a complete view of both flexible and fixed options. \" +\n \"In fixedOffers: lendQuota = remaining quota (剩余额度), soldOut = whether product is sold out (lendQuota is 0). \" +\n \"To get current flexible 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 7)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const ccy = readString(args, \"ccy\");\n const [rateResponse, fixedResponse] = await Promise.all([\n context.client.publicGet(\n \"/api/v5/finance/savings/lending-rate-history\",\n compactObject({\n ccy,\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 7,\n }),\n publicRateLimit(\"earn_get_lending_rate_history\", 6),\n ),\n context.client.privateGet(\n \"/api/v5/finance/simple-earn-fixed/offers\",\n compactObject({ ccy }),\n privateRateLimit(\"earn_get_lending_rate_history_fixed\", 2),\n ).catch(() => null),\n ]);\n\n const rateResult = normalizeResponse(rateResponse);\n // Remove redundant `rate` field — `lendingRate` is the canonical field\n const rateData = Array.isArray((rateResult as Record<string, unknown>)[\"data\"])\n ? ((rateResult as Record<string, unknown>)[\"data\"] as Array<Record<string, unknown>>).map(\n ({ rate: _, ...rest }) => rest,\n )\n : [];\n\n const fixedResult = fixedResponse ? normalizeResponse(fixedResponse) : { data: [] };\n const allOffers = ((fixedResult as Record<string, unknown>)[\"data\"] ?? []) as Array<Record<string, unknown>>;\n const fixedOffers = allOffers\n .map(({ borrowingOrderQuota: _, ...rest }) => ({\n ...rest,\n soldOut: rest[\"lendQuota\"] === \"0\",\n }));\n\n return {\n ...rateResult,\n data: rateData,\n fixedOffers,\n };\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 { 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.\",\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 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.\",\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 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]\",\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 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. Yields in response are decimal fractions, not percentages.\",\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. Yields in response are decimal fractions, not percentages.\",\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 rejects the order if quote yield falls below threshold. \" +\n \"Returns order result with quote snapshot (minAnnualizedYield is in percent; response yields are decimal fractions).\",\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 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 // API returns annualizedYield as decimal (e.g. 0.1748 = 17.48%), convert to percent for comparison\n if (minAnnualizedYield !== undefined) {\n const rawYield = parseFloat(quote[\"annualizedYield\"] as string);\n if (isNaN(rawYield)) {\n throw new OkxApiError(\n \"Quote returned non-numeric annualizedYield, cannot verify minimum yield threshold.\",\n {\n code: \"INVALID_YIELD_VALUE\",\n suggestion: \"Order not placed. The quote did not include a valid annualizedYield. Retry or pick a different product.\",\n },\n );\n }\n const actualYieldPct = rawYield * 100;\n if (actualYieldPct < minAnnualizedYield) {\n throw new OkxApiError(\n `Quote yield ${actualYieldPct.toFixed(2)}% is below the minimum threshold of ${minAnnualizedYield}%.`,\n {\n code: \"YIELD_BELOW_MIN\",\n suggestion: `Order not placed. Actual: ${actualYieldPct.toFixed(2)}%, 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, ToolArgs, ToolContext } from \"../types.js\";\nimport { ConfigError } from \"../../utils/errors.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\nconst EARN_DEMO_MESSAGE =\n \"Earn features (savings, DCD, on-chain staking, auto-earn) are not available in simulated trading mode.\";\nconst EARN_DEMO_SUGGESTION = \"Switch to a live account to use Earn features.\";\n\n/** Tools that bypass the blanket demo guard:\n * - isWrite=false tools are skipped by the guard condition\n * - dcd_redeem: isWrite=true but has CONDITIONAL demo check inside\n * (preview/no quoteId is read-only and allowed; execute mode has assertNotDemo)\n * - earn_fixed_purchase: isWrite=true but preview (confirm=false) is read-only;\n * execute path (confirm=true) has assertNotDemo inside the handler */\nconst DEMO_GUARD_SKIP = new Set([\"dcd_redeem\", \"earn_fixed_purchase\"]);\n\nfunction withDemoGuard(tool: ToolSpec): ToolSpec {\n if (!tool.isWrite || DEMO_GUARD_SKIP.has(tool.name)) return tool;\n const originalHandler = tool.handler;\n return {\n ...tool,\n handler: async (args: ToolArgs, context: ToolContext): Promise<unknown> => {\n if (context.config.demo) {\n throw new ConfigError(EARN_DEMO_MESSAGE, EARN_DEMO_SUGGESTION);\n }\n return originalHandler(args, context);\n },\n };\n}\n\nexport function registerAllEarnTools(): ToolSpec[] {\n const tools = [\n ...registerEarnTools(),\n ...registerOnchainEarnTools(),\n ...registerDcdTools(),\n ...registerAutoEarnTools(),\n ];\n return tools.map(withDemoGuard);\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\";\nimport { resolveQuoteCcySz } from \"./tgtccy-conversion.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. Before placing, use market_get_instruments to get ctVal (contract face value) — do NOT assume contract sizes. [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: \"Number of contracts. Each contract = ctVal units (e.g. 0.1 ETH for ETH-USDT-SWAP). Query market_get_instruments for exact ctVal. Set tgtCcy=quote_ccy to specify sz in USDT notional value; set tgtCcy=margin to specify sz as margin cost (notional = sz * leverage).\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n defaultType,\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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 const result = normalizeResponse(response);\n if (resolved.conversionNote) {\n result._conversion = resolved.conversionNote;\n }\n return result;\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\nconst TWO_DAYS_MS = 2 * 24 * 60 * 60 * 1000;\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. Automatically retrieves historical data (back to 2021) when requesting older time ranges. Use the `after` parameter to paginate back in time (the old `history` parameter has been removed). IMPORTANT: Before fetching with `after`/`before`, estimate the number of candles: time_range_ms / bar_interval_ms. If the estimate exceeds ~500 candles, inform the user of the estimated count and ask for confirmation before proceeding.\",\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 },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const afterTs = readString(args, \"after\");\n const beforeTs = readString(args, \"before\");\n const query = compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: afterTs,\n before: beforeTs,\n limit: readNumber(args, \"limit\"),\n });\n const rateLimit = publicRateLimit(\"market_get_candles\", 40);\n\n const hasTimestamp = afterTs !== undefined || beforeTs !== undefined;\n // Only route to history based on `after`: `after=T` means \"data older than T\".\n // `before=T` means \"data newer than T\" (paginating forward), so it always needs\n // the recent endpoint — routing it to history would drop the latest 2 days.\n const useHistory = afterTs !== undefined && Number(afterTs) < Date.now() - TWO_DAYS_MS;\n\n const path = useHistory ? \"/api/v5/market/history-candles\" : \"/api/v5/market/candles\";\n const response = await context.client.publicGet(path, query, rateLimit);\n\n // Defensive fallback: if the recent endpoint returns empty for a timestamped request,\n // the timestamp may straddle the 2-day boundary. Try history endpoint once.\n // Trade-off: truly empty ranges also trigger a second request, which is acceptable\n // since this case is rare and correctness matters more than avoiding one extra call.\n if (!useHistory && hasTimestamp && Array.isArray(response.data) && response.data.length === 0) {\n return normalizeResponse(await context.client.publicGet(\"/api/v5/market/history-candles\", query, rateLimit));\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 \"[Deprecated: use market_get_instruments_by_category with instCategory=\\\"3\\\" instead] Get all stock token instruments (instCategory=3). Stock tokens track real-world stock prices on OKX (e.g. AAPL-USDT-SWAP).\",\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 name: \"market_get_instruments_by_category\",\n module: \"market\",\n description:\n \"Discover tradeable instruments by asset category. Stock tokens (instCategory=3, e.g. AAPL-USDT-SWAP, TSLA-USDT-SWAP), Metals (4, e.g. XAUUSDT-USDT-SWAP for gold), Commodities (5, e.g. OIL-USDT-SWAP for crude oil), Forex (6, e.g. EURUSDT-USDT-SWAP for EUR/USD), Bonds (7, e.g. US30Y-USDT-SWAP). Use this to find instIds before querying prices or placing orders. Filters client-side by instCategory.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instCategory: {\n type: \"string\",\n enum: [\"3\", \"4\", \"5\", \"6\", \"7\"],\n description: \"Asset category: 3=Stock tokens, 4=Metals, 5=Commodities, 6=Forex, 7=Bonds\",\n },\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\",\n },\n },\n required: [\"instCategory\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instCategory = requireString(args, \"instCategory\");\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_instruments_by_category\", 20),\n );\n const data = response.data;\n const filtered = Array.isArray(data)\n ? data.filter((item) => (item as Record<string, unknown>).instCategory === instCategory)\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\";\nimport { resolveQuoteCcySz } from \"./tgtccy-conversion.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\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n \"OPTION\",\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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\";\nimport { resolveQuoteCcySz } from \"./tgtccy-conversion.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. Before placing, use market_get_instruments to get ctVal (contract face value) — do NOT assume contract sizes. [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 by default. Set tgtCcy=quote_ccy to specify USDT notional value; set tgtCcy=margin to specify USDT margin cost (notional = sz * leverage).\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n \"OPTION\",\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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(\"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 let path: string;\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 } else {\n path = \"/api/v5/trade/orders-pending\";\n }\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 { registerSkillsTools } from \"./skills.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 ...registerSkillsTools(),\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 live?: 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 */\n\nfunction resolveDemo(cli: CliOptions, toml: OkxProfile): boolean {\n if (cli.demo && cli.live) {\n throw new ConfigError(\n \"--demo and --live are mutually exclusive.\",\n \"Use --demo for simulated trading or --live to force live mode, not both.\",\n );\n }\n if (cli.live === true) return false;\n if (cli.demo === true) return true;\n return process.env.OKX_DEMO === \"1\" ||\n process.env.OKX_DEMO === \"true\" ||\n (toml.demo ?? false);\n}\n\nexport function loadConfig(cli: CliOptions): OkxConfig {\n const toml = readTomlProfile(cli.profile);\n const creds = loadCredentials(toml);\n\n const demo = resolveDemo(cli, toml);\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\nexport function 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\nexport async function fetchDistTags(packageName: string): Promise<Record<string, 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)}`, {\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 { \"dist-tags\"?: Record<string, string> };\n return data[\"dist-tags\"] ?? null;\n } catch {\n return null;\n }\n}\n\nexport async 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 { 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 { 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// ---------------------------------------------------------------------------\n// Environment context — injected once in main() after config load.\n// When null, all output functions behave as before (backward compat).\n// ---------------------------------------------------------------------------\n\nexport interface EnvContext {\n demo: boolean;\n profile: string;\n}\n\nlet envContext: EnvContext | null = null;\n\nexport function setEnvContext(ctx: EnvContext): void {\n envContext = ctx;\n}\n\nexport function resetEnvContext(): void {\n envContext = null;\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\n// ---------------------------------------------------------------------------\n// Opt-in JSON env wrapper — controlled by the --env CLI flag.\n// When disabled (default), printJson outputs raw data for backward compat.\n// When enabled, printJson wraps the data with {env, profile, data}.\n// ---------------------------------------------------------------------------\n\nlet jsonEnvEnabled = false;\n\nexport function setJsonEnvEnabled(enabled: boolean): void {\n jsonEnvEnabled = enabled;\n}\n\nexport function resetJsonEnvEnabled(): void {\n jsonEnvEnabled = false;\n}\n\nexport function printJson(data: unknown): void {\n const payload = jsonEnvEnabled && envContext\n ? {\n env: envContext.demo ? \"demo\" : \"live\",\n profile: envContext.profile,\n data,\n }\n : data;\n activeOutput.out(JSON.stringify(payload, null, 2) + EOL);\n}\n\nexport function printTable(rows: Record<string, unknown>[]): void {\n if (envContext) {\n const envLabel = envContext.demo ? \"demo (simulated trading)\" : \"live\";\n activeOutput.out(`Environment: ${envLabel}` + EOL + EOL);\n }\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 * Handle a single JSON-config client. Returns true if a failure was recorded.\n */\nfunction handleJsonClient(\n clientId: ClientId,\n report: Report,\n configuredClients: ClientId[],\n): boolean {\n const configPath = getConfigPath(clientId);\n if (!configPath) return false; // platform doesn't support this client\n\n const name = CLIENT_NAMES[clientId];\n const status = checkJsonMcpConfig(configPath);\n\n if (status === \"missing\") return false; // client not installed — skip silently\n\n if (status === \"found\") {\n ok(name, `configured (${sanitize(configPath)})`);\n report.add(`client_${clientId}`, `OK ${sanitize(configPath)}`);\n configuredClients.push(clientId);\n return false;\n }\n\n if (status === \"not-configured\") {\n fail(name, \"okx-trade-mcp not found in mcpServers\", [`Run: okx setup --client ${clientId}`]);\n report.add(`client_${clientId}`, \"NOT_CONFIGURED\");\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 }\n return true;\n}\n\n/**\n * Handle Claude Code client. Returns true if a hard failure was recorded.\n * \"not-configured\" is a warning only — Claude Code may be used for other purposes.\n */\nfunction handleClaudeCodeClient(report: Report, configuredClients: ClientId[]): boolean {\n const status = checkClaudeCodeConfig();\n if (status === \"missing\") return false;\n\n const name = CLIENT_NAMES[\"claude-code\"];\n\n if (status === \"found\") {\n ok(name, \"configured\");\n report.add(\"client_claude-code\", \"OK\");\n configuredClients.push(\"claude-code\");\n return false;\n }\n\n if (status === \"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 return false; // not a hard failure\n }\n\n fail(name, \"settings file has JSON parse error\", [\"Run: okx setup --client claude-code\"]);\n report.add(\"client_claude-code\", \"PARSE_ERROR\");\n return true;\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 const jsonClients: ClientId[] = [\"claude-desktop\", \"cursor\", \"windsurf\"];\n const configuredClients: ClientId[] = [];\n let anyFailed = false;\n\n for (const clientId of jsonClients) {\n if (handleJsonClient(clientId, report, configuredClients)) anyFailed = true;\n }\n\n // Claude Code — special handling (uses claude mcp add, config paths vary)\n if (handleClaudeCodeClient(report, configuredClients)) anyFailed = true;\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 { spawnSync } from \"node:child_process\";\nimport { readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { fetchLatestVersion, fetchDistTags, isNewerVersion } from \"@agent-tradekit/core\";\n\nconst PACKAGES = [\"@okx_ai/okx-trade-mcp\", \"@okx_ai/okx-trade-cli\"];\nconst CACHE_FILE = join(homedir(), \".okx\", \"last_check\");\nconst THROTTLE_MS = 12 * 60 * 60 * 1000; // 12 h\n\n// Resolve npm from the same bin directory as the active Node.js binary so we\n// never rely on the user's PATH for command resolution (avoids S4036).\nconst NPM_BIN = join(dirname(process.execPath), process.platform === \"win32\" ? \"npm.cmd\" : \"npm\");\n\nexport interface UpgradeOptions {\n beta?: boolean;\n check?: boolean;\n force?: boolean;\n}\n\nexport interface UpgradeResult {\n currentVersion: string;\n latestVersion: string;\n status: \"up-to-date\" | \"updated\" | \"update-available\" | \"error\";\n updated: boolean;\n}\n\nfunction readLastCheck(): number {\n try {\n return parseInt(readFileSync(CACHE_FILE, \"utf-8\").trim(), 10) || 0;\n } catch {\n return 0;\n }\n}\n\nfunction writeLastCheck(): void {\n try {\n mkdirSync(join(homedir(), \".okx\"), { recursive: true });\n writeFileSync(CACHE_FILE, String(Math.floor(Date.now() / 1000)), \"utf-8\");\n } catch {\n // ignore write failures\n }\n}\n\nfunction printResult(result: UpgradeResult, json: boolean): void {\n if (json) {\n process.stdout.write(JSON.stringify(result) + \"\\n\");\n } else {\n switch (result.status) {\n case \"up-to-date\":\n process.stderr.write(`[ok] Already up to date: ${result.currentVersion}\\n`);\n break;\n case \"update-available\":\n process.stderr.write(\n `[info] Update available: ${result.currentVersion} → ${result.latestVersion}\\n` +\n ` Run: okx upgrade\\n`,\n );\n break;\n case \"updated\":\n process.stderr.write(`[ok] Upgraded: ${result.currentVersion} → ${result.latestVersion}\\n`);\n break;\n case \"error\":\n process.stderr.write(`[error] Failed to fetch latest version from npm registry\\n`);\n break;\n }\n }\n}\n\nfunction isThrottled(options: UpgradeOptions): boolean {\n if (options.force || options.check) return false;\n return Date.now() - readLastCheck() * 1000 < THROTTLE_MS;\n}\n\nasync function resolveLatestVersion(beta: boolean): Promise<string | null> {\n if (beta) {\n const tags = await fetchDistTags(\"@okx_ai/okx-trade-cli\");\n return tags?.[\"next\"] ?? tags?.[\"latest\"] ?? null;\n }\n return fetchLatestVersion(\"@okx_ai/okx-trade-cli\");\n}\n\n// Use spawnSync with array args (no shell interpreter) to avoid S4721.\n// Bug #2 fix: when --json, suppress npm stdout to avoid polluting JSON output.\nfunction runNpmInstall(json: boolean): boolean {\n const result = spawnSync(NPM_BIN, [\"install\", \"-g\", ...PACKAGES], {\n stdio: json ? [\"inherit\", \"ignore\", process.stderr] : \"inherit\",\n shell: false,\n });\n return result.status === 0;\n}\n\nexport async function cmdUpgrade(\n currentVersion: string,\n options: UpgradeOptions,\n json: boolean,\n): Promise<void> {\n if (isThrottled(options)) {\n if (json) {\n process.stdout.write(\n JSON.stringify({ currentVersion, latestVersion: currentVersion, status: \"up-to-date\", updated: false }) + \"\\n\",\n );\n }\n return;\n }\n\n const latestVersion = await resolveLatestVersion(options.beta ?? false);\n\n if (!latestVersion) {\n printResult({ currentVersion, latestVersion: \"unknown\", status: \"error\", updated: false }, json);\n process.exitCode = 1;\n return;\n }\n\n // Strip prerelease suffix before comparing against stable latest (Bug #1 fix)\n const stableCurrentVersion = currentVersion.split(/[-+]/)[0] ?? currentVersion;\n const needsUpdate = options.force || isNewerVersion(stableCurrentVersion, latestVersion);\n\n if (!needsUpdate) {\n if (!options.check) writeLastCheck();\n printResult({ currentVersion, latestVersion, status: \"up-to-date\", updated: false }, json);\n return;\n }\n\n if (options.check) {\n printResult({ currentVersion, latestVersion, status: \"update-available\", updated: false }, json);\n return;\n }\n\n if (runNpmInstall(json)) {\n writeLastCheck();\n printResult({ currentVersion, latestVersion, status: \"updated\", updated: true }, json);\n } else {\n printResult({ currentVersion, latestVersion, status: \"error\", updated: false }, json);\n process.exitCode = 1;\n }\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 live?: 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,\n live: opts.live,\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, 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: \"[Deprecated: use instruments-by-category --instCategory 3] List all stock token instruments (instCategory=3, e.g. AAPL-USDT-SWAP)\",\n },\n \"instruments-by-category\": {\n usage: \"okx market instruments-by-category --instCategory <4|5|6|7> [--instType <SPOT|SWAP>] [--instId <id>]\",\n description: \"List instruments by asset category: 4=Metals (gold/silver), 5=Commodities (oil/gas), 6=Forex (EUR/USD), 7=Bonds\",\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, fixed-term, 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 and fixed-term offers (requires auth)\",\n },\n \"fixed-orders\": {\n usage: \"okx earn savings fixed-orders [--ccy <ccy>] [--state <pending|earning|expired|settled|cancelled>]\",\n description: \"List fixed-term earn orders\",\n },\n \"fixed-purchase\": {\n usage: \"okx earn savings fixed-purchase --ccy <ccy> --amt <n> --term <term> [--confirm]\",\n description: \"Purchase Simple Earn Fixed (定期). Preview by default; add --confirm to execute. Funds locked until maturity\",\n },\n \"fixed-redeem\": {\n usage: \"okx earn savings fixed-redeem <reqId>\",\n description: \"Redeem a fixed-term earn order (full amount)\",\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 | --live] [--output <file>]\",\n },\n\n upgrade: {\n description: \"Upgrade okx CLI and MCP server to the latest stable version\",\n usage: \"okx upgrade [--check] [--beta] [--force] [--json]\",\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 | --live] [--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 \" --live Force live trading mode (overrides profile demo=true; mutually exclusive with --demo)\",\n \" --json Output raw JSON\",\n \" --env With --json, wrap output as {env, profile, data}\",\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 pure-subgroup module body (e.g. bot). */\nfunction printSubgroupOnlyModule(lines: string[], moduleName: string, group: GroupInfo): void {\n const subgroupNames = Object.keys(group.subgroups!);\n const colWidth = Math.max(...subgroupNames.map((n) => n.length)) + 4;\n lines.push(`Usage: okx ${moduleName} <strategy> <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\");\n lines.push(\"Strategies:\");\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}\n\n/** Render mixed module body (direct commands + subgroups, e.g. spot, swap). */\nfunction printMixedModule(lines: string[], moduleName: string, group: GroupInfo): void {\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}\n\n/** Render commands-only module body (e.g. market, account). */\nfunction printCommandsOnlyModule(lines: string[], moduleName: string, group: GroupInfo): void {\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n}\n\n/** Render custom-usage module body (e.g. setup). */\nfunction printUsageModule(lines: string[], group: GroupInfo): void {\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/** 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 printSubgroupOnlyModule(lines, moduleName, group);\n } else if (hasSubgroups && hasCommands) {\n printMixedModule(lines, moduleName, group);\n } else if (hasCommands) {\n printCommandsOnlyModule(lines, moduleName, group);\n } else if (group.usage) {\n printUsageModule(lines, group);\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 env?: 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 instCategory?: string;\n quoteCcy?: string;\n archive?: boolean;\n valuation?: 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 reqId?: string;\n confirm?: boolean;\n // audit\n since?: string;\n tool?: string;\n // upgrade\n beta?: boolean;\n check?: boolean;\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 // market candle time range\n after?: string;\n before?: string;\n // skill marketplace\n keyword?: string;\n categories?: string;\n dir?: string;\n page?: 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 env: { 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 after: { type: \"string\" },\n before: { 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 instCategory: { type: \"string\" },\n quoteCcy: { type: \"string\" },\n // account extras\n archive: { type: \"boolean\", default: false },\n valuation: { 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 reqId: { type: \"string\" },\n confirm: { type: \"boolean\", default: false },\n // audit\n since: { type: \"string\" },\n tool: { type: \"string\" },\n // upgrade\n beta: { type: \"boolean\", default: false },\n check: { type: \"boolean\", default: false },\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 // skill marketplace\n keyword: { type: \"string\" },\n categories: { type: \"string\" },\n dir: { type: \"string\" },\n page: { 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, KNOWN_INDICATORS } 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; after?: string; before?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_candles\", { instId, bar: opts.bar, limit: opts.limit, after: opts.after, before: opts.before });\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 function cmdMarketIndicatorList(json: boolean): void {\n if (json) return printJson(KNOWN_INDICATORS);\n printTable(KNOWN_INDICATORS.map(({ name, description }) => ({ name, description })));\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 cmdMarketInstrumentsByCategory(\n run: ToolRunner,\n opts: { instCategory: string; instType?: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_instruments_by_category\", {\n instCategory: opts.instCategory,\n instType: opts.instType,\n instId: opts.instId,\n });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n const CATEGORY_LABELS: Record<string, string> = {\n \"3\": \"Stock tokens\",\n \"4\": \"Metals\",\n \"5\": \"Commodities\",\n \"6\": \"Forex\",\n \"7\": \"Bonds\",\n };\n const label = CATEGORY_LABELS[opts.instCategory] ?? opts.instCategory;\n process.stdout.write(`instCategory=${opts.instCategory} (${label}) — ${items?.length ?? 0} instruments\\n\\n`);\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\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 const rows = 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 if (rows.length === 0 && data?.[0]) {\n printTable([{ currency: \"Total\", equity: data[0][\"totalEq\"] ?? \"0\", available: data[0][\"adjEq\"] ?? \"0\", frozen: \"-\" }]);\n return;\n }\n printTable(rows);\n}\n\nexport async function cmdAccountAssetBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n showValuation?: boolean,\n): Promise<void> {\n const result = await run(\"account_get_asset_balance\", {\n ccy,\n ...(showValuation ? { showValuation: true } : {}),\n }) as unknown as Record<string, unknown>;\n const data = (result.data ?? []) as Record<string, unknown>[];\n if (json) return printJson(showValuation ? { data, valuation: result.valuation } : data);\n const assetRows = 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 if (assetRows.length === 0 && data.length > 0) {\n outputLine(\"Total balance: 0\");\n } else {\n printTable(assetRows);\n }\n if (showValuation && result.valuation) {\n const valuationData = (result.valuation as Record<string, unknown>[]) ?? [];\n outputLine(\"\");\n outputLine(\"Asset Valuation by Account Type:\");\n printTable(\n valuationData.map((v) => {\n const details = (v[\"details\"] as Record<string, unknown>) ?? {};\n return {\n totalBal: v[\"totalBal\"],\n classic: details[\"classic\"],\n earn: details[\"earn\"],\n funding: details[\"funding\"],\n trading: details[\"trading\"],\n };\n }),\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, { 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 tgtCcy?: 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 tgtCcy: opts.tgtCcy,\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, OkxProfile, OkxTomlConfig } from \"@agent-tradekit/core\";\nimport { writeCliConfig } from \"../config/toml.js\";\nimport { output, errorOutput, outputLine, errorLine, printJson, printKv } from \"../formatter.js\";\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\n/** Tries to open a URL in the system browser; silently ignores failures. */\nfunction tryOpenUrl(url: string): void {\n try {\n let opener: string;\n if (process.platform === \"darwin\") {\n opener = \"open\";\n } else if (process.platform === \"win32\") {\n opener = \"start\";\n } else {\n opener = \"xdg-open\";\n }\n spawnSync(opener, [url], { stdio: \"ignore\", shell: process.platform === \"win32\" });\n } catch {\n // silently ignore\n }\n}\n\n/** Prompts for API credentials and returns them, or null if any field is empty. */\nasync function promptCredentials(\n rl: ReturnType<typeof createInterface>,\n t: (typeof messages)[Lang],\n): Promise<{ apiKey: string; secretKey: string; passphrase: string } | null> {\n const apiKey = (await prompt(rl, \"API Key: \")).trim();\n if (!apiKey) {\n errorLine(t.emptyApiKey);\n process.exitCode = 1;\n return null;\n }\n\n const secretKey = (await prompt(rl, \"Secret Key: \")).trim();\n if (!secretKey) {\n errorLine(t.emptySecretKey);\n process.exitCode = 1;\n return null;\n }\n\n const passphrase = (await prompt(rl, \"Passphrase: \")).trim();\n if (!passphrase) {\n errorLine(t.emptyPassphrase);\n process.exitCode = 1;\n return null;\n }\n\n return { apiKey, secretKey, passphrase };\n}\n\n/** Writes config to disk and outputs success messages, or prints manual fallback on error. */\nfunction saveConfig(config: OkxTomlConfig, profileName: string, t: (typeof messages)[Lang]): void {\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) errorOutput(t.permissionDenied(configPath));\n errorOutput(t.manualWrite(configPath));\n outputLine(tomlStringify(config as unknown as Record<string, unknown>));\n process.exitCode = 1;\n }\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 output(t.createApiKey(apiUrl));\n output(t.hint(demo ? t.hintDemo : t.hintLive));\n tryOpenUrl(apiUrl);\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 credentials = await promptCredentials(rl, t);\n if (!credentials) return;\n\n if (demo) outputLine(t.demoSelected);\n\n config.profiles[profileName] = buildProfileEntry(siteKey, credentials.apiKey, credentials.secretKey, credentials.passphrase, demo);\n\n // Auto-set as default_profile\n if (!config.default_profile || config.default_profile !== profileName) {\n config.default_profile = profileName;\n }\n\n saveConfig(config, profileName, t);\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 cmdEarnFixedOrderList(\n run: ToolRunner,\n opts: { ccy?: string; state?: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_get_fixed_order_list\", {\n ccy: opts.ccy, state: opts.state,\n }));\n printDataList(data, opts.json, \"No fixed earn orders\", (r) => ({\n reqId: r[\"reqId\"], ccy: r[\"ccy\"], amt: r[\"amt\"], rate: r[\"rate\"],\n term: r[\"term\"], state: r[\"state\"],\n accruedInterest: r[\"accruedInterest\"],\n cTime: new Date(Number(r[\"cTime\"])).toLocaleString(),\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\nfunction printFixedPurchasePreview(rec: Record<string, unknown>): void {\n const offer = rec[\"offer\"] as Record<string, unknown> | null;\n outputLine(\"\");\n outputLine(\"📋 Fixed Earn Purchase Preview\");\n outputLine(` Currency: ${rec[\"ccy\"]}`);\n outputLine(` Amount: ${rec[\"amt\"]}`);\n outputLine(` Term: ${rec[\"term\"]}`);\n if (rec[\"currentFlexibleRate\"]) {\n outputLine(` Current flexible rate: ${rec[\"currentFlexibleRate\"]}`);\n }\n if (offer) {\n printKv({\n rate: offer[\"rate\"],\n minLend: offer[\"minLend\"],\n remainingQuota: offer[\"lendQuota\"],\n soldOut: offer[\"soldOut\"] ? \"Yes\" : \"No\",\n });\n } else {\n outputLine(\" ⚠️ No matching offer found for this term.\");\n }\n outputLine(\"\");\n outputLine((rec[\"warning\"] as string) ?? \"\");\n outputLine(\"\");\n outputLine(\"Re-run with --confirm to execute.\");\n}\n\nexport async function cmdEarnFixedPurchase(\n run: ToolRunner,\n opts: { ccy: string; amt: string; term: string; confirm: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"earn_fixed_purchase\", {\n ccy: opts.ccy, amt: opts.amt, term: opts.term, confirm: opts.confirm,\n });\n if (!result || typeof result !== \"object\") {\n outputLine(\"No response data\");\n return;\n }\n const rec = result as unknown as Record<string, unknown>;\n\n if (rec[\"preview\"]) {\n if (opts.json) { printJson(rec); return; }\n printFixedPurchasePreview(rec);\n return;\n }\n\n // Execute mode — show result\n const data = extractData(result);\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { outputLine(\"No response data\"); return; }\n printKv({ reqId: r[\"reqId\"], ccy: r[\"ccy\"], amt: r[\"amt\"], term: r[\"term\"] });\n}\n\nexport async function cmdEarnFixedRedeem(\n run: ToolRunner,\n opts: { reqId: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_fixed_redeem\", { reqId: opts.reqId }));\n if (opts.json) { printJson(data); return; }\n if (!data.length) { outputLine(\"No response data\"); return; }\n printTable(data.map((r) => ({ reqId: r[\"reqId\"] })));\n}\n\nexport async function cmdEarnLendingRateHistory(\n run: ToolRunner,\n opts: { ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"earn_get_lending_rate_history\", { ccy: opts.ccy, limit: opts.limit });\n const data = extractData(result);\n const fixedOffers = extractFixedOffers(result);\n\n if (opts.json) { printJson({ data, fixedOffers }); return; }\n\n printDataList(data, false, \"No rate history data\", (r) => ({\n ccy: r[\"ccy\"], lendingRate: r[\"lendingRate\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n }));\n\n if (fixedOffers.length > 0) {\n outputLine(\"\");\n outputLine(\"Fixed-term offers:\");\n printTable(fixedOffers.map((r) => ({\n ccy: r[\"ccy\"], term: r[\"term\"], rate: r[\"rate\"],\n minLend: r[\"minLend\"],\n remainingQuota: r[\"lendQuota\"],\n soldOut: r[\"soldOut\"] ? \"Yes\" : \"No\",\n })));\n }\n}\n\nfunction extractFixedOffers(result: unknown): Record<string, unknown>[] {\n if (result && typeof result === \"object\") {\n const offers = (result as Record<string, unknown>)[\"fixedOffers\"];\n if (Array.isArray(offers)) return offers as Record<string, unknown>[];\n }\n return [];\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];\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 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 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\n// Note: minYield is in decimal (0.05 = 5%), matching the raw API format.\n// This differs from --minAnnualizedYield in quote-and-buy which is in percent (18 = 18%).\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\"] ? `${(parseFloat(q[\"termRate\"] as string) * 100).toFixed(2)}%` : \"—\",\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\"] ? `${(parseFloat(r[\"annualizedYield\"] as string) * 100).toFixed(2)}%` : \"—\",\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\"] ? `${(parseFloat(q[\"annualizedYield\"] as string) * 100).toFixed(2)}%` : \"—\",\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","import { tmpdir, homedir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\nimport { mkdirSync, rmSync, existsSync, copyFileSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n type ToolRunner,\n type OkxConfig,\n OkxRestClient,\n downloadSkillZip,\n extractSkillZip,\n readMetaJson,\n validateSkillMdExists,\n upsertSkillRecord,\n removeSkillRecord,\n readSkillRegistry,\n getSkillRecord,\n} from \"@agent-tradekit/core\";\nimport { outputLine, errorLine } from \"../formatter.js\";\n\n/**\n * Resolve the absolute path to `npx`.\n * Prefers the sibling of the current Node binary (most reliable, avoids PATH hijack).\n * Falls back to bare \"npx\" (OS PATH resolution) if the sibling doesn't exist.\n */\nfunction resolveNpx(): string {\n const sibling = join(dirname(process.execPath), \"npx\");\n if (existsSync(sibling)) return sibling;\n return \"npx\";\n}\n\n/** Notice shown after installing a third-party skill. */\nexport const THIRD_PARTY_INSTALL_NOTICE =\n \"Note: This skill was created by a third-party developer, not by OKX. Review SKILL.md before use.\";\n\n// ---------------------------------------------------------------------------\n// okx skill search <keyword>\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillSearch(\n run: ToolRunner,\n opts: { keyword?: string; categories?: string; page?: string; limit?: string; json: boolean },\n): Promise<void> {\n const args: Record<string, string> = {};\n if (opts.keyword) args.keyword = opts.keyword;\n if (opts.categories) args.categories = opts.categories;\n if (opts.page) args.page = opts.page;\n if (opts.limit) args.limit = opts.limit;\n\n const result = await run(\"skills_search\", args);\n const data = result.data as unknown[];\n const totalPage = (result as unknown as Record<string, unknown>).totalPage as string | undefined;\n\n if (opts.json) {\n outputLine(JSON.stringify(result, null, 2));\n return;\n }\n\n if (!Array.isArray(data) || data.length === 0) {\n outputLine(\"No skills found.\");\n return;\n }\n\n outputLine(\"\");\n outputLine(\" NAME VERSION DESCRIPTION\");\n for (const item of data as Array<{ name: string; latestVersion: string; description: string }>) {\n const name = (item.name ?? \"\").padEnd(20);\n const ver = (item.latestVersion ?? \"\").padEnd(10);\n const desc = (item.description ?? \"\").slice(0, 50);\n outputLine(` ${name}${ver}${desc}`);\n }\n outputLine(\"\");\n const page = opts.page ?? \"1\";\n const pageInfo = totalPage ? ` (page ${page}/${totalPage})` : \"\";\n outputLine(`${data.length} skills found${pageInfo}. Use \\`okx skill add <name>\\` to install.`);\n}\n\n// ---------------------------------------------------------------------------\n// okx skill categories\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillCategories(\n run: ToolRunner,\n json: boolean,\n): Promise<void> {\n const result = await run(\"skills_get_categories\", {});\n const data = result.data as unknown[];\n\n if (json) {\n outputLine(JSON.stringify(result, null, 2));\n return;\n }\n\n if (!Array.isArray(data) || data.length === 0) {\n outputLine(\"No categories found.\");\n return;\n }\n\n outputLine(\"\");\n outputLine(\" ID NAME\");\n for (const cat of data as Array<{ categoryId: string; name: string }>) {\n outputLine(` ${(cat.categoryId ?? \"\").padEnd(20)}${cat.name ?? \"\"}`);\n }\n outputLine(\"\");\n}\n\n// ---------------------------------------------------------------------------\n// okx skill add <name>\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillAdd(\n name: string,\n config: OkxConfig,\n json: boolean,\n): Promise<void> {\n const tmpBase = join(tmpdir(), `okx-skill-${randomUUID()}`);\n mkdirSync(tmpBase, { recursive: true });\n\n try {\n // Step 1: Download\n outputLine(`Downloading ${name}...`);\n const client = new OkxRestClient(config);\n const zipPath = await downloadSkillZip(client, name, tmpBase);\n\n // Step 2: Extract\n const contentDir = await extractSkillZip(zipPath, join(tmpBase, \"content\"));\n\n // Step 3: Validate\n const meta = readMetaJson(contentDir);\n validateSkillMdExists(contentDir);\n\n // Step 4: Install via npx skills add\n outputLine(\"Installing to detected agents...\");\n try {\n execFileSync(resolveNpx(), [\"skills\", \"add\", contentDir, \"-y\", \"-g\"], {\n stdio: \"inherit\",\n timeout: 60_000,\n });\n } catch (e) {\n // Copy zip to cwd so the user has a fallback after tmpBase is cleaned up\n const savedZip = join(process.cwd(), `${name}.zip`);\n try { copyFileSync(zipPath, savedZip); } catch { /* best-effort */ }\n errorLine(`npx skills add failed. The zip has been downloaded but not installed.`);\n errorLine(`You can manually install from: ${savedZip}`);\n throw e;\n }\n\n // Step 5: Update registry\n upsertSkillRecord(meta);\n\n printSkillInstallResult(meta, json);\n } finally {\n // Step 6: Cleanup\n rmSync(tmpBase, { recursive: true, force: true });\n }\n}\n\n// ---------------------------------------------------------------------------\n// okx skill download <name>\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillDownload(\n name: string,\n targetDir: string,\n config: OkxConfig,\n json: boolean,\n): Promise<void> {\n outputLine(`Downloading ${name}...`);\n const client = new OkxRestClient(config);\n const filePath = await downloadSkillZip(client, name, targetDir);\n\n if (json) {\n outputLine(JSON.stringify({ name, filePath }, null, 2));\n } else {\n outputLine(`✓ Downloaded ${name}.zip`);\n outputLine(` Path: ${filePath}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// okx skill remove <name>\n// ---------------------------------------------------------------------------\n\nexport function cmdSkillRemove(name: string, json: boolean): void {\n const removed = removeSkillRecord(name);\n\n if (!removed) {\n errorLine(`Skill \"${name}\" is not installed.`);\n process.exitCode = 1;\n return;\n }\n\n // Remove from all agent directories via npx skills remove\n try {\n execFileSync(resolveNpx(), [\"skills\", \"remove\", name, \"-y\", \"-g\"], {\n stdio: \"inherit\",\n timeout: 60_000,\n });\n } catch {\n // Fallback: manually remove .agents/skills/<name>/\n const agentsPath = join(homedir(), \".agents\", \"skills\", name);\n try {\n rmSync(agentsPath, { recursive: true, force: true });\n } catch {\n // Ignore — cleanup is best-effort\n }\n }\n\n if (json) {\n outputLine(JSON.stringify({ name, status: \"removed\" }, null, 2));\n } else {\n outputLine(`✓ Skill \"${name}\" removed`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// okx skill check <name>\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillCheck(\n run: ToolRunner,\n name: string,\n json: boolean,\n): Promise<void> {\n const local = getSkillRecord(name);\n if (!local) {\n errorLine(`Skill \"${name}\" is not installed.`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(\"skills_search\", { keyword: name });\n const data = result.data as Array<{ name: string; latestVersion: string }>;\n const remote = data?.find((s) => s.name === name);\n\n if (!remote) {\n errorLine(`Skill \"${name}\" not found in marketplace.`);\n process.exitCode = 1;\n return;\n }\n\n const upToDate = local.version === remote.latestVersion;\n\n if (json) {\n outputLine(JSON.stringify({\n name,\n installedVersion: local.version,\n latestVersion: remote.latestVersion,\n upToDate,\n }, null, 2));\n } else if (upToDate) {\n outputLine(`${name}: installed v${local.version} → latest v${remote.latestVersion} (up to date)`);\n } else {\n outputLine(`${name}: installed v${local.version} → latest v${remote.latestVersion} (update available)`);\n outputLine(` Use \\`okx skill add ${name}\\` to update.`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// okx skill list\n// ---------------------------------------------------------------------------\n\nexport function cmdSkillList(json: boolean): void {\n const registry = readSkillRegistry();\n const skills = Object.values(registry.skills);\n\n if (json) {\n outputLine(JSON.stringify(registry, null, 2));\n return;\n }\n\n if (skills.length === 0) {\n outputLine(\"No skills installed.\");\n return;\n }\n\n outputLine(\"\");\n outputLine(\" NAME VERSION INSTALLED AT\");\n for (const s of skills) {\n const name = s.name.padEnd(20);\n const ver = s.version.padEnd(10);\n const date = s.installedAt.slice(0, 19).replace(\"T\", \" \");\n outputLine(` ${name}${ver}${date}`);\n }\n outputLine(\"\");\n outputLine(`${skills.length} skills installed.`);\n}\n\n// ---------------------------------------------------------------------------\n// Install result output (extracted for testability)\n// ---------------------------------------------------------------------------\n\n/** Format and output the install-success message. */\nexport function printSkillInstallResult(\n meta: { name: string; version: string },\n json: boolean,\n): void {\n if (json) {\n outputLine(JSON.stringify({ name: meta.name, version: meta.version, status: \"installed\" }, null, 2));\n } else {\n outputLine(`✓ Skill \"${meta.name}\" v${meta.version} installed`);\n outputLine(` ${THIRD_PARTY_INSTALL_NOTICE}`);\n }\n}\n"],"mappings":"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","names":["createRequire","homedir","join","writeFileSync","renameSync","unlinkSync","mkdirSync","resolve","dirname","readFileSync","existsSync","sep","endPtr","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","fs","path","os","resolve","balanceResp","path","join","mkdirSync","writeFileSync","renameSync","unlinkSync","resolve","dirname","readFileSync","homedir","existsSync","messages","path","normalizeWrite","response","join","homedir","path","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","readCache","writeCache","parse","os","fs","os","fs","sep","fs","sanitize","fs","path","os","createRequire","_require","createRequire","path","fs","os","sanitize","appData","resolve","maskKey","resolve","os","path","spawnSync","readFileSync","writeFileSync","mkdirSync","dirname","join","homedir","CACHE_FILE","join","homedir","dirname","readFileSync","mkdirSync","writeFileSync","spawnSync","EOL","fs","path","EOL","path","fs","path","os","getData","getData","getData","emitWriteResult","emitBatchResults","getData","emitWriteResult","emitBatchResults","getData","emitWriteResult","emitBatchResults","spawnSync","resolve","emitWriteResult","getData","homedir","join","dirname","mkdirSync","existsSync","copyFileSync","execFileSync","randomUUID","join","dirname","existsSync","randomUUID","mkdirSync","execFileSync","copyFileSync","homedir","_require","createRequire","CLI_VERSION","GIT_HASH","CLI_VERSION","GIT_HASH"]}
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/tgtccy-conversion.ts","../../core/src/tools/algo-trade.ts","../../core/src/tools/audit.ts","../../core/src/utils/safe-file.ts","../../core/src/skills/downloader.ts","../../core/src/skills/extractor.ts","../../core/src/skills/parser.ts","../../core/src/skills/registry.ts","../../core/src/tools/skills.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/commands/upgrade.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","../src/commands/skill.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { OkxRestClient, toToolErrorPayload, checkForUpdates, createToolRunner, allToolSpecs, TradeLogger } 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 { cmdUpgrade } from \"./commands/upgrade.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 cmdMarketInstrumentsByCategory,\n cmdMarketIndicator,\n cmdMarketIndicatorList,\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 cmdEarnFixedOrderList,\n cmdEarnFixedPurchase,\n cmdEarnFixedRedeem,\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 {\n cmdSkillSearch,\n cmdSkillCategories,\n cmdSkillAdd,\n cmdSkillDownload,\n cmdSkillRemove,\n cmdSkillCheck,\n cmdSkillList,\n} from \"./commands/skill.js\";\nimport { markFailedIfSCodeError, outputLine, errorLine, setOutput, setEnvContext, setJsonEnvEnabled } 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, v.demo);\n if (action === \"tickers\") return cmdMarketTickers(run, rest[0], json, v.demo);\n if (action === \"instruments\")\n return cmdMarketInstruments(run, { instType: v.instType!, instId: v.instId, json, demo: v.demo });\n if (action === \"mark-price\")\n return cmdMarketMarkPrice(run, { instType: v.instType!, instId: v.instId, json, demo: v.demo });\n if (action === \"index-ticker\")\n return cmdMarketIndexTicker(run, { instId: v.instId, quoteCcy: v.quoteCcy, json, demo: v.demo });\n if (action === \"price-limit\") return cmdMarketPriceLimit(run, rest[0], json, v.demo);\n if (action === \"open-interest\")\n return cmdMarketOpenInterest(run, { instType: v.instType!, instId: v.instId, json, demo: v.demo });\n if (action === \"stock-tokens\")\n return cmdMarketStockTokens(run, { instType: v.instType, instId: v.instId, json, demo: v.demo });\n if (action === \"instruments-by-category\")\n return cmdMarketInstrumentsByCategory(run, {\n instCategory: v.instCategory!,\n instType: v.instType,\n instId: v.instId,\n json,\n demo: v.demo,\n });\n if (action === \"indicator\") return handleIndicatorAction(run, rest, v, json);\n}\n\nfunction handleIndicatorAction(\n run: ToolRunner,\n rest: string[],\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n if (rest[0] === \"list\") return cmdMarketIndicatorList(json);\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\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, v.demo);\n if (action === \"candles\")\n return cmdMarketCandles(run, rest[0], { bar: v.bar, limit, after: v.after, before: v.before, json, demo: v.demo });\n if (action === \"funding-rate\")\n return cmdMarketFundingRate(run, rest[0], { history: v.history ?? false, limit, json, demo: v.demo });\n if (action === \"trades\")\n return cmdMarketTrades(run, rest[0], { limit, json, demo: v.demo });\n if (action === \"index-candles\")\n return cmdMarketIndexCandles(run, rest[0], { bar: v.bar, limit, history: v.history ?? false, json, demo: v.demo });\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, v.valuation);\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 tgtCcy: v.tgtCcy,\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 if (action === \"fixed-orders\") return cmdEarnFixedOrderList(run, { ccy: v.ccy, state: v.state, json });\n if (action === \"fixed-purchase\") return cmdEarnFixedPurchase(run, { ccy: v.ccy!, amt: v.amt!, term: v.term!, confirm: v.confirm ?? false, json });\n if (action === \"fixed-redeem\") return cmdEarnFixedRedeem(run, { reqId: v.reqId!, 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 requireSkillName(rest: string[], usage: string): string | undefined {\n const name = rest[0];\n if (!name) { errorLine(usage); process.exitCode = 1; }\n return name;\n}\n\nfunction handleSkillAdd(rest: string[], config: import(\"@agent-tradekit/core\").OkxConfig, json: boolean): Promise<void> | void {\n const n = requireSkillName(rest, \"Usage: okx skill add <name>\");\n if (n) return cmdSkillAdd(n, config, json);\n}\n\nfunction handleSkillDownload(rest: string[], v: CliValues, config: import(\"@agent-tradekit/core\").OkxConfig, json: boolean): Promise<void> | void {\n const n = requireSkillName(rest, \"Usage: okx skill download <name> [--dir <path>] [--format zip|skill]\");\n const format = v.format === \"skill\" ? \"skill\" as const : \"zip\" as const;\n if (n) return cmdSkillDownload(n, v.dir ?? process.cwd(), config, json, format);\n}\n\nfunction handleSkillRemove(rest: string[], json: boolean): void {\n const n = requireSkillName(rest, \"Usage: okx skill remove <name>\");\n if (n) cmdSkillRemove(n, json);\n}\n\nfunction handleSkillCheck(run: ToolRunner, rest: string[], json: boolean): Promise<void> | void {\n const n = requireSkillName(rest, \"Usage: okx skill check <name>\");\n if (n) return cmdSkillCheck(run, n, json);\n}\n\nexport function handleSkillCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean,\n config: import(\"@agent-tradekit/core\").OkxConfig,\n): Promise<void> | void {\n if (action === \"search\") return cmdSkillSearch(run, { keyword: rest[0] ?? v.keyword, categories: v.categories, page: v.page, limit: v.limit, json });\n if (action === \"categories\") return cmdSkillCategories(run, json);\n if (action === \"list\") return cmdSkillList(json);\n if (action === \"add\") return handleSkillAdd(rest, config, json);\n if (action === \"download\") return handleSkillDownload(rest, v, config, json);\n if (action === \"remove\") return handleSkillRemove(rest, json);\n if (action === \"check\") return handleSkillCheck(run, rest, json);\n errorLine(`Unknown skill command: ${action}`);\n errorLine(\"Valid: search, categories, add, download, remove, check, list\");\n process.exitCode = 1;\n}\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\n/** Wrap a ToolRunner with audit logging via TradeLogger. */\nexport function wrapRunnerWithLogger(baseRunner: ToolRunner, logger: TradeLogger, verbose = false): ToolRunner {\n const writeToolNames = new Set(allToolSpecs().filter((t) => t.isWrite).map((t) => t.name));\n return async (toolName, args) => {\n const startTime = Date.now();\n try {\n const result = await baseRunner(toolName, args);\n if (writeToolNames.has(toolName)) {\n markFailedIfSCodeError(result.data);\n }\n const elapsed = Date.now() - startTime;\n logger.log(\"info\", toolName, args, { status: \"ok\" }, elapsed);\n if (verbose) {\n logger.log(\"debug\", toolName, args, result, elapsed);\n }\n return result;\n } catch (error) {\n logger.log(\"error\", toolName, args, error, Date.now() - startTime);\n throw error;\n }\n };\n}\n\n// Extracted to reduce cognitive complexity of main()\nasync function runDiagnose(v: ReturnType<typeof parseCli>[\"values\"]): Promise<void> {\n let config: ReturnType<typeof loadProfileConfig> | undefined;\n try {\n config = loadProfileConfig({ profile: v.profile, demo: v.demo, live: v.live, 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\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 if (module === \"upgrade\") return cmdUpgrade(CLI_VERSION, { beta: v.beta, check: v.check, force: v.force }, json);\n\n if (module === \"diagnose\") return runDiagnose(v);\n\n const config = loadProfileConfig({ profile: v.profile, demo: v.demo, live: v.live, verbose: v.verbose, userAgent: `okx-trade-cli/${CLI_VERSION}`, sourceTag: \"CLI\" });\n setEnvContext({ demo: config.demo, profile: v.profile ?? \"default\" });\n setJsonEnvEnabled(v.env ?? false);\n\n const client = new OkxRestClient(config);\n const baseRunner = createToolRunner(client, config);\n const logger = new TradeLogger(v.verbose ? \"debug\" : \"info\");\n const run = wrapRunnerWithLogger(baseRunner, logger, v.verbose ?? false);\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 skill: () => handleSkillCommand(run, action, rest, v, json, config),\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 BinaryRequestOptions,\n BinaryResult,\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 simulatedTrading?: boolean,\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"public\",\n query,\n rateLimit,\n simulatedTrading,\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 // ---------------------------------------------------------------------------\n // Binary (non-JSON) download — reuses auth, proxy, rate-limit, verbose\n // ---------------------------------------------------------------------------\n\n private static readonly DEFAULT_MAX_BYTES = 50 * 1024 * 1024; // 50 MB\n\n /**\n * Try to parse a text body as OKX JSON error and throw the appropriate error.\n * Re-throws OkxApiError / AuthenticationError / RateLimitError if matched.\n * Returns the parsed message string (or fallback) if no specific error was thrown.\n */\n private tryThrowJsonError(text: string, path: string, traceId: string | undefined): string {\n try {\n const parsed = JSON.parse(text) as { code?: string; msg?: string };\n if (parsed.code && parsed.code !== \"0\") {\n this.throwOkxError(parsed.code, parsed.msg, { method: \"POST\", path, auth: \"private\" } as RequestConfig, traceId);\n }\n return parsed.msg ?? \"\";\n } catch (e) {\n if (e instanceof OkxApiError || e instanceof AuthenticationError || e instanceof RateLimitError) throw e;\n return \"\";\n }\n }\n\n /**\n * Send a signed POST request and return the raw binary response.\n * Inherits all client capabilities: auth, proxy, rate-limit, verbose, user-agent.\n * Security: validates Content-Type and enforces maxBytes limit.\n */\n public async privatePostBinary(\n path: string,\n body?: Record<string, unknown>,\n opts?: BinaryRequestOptions,\n ): Promise<BinaryResult> {\n const maxBytes = opts?.maxBytes ?? OkxRestClient.DEFAULT_MAX_BYTES;\n const expectedCT = opts?.expectedContentType ?? \"application/octet-stream\";\n const bodyJson = body ? JSON.stringify(body) : \"\";\n const endpoint = `POST ${path}`;\n\n this.logRequest(\"POST\", `${this.config.baseUrl}${path}`, \"private\");\n\n const reqConfig = { method: \"POST\", path, auth: \"private\" } as RequestConfig;\n const headers = this.buildHeaders(reqConfig, path, bodyJson, getNow());\n\n const t0 = Date.now();\n const response = await this.fetchBinary(path, endpoint, headers, bodyJson, t0);\n const elapsed = Date.now() - t0;\n const traceId = extractTraceId(response.headers);\n\n if (!response.ok) {\n const text = await response.text();\n this.logResponse(response.status, text.length, elapsed, traceId, String(response.status));\n const msg = this.tryThrowJsonError(text, path, traceId) || `HTTP ${response.status}`;\n throw new OkxApiError(msg, { code: String(response.status), endpoint, traceId });\n }\n\n const ct = response.headers.get(\"content-type\") ?? \"\";\n if (!ct.includes(expectedCT)) {\n const text = await response.text();\n this.logResponse(response.status, text.length, elapsed, traceId, \"unexpected-ct\");\n this.tryThrowJsonError(text, path, traceId);\n throw new OkxApiError(`Expected binary response (${expectedCT}) but got: ${ct}`, { code: \"UNEXPECTED_CONTENT_TYPE\", endpoint, traceId });\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n if (buffer.length > maxBytes) {\n throw new OkxApiError(`Response size ${buffer.length} bytes exceeds limit of ${maxBytes} bytes.`, { code: \"RESPONSE_TOO_LARGE\", endpoint, traceId });\n }\n\n if (this.config.verbose) {\n vlog(`\\u2190 ${response.status} | binary ${buffer.length}B | ${elapsed}ms | trace=${traceId ?? \"-\"}`);\n }\n\n return { endpoint, requestTime: new Date().toISOString(), data: buffer, contentType: ct, contentLength: buffer.length, traceId };\n }\n\n /** Execute fetch for binary endpoint, wrapping network errors. */\n private async fetchBinary(path: string, endpoint: string, headers: Headers, bodyJson: string, t0: number): Promise<Response> {\n try {\n const fetchOptions: Record<string, unknown> = {\n method: \"POST\", headers, body: bodyJson || undefined,\n signal: AbortSignal.timeout(this.config.timeoutMs),\n };\n if (this.dispatcher) fetchOptions.dispatcher = this.dispatcher;\n return await fetch(`${this.config.baseUrl}${path}`, fetchOptions as RequestInit);\n } catch (error) {\n if (this.config.verbose) {\n vlog(`\\u2717 NetworkError after ${Date.now() - t0}ms: ${error instanceof Error ? error.message : String(error)}`);\n }\n throw new NetworkError(`Failed to call OKX endpoint ${endpoint}.`, endpoint, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Header building\n // ---------------------------------------------------------------------------\n\n private buildHeaders(reqConfig: RequestConfig, requestPath: string, bodyJson: string, timestamp: string): Headers {\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 // simulatedTrading on individual requests takes precedence over config.demo.\n // If not explicitly set, fall back to config.demo (original behavior for all non-market requests).\n // Market tools always pass simulatedTrading explicitly, defaulting to false (live data).\n const useSimulated = reqConfig.simulatedTrading !== undefined\n ? reqConfig.simulatedTrading\n : this.config.demo;\n if (useSimulated) {\n headers.set(\"x-simulated-trading\", \"1\");\n }\n\n\n return headers;\n }\n\n // ---------------------------------------------------------------------------\n // JSON request\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 = this.buildHeaders(reqConfig, requestPath, bodyJson, timestamp);\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.\n// Default rule: name.toUpperCase().replace(/-/g, \"_\"), so only add entries that deviate.\nconst INDICATOR_CODE_OVERRIDES: Record<string, string> = {\n // Aliases\n \"boll\": \"BB\", // server supports BB not BOLL\n // Names where default rule produces underscores but backend uses no separator\n \"rainbow\": \"BTCRAINBOW\", // default: RAINBOW\n \"stoch-rsi\": \"STOCHRSI\", // default: STOCH_RSI\n \"bull-engulf\": \"BULLENGULF\", // default: BULL_ENGULF\n \"bear-engulf\": \"BEARENGULF\", // default: BEAR_ENGULF\n \"bull-harami\": \"BULLHARAMI\", // default: BULL_HARAMI\n \"bear-harami\": \"BEARHARAMI\", // default: BEAR_HARAMI\n \"bull-harami-cross\": \"BULLHARAMICROSS\",// default: BULL_HARAMI_CROSS\n \"bear-harami-cross\": \"BEARHARAMICROSS\",// default: BEAR_HARAMI_CROSS\n \"three-soldiers\": \"THREESOLDIERS\", // default: THREE_SOLDIERS\n \"three-crows\": \"THREECROWS\", // default: THREE_CROWS\n \"hanging-man\": \"HANGINGMAN\", // default: HANGING_MAN\n \"inverted-hammer\": \"INVERTEDH\", // default: INVERTED_HAMMER (backend uses INVERTEDH)\n \"shooting-star\": \"SHOOTINGSTAR\", // default: SHOOTING_STAR\n \"nvi-pvi\": \"NVIPVI\", // default: NVI_PVI\n \"top-long-short\": \"TOPLONGSHORT\", // default: TOP_LONG_SHORT\n // Note: range-filter → RANGE_FILTER is correct via the default rule; no override needed.\n};\n\n/** All indicators supported by the /api/v5/aigc/mcp/indicators endpoint. */\nexport const KNOWN_INDICATORS: ReadonlyArray<{ readonly name: string; readonly description: string }> = [\n // Moving Averages\n { name: \"ma\", description: \"Simple Moving Average\" },\n { name: \"ema\", description: \"Exponential Moving Average\" },\n { name: \"wma\", description: \"Weighted Moving Average\" },\n { name: \"dema\", description: \"Double Exponential Moving Average\" },\n { name: \"tema\", description: \"Triple Exponential Moving Average\" },\n { name: \"zlema\", description: \"Zero-Lag Exponential Moving Average\" },\n { name: \"hma\", description: \"Hull Moving Average\" },\n { name: \"kama\", description: \"Kaufman Adaptive Moving Average\" },\n // Trend\n { name: \"macd\", description: \"MACD\" },\n { name: \"sar\", description: \"Parabolic SAR\" },\n { name: \"adx\", description: \"Average Directional Index\" },\n { name: \"aroon\", description: \"Aroon Indicator\" },\n { name: \"cci\", description: \"Commodity Channel Index\" },\n { name: \"dpo\", description: \"Detrended Price Oscillator\" },\n { name: \"envelope\", description: \"Envelope\" },\n { name: \"halftrend\", description: \"HalfTrend\" },\n { name: \"alphatrend\", description: \"AlphaTrend\" },\n // Momentum\n { name: \"rsi\", description: \"Relative Strength Index\" },\n { name: \"stoch-rsi\", description: \"Stochastic RSI\" },\n { name: \"stoch\", description: \"Stochastic Oscillator\" },\n { name: \"roc\", description: \"Rate of Change\" },\n { name: \"mom\", description: \"Momentum\" },\n { name: \"ppo\", description: \"Price Percentage Oscillator\" },\n { name: \"trix\", description: \"TRIX\" },\n { name: \"ao\", description: \"Awesome Oscillator\" },\n { name: \"uo\", description: \"Ultimate Oscillator\" },\n { name: \"wr\", description: \"Williams %R\" },\n // Volatility\n { name: \"bb\", description: \"Bollinger Bands\" },\n { name: \"boll\", description: \"Bollinger Bands (alias for bb)\" },\n { name: \"bbwidth\", description: \"Bollinger Band Width\" },\n { name: \"bbpct\", description: \"Bollinger Band %B\" },\n { name: \"atr\", description: \"Average True Range\" },\n { name: \"keltner\", description: \"Keltner Channel\" },\n { name: \"donchian\", description: \"Donchian Channel\" },\n { name: \"hv\", description: \"Historical Volatility\" },\n { name: \"stddev\", description: \"Standard Deviation\" },\n // Volume\n { name: \"obv\", description: \"On-Balance Volume\" },\n { name: \"vwap\", description: \"Volume Weighted Average Price\" },\n { name: \"mvwap\", description: \"Moving VWAP\" },\n { name: \"cmf\", description: \"Chaikin Money Flow\" },\n { name: \"mfi\", description: \"Money Flow Index\" },\n { name: \"ad\", description: \"Accumulation/Distribution\" },\n // Statistical\n { name: \"lr\", description: \"Linear Regression\" },\n { name: \"slope\", description: \"Linear Regression Slope\" },\n { name: \"angle\", description: \"Linear Regression Angle\" },\n { name: \"variance\", description: \"Variance\" },\n { name: \"meandev\", description: \"Mean Deviation\" },\n { name: \"sigma\", description: \"Sigma\" },\n { name: \"stderr\", description: \"Standard Error\" },\n // Custom\n { name: \"kdj\", description: \"KDJ Stochastic Oscillator\" },\n { name: \"supertrend\", description: \"Supertrend\" },\n // Ichimoku\n { name: \"tenkan\", description: \"Ichimoku Tenkan-sen (Conversion Line)\" },\n { name: \"kijun\", description: \"Ichimoku Kijun-sen (Base Line)\" },\n { name: \"senkoa\", description: \"Ichimoku Senkou Span A (Leading Span A)\" },\n { name: \"senkob\", description: \"Ichimoku Senkou Span B (Leading Span B)\" },\n { name: \"chikou\", description: \"Ichimoku Chikou Span (Lagging Span)\" },\n // Candlestick Patterns\n { name: \"doji\", description: \"Doji candlestick pattern\" },\n { name: \"bull-engulf\", description: \"Bullish Engulfing pattern\" },\n { name: \"bear-engulf\", description: \"Bearish Engulfing pattern\" },\n { name: \"bull-harami\", description: \"Bullish Harami pattern\" },\n { name: \"bear-harami\", description: \"Bearish Harami pattern\" },\n { name: \"bull-harami-cross\", description: \"Bullish Harami Cross pattern\" },\n { name: \"bear-harami-cross\", description: \"Bearish Harami Cross pattern\" },\n { name: \"three-soldiers\", description: \"Three White Soldiers pattern\" },\n { name: \"three-crows\", description: \"Three Black Crows pattern\" },\n { name: \"hanging-man\", description: \"Hanging Man pattern\" },\n { name: \"inverted-hammer\", description: \"Inverted Hammer pattern\" },\n { name: \"shooting-star\", description: \"Shooting Star pattern\" },\n // Bitcoin On-Chain\n { name: \"ahr999\", description: \"AHR999 Bitcoin accumulation index\" },\n { name: \"rainbow\", description: \"Bitcoin Rainbow Chart\" },\n // Other\n { name: \"fisher\", description: \"Fisher Transform\" },\n { name: \"nvi-pvi\", description: \"Negative/Positive Volume Index (returns both)\" },\n { name: \"pmax\", description: \"PMAX\" },\n { name: \"qqe\", description: \"QQE Mod\" },\n { name: \"tdi\", description: \"Traders Dynamic Index\" },\n { name: \"waddah\", description: \"Waddah Attar Explosion\" },\n { name: \"range-filter\", description: \"Range Filter\" },\n { name: \"cho\", description: \"Chande Momentum Oscillator\" },\n { name: \"tr\", description: \"True Range\" },\n { name: \"tp\", description: \"Typical Price\" },\n { name: \"mp\", description: \"Median Price\" },\n { name: \"top-long-short\", description: \"Top Trader Long/Short Ratio (timeframe-independent)\" },\n] as const;\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). Call market_list_indicators to see all supported names.\",\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 name: \"market_list_indicators\",\n module: \"market\",\n description:\n \"List all supported technical indicator names and descriptions. Call this before market_get_indicator to discover valid indicator names. No credentials required.\",\n isWrite: false,\n inputSchema: { type: \"object\", properties: {} },\n handler: async () => ({ data: KNOWN_INDICATORS }),\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 \"skills\",\n] as const;\n\nexport type ModuleId = (typeof MODULES)[number];\n\nexport const DEFAULT_MODULES: ModuleId[] = [\"spot\", \"swap\", \"option\", \"account\", ...BOT_DEFAULT_SUB_MODULES, \"skills\"];\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. Optionally includes total asset valuation across all account types (trading, funding, earn, etc.).\",\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 showValuation: {\n type: \"boolean\",\n description:\n \"Include total asset valuation breakdown by account type (trading/funding/earn). Default false.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const ccy = readString(args, \"ccy\");\n const showValuation = readBoolean(args, \"showValuation\");\n if (showValuation) {\n const balanceResp = await context.client.privateGet(\n \"/api/v5/asset/balances\",\n compactObject({ ccy }),\n privateRateLimit(\"account_get_asset_balance\", 6),\n );\n let valuationData: unknown = null;\n try {\n const valuationResp = await context.client.privateGet(\n \"/api/v5/asset/asset-valuation\",\n {},\n privateRateLimit(\"account_get_asset_valuation\", 1),\n );\n valuationData = valuationResp.data;\n } catch {\n // valuation is best-effort; balance data is still returned\n }\n return { ...normalizeResponse(balanceResp), valuation: valuationData };\n }\n const balanceResp = await context.client.privateGet(\n \"/api/v5/asset/balances\",\n compactObject({ ccy }),\n privateRateLimit(\"account_get_asset_balance\", 6),\n );\n return normalizeResponse(balanceResp);\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 \"Note: `settleCcy` is the current settlement currency for USDS-margined contracts. \" +\n \"`settleCcyList` is the list of available settlement currencies to choose from. \" +\n \"These fields only apply to USDS-margined contracts and can be ignored for standard USDT/coin-margined trading.\",\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","/**\n * tgtCcy conversion layer for SWAP/FUTURES/OPTION orders.\n *\n * OKX API silently ignores tgtCcy for non-SPOT instruments, treating `sz`\n * as contract count regardless. This module detects the case and auto-converts\n * a USDT amount to contract count before the order is sent to the API.\n *\n * Supported modes:\n * - tgtCcy=quote_ccy: sz is nominal value (USDT).\n * Formula: contracts = floor(usdtAmount / (ctVal * lastPx), lotSz precision)\n * - tgtCcy=margin: sz is margin cost (USDT). Actual notional = sz * lever.\n * Formula: contracts = floor(marginAmount * lever / (ctVal * lastPx), lotSz precision)\n */\n\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nexport interface QuoteCcyResult {\n /** Resolved sz: either original value (passthrough) or converted contract count. */\n sz: string;\n /** Resolved tgtCcy: undefined after conversion (stripped from API request). */\n tgtCcy: string | undefined;\n /** Human-readable note about the conversion. Undefined if no conversion occurred. */\n conversionNote?: string;\n}\n\n/**\n * Minimal interface for the client methods we need. Allows easy mocking in tests\n * without depending on the full OkxRestClient class.\n */\ninterface ConversionClient {\n publicGet(\n endpoint: string,\n params: Record<string, unknown>,\n ...rest: unknown[]\n ): Promise<{ endpoint: string; requestTime: string; data: unknown }>;\n privateGet(\n endpoint: string,\n params: Record<string, unknown>,\n ...rest: unknown[]\n ): Promise<{ endpoint: string; requestTime: string; data: unknown }>;\n}\n\ninterface InstrumentParams {\n ctVal: number;\n ctValStr: string;\n minSz: number;\n minSzStr: string;\n lotSz: number;\n lotSzStr: string;\n}\n\nfunction extractInstrumentParams(instId: string, data: unknown): InstrumentParams {\n const instruments = Array.isArray(data) ? (data as Record<string, unknown>[]) : [];\n if (instruments.length === 0) {\n throw new Error(`Failed to fetch instrument info for ${instId}: empty instrument list. Cannot determine ctVal for conversion.`);\n }\n const inst = instruments[0];\n\n const ctValStr = String(inst.ctVal ?? \"\");\n const ctVal = parseFloat(ctValStr);\n if (!isFinite(ctVal) || ctVal <= 0) {\n throw new Error(`Invalid ctVal \"${ctValStr}\" for ${instId}. ctVal must be a positive number for conversion.`);\n }\n\n const minSzStr = String(inst.minSz ?? \"1\");\n const minSz = parseFloat(minSzStr);\n if (!isFinite(minSz) || minSz <= 0) {\n throw new Error(`Invalid minSz \"${minSzStr}\" for ${instId}. minSz must be a positive number for conversion.`);\n }\n\n const lotSzStr = String(inst.lotSz ?? \"1\");\n const lotSz = parseFloat(lotSzStr);\n if (!isFinite(lotSz) || lotSz <= 0) {\n throw new Error(`Invalid lotSz \"${lotSzStr}\" for ${instId}. lotSz must be a positive number for conversion.`);\n }\n\n return { ctVal, ctValStr, minSz, minSzStr, lotSz, lotSzStr };\n}\n\nfunction extractLastPx(instId: string, data: unknown): { lastPx: number; lastStr: string } {\n const tickers = Array.isArray(data) ? (data as Record<string, unknown>[]) : [];\n if (tickers.length === 0) {\n throw new Error(`Failed to fetch ticker price for ${instId}: empty ticker response. Cannot determine last price for conversion.`);\n }\n const lastStr = String(tickers[0].last ?? \"\");\n const lastPx = parseFloat(lastStr);\n if (!isFinite(lastPx) || lastPx <= 0) {\n throw new Error(`Invalid last price \"${lastStr}\" for ${instId}. Last price must be a positive number for conversion.`);\n }\n return { lastPx, lastStr };\n}\n\nfunction extractLeverage(instId: string, mgnMode: string, data: unknown): { lever: number; leverStr: string } {\n const leverageData = Array.isArray(data) ? (data as Record<string, unknown>[]) : [];\n if (leverageData.length === 0) {\n throw new Error(\n `Failed to fetch leverage info for ${instId} (mgnMode=${mgnMode}): empty response. ` +\n `Cannot determine leverage for margin conversion. Please set leverage first using set_leverage.`,\n );\n }\n const leverStr = String(leverageData[0].lever ?? \"1\");\n const lever = parseFloat(leverStr);\n if (!isFinite(lever) || lever <= 0) {\n throw new Error(`Invalid leverage \"${leverStr}\" for ${instId}. Leverage must be a positive number for margin conversion.`);\n }\n return { lever, leverStr };\n}\n\ninterface ConversionParams {\n instId: string;\n sz: string;\n isMarginMode: boolean;\n inst: InstrumentParams;\n lastPx: number;\n lastStr: string;\n lever: number;\n leverStr: string;\n}\n\nfunction computeContracts(p: ConversionParams): { contractsStr: string; conversionNote: string } {\n const { instId, sz, isMarginMode, inst, lastPx, lastStr, lever, leverStr } = p;\n const { ctVal, ctValStr, minSz, minSzStr, lotSz, lotSzStr } = inst;\n\n const userAmount = parseFloat(sz);\n const contractValue = ctVal * lastPx;\n const effectiveNotional = isMarginMode ? userAmount * lever : userAmount;\n const lotSzDecimals = lotSzStr.includes(\".\") ? lotSzStr.split(\".\")[1].length : 0;\n const precision = 10 ** (lotSzDecimals + 4);\n const rawContracts = Math.round((effectiveNotional / contractValue) * precision) / precision;\n const rawLots = Math.round((rawContracts / lotSz) * precision) / precision;\n const contractsRounded = parseFloat((Math.floor(rawLots) * lotSz).toFixed(lotSzDecimals));\n\n if (contractsRounded < minSz) {\n const minAmount = isMarginMode\n ? (minSz * contractValue / lever).toFixed(2)\n : (minSz * contractValue).toFixed(2);\n const unit = isMarginMode ? \"USDT margin\" : \"USDT\";\n throw new Error(\n `sz=${sz} ${unit} is too small for ${instId}. ` +\n `Minimum order size is ${minSzStr} contracts (≈ ${minAmount} ${unit}). ` +\n `(ctVal=${ctValStr}, lastPx=${lastStr}, minSz=${minSzStr}, lotSz=${lotSzStr}` +\n (isMarginMode ? `, lever=${leverStr}` : \"\") + `).\\n`,\n );\n }\n\n const contractsStr = contractsRounded.toFixed(lotSzDecimals);\n const conversionNote = isMarginMode\n ? `Converting ${sz} USDT margin (${leverStr}x leverage) → ${contractsStr} contracts ` +\n `(notional value ≈ ${(contractsRounded * contractValue).toFixed(2)} USDT, ` +\n `ctVal=${ctValStr}, lastPx=${lastStr}, lever=${leverStr}, minSz=${minSzStr}, lotSz=${lotSzStr})`\n : `Converting ${sz} USDT → ${contractsStr} contracts ` +\n `(ctVal=${ctValStr}, lastPx=${lastStr}, minSz=${minSzStr}, lotSz=${lotSzStr})`;\n\n return { contractsStr, conversionNote };\n}\n\n/**\n * Resolve the sz parameter for a contract order.\n *\n * Fast path: if tgtCcy is undefined or \"base_ccy\", returns unchanged.\n * Throws ValidationError for unknown tgtCcy values.\n * Conversion: fetches instrument params + ticker (+ leverage for margin mode),\n * then delegates to computeContracts() for the math.\n */\nexport async function resolveQuoteCcySz(\n instId: string,\n sz: string,\n tgtCcy: string | undefined,\n instType: string,\n client: OkxRestClient | ConversionClient,\n tdMode?: string,\n): Promise<QuoteCcyResult> {\n // passthrough: undefined or base_ccy (default behavior, no conversion needed)\n if (tgtCcy === undefined || tgtCcy === \"base_ccy\") {\n return { sz, tgtCcy, conversionNote: undefined };\n }\n // only quote_ccy and margin enter conversion\n if (tgtCcy !== \"quote_ccy\" && tgtCcy !== \"margin\") {\n throw new ValidationError(\n `Unknown tgtCcy value \"${tgtCcy}\". Valid values: base_ccy, quote_ccy, margin.`,\n `Check the --tgtCcy flag. Use base_ccy (default, sz in contracts), quote_ccy (sz in USDT notional), or margin (sz in USDT margin cost).`,\n );\n }\n\n const isMarginMode = tgtCcy === \"margin\";\n if (isMarginMode && !tdMode) {\n throw new Error(\n \"tdMode (cross or isolated) is required when tgtCcy=margin. \" +\n \"Cannot determine leverage without knowing the margin mode.\",\n );\n }\n\n const mgnMode = tdMode === \"cross\" ? \"cross\" : \"isolated\";\n const fetchPromises: Promise<{ endpoint: string; requestTime: string; data: unknown }>[] = [\n (client as ConversionClient).publicGet(\"/api/v5/public/instruments\", { instType, instId }),\n (client as ConversionClient).publicGet(\"/api/v5/market/ticker\", { instId }),\n ];\n if (isMarginMode) {\n fetchPromises.push((client as ConversionClient).privateGet(\"/api/v5/account/leverage-info\", { instId, mgnMode }));\n }\n const results = await Promise.all(fetchPromises);\n\n const inst = extractInstrumentParams(instId, results[0].data);\n const { lastPx, lastStr } = extractLastPx(instId, results[1].data);\n const { lever, leverStr } = isMarginMode\n ? extractLeverage(instId, mgnMode, results[2].data)\n : { lever: 1, leverStr: \"1\" };\n\n const { contractsStr, conversionNote } = computeContracts({\n instId, sz, isMarginMode, inst, lastPx, lastStr, lever, leverStr,\n });\n\n return { sz: contractsStr, tgtCcy: undefined, conversionNote };\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 { resolveQuoteCcySz } from \"./tgtccy-conversion.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\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n \"SWAP\",\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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 const result = normalizeResponse(response);\n if (resolved.conversionNote) {\n result._conversion = resolved.conversionNote;\n }\n return result;\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\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n \"FUTURES\",\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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 const result = normalizeResponse(response);\n if (resolved.conversionNote) {\n result._conversion = resolved.conversionNote;\n }\n return result;\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 { writeFileSync, renameSync, unlinkSync, mkdirSync } from \"node:fs\";\nimport { join, resolve, basename, sep } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Safely write binary data to a file.\n * - Writes to a .tmp file first, then atomically renames\n * - Validates the target path is within the expected directory\n * - Cleans up .tmp on failure\n */\nexport function safeWriteFile(\n targetDir: string,\n fileName: string,\n data: Buffer,\n): string {\n // Sanitize fileName: strip path components, use only basename\n const safeName = basename(fileName);\n if (!safeName || safeName === \".\" || safeName === \"..\") {\n throw new Error(`Invalid file name: \"${fileName}\"`);\n }\n\n const resolvedDir = resolve(targetDir);\n const filePath = join(resolvedDir, safeName);\n const resolvedPath = resolve(filePath);\n\n // Path traversal check: resolved path must be within target directory\n if (!resolvedPath.startsWith(resolvedDir + sep)) {\n throw new Error(`Path traversal detected: \"${fileName}\" resolves outside target directory`);\n }\n\n mkdirSync(resolvedDir, { recursive: true });\n\n // Atomic write: write to temp file, then rename\n const tmpPath = `${resolvedPath}.${randomUUID()}.tmp`;\n try {\n writeFileSync(tmpPath, data);\n renameSync(tmpPath, resolvedPath);\n } catch (err) {\n // Cleanup temp file on failure\n try { unlinkSync(tmpPath); } catch { /* ignore */ }\n throw err;\n }\n\n return resolvedPath;\n}\n\n/**\n * Validate that a zip entry path is safe (no path traversal, no symlinks in path).\n * Returns the resolved path within targetDir, or throws.\n */\nexport function validateZipEntryPath(targetDir: string, entryName: string): string {\n const resolvedDir = resolve(targetDir);\n const resolvedEntry = resolve(resolvedDir, entryName);\n\n // Must be within targetDir\n if (!resolvedEntry.startsWith(resolvedDir + sep) && resolvedEntry !== resolvedDir) {\n throw new Error(`Zip path traversal detected: \"${entryName}\" resolves outside extraction directory`);\n }\n\n return resolvedEntry;\n}\n","import type { OkxRestClient } from \"../client/rest-client.js\";\nimport { safeWriteFile } from \"../utils/safe-file.js\";\n\n/** Maximum download size: 50 MB */\nconst MAX_DOWNLOAD_BYTES = 50 * 1024 * 1024;\n\n/**\n * Download a skill package from the marketplace API using OkxRestClient.\n * Inherits all client capabilities: auth, proxy, rate-limit, verbose, user-agent.\n *\n * Security:\n * - Content-Type validation (must be octet-stream)\n * - Size limit enforced (50 MB)\n * - Atomic file write via safeWriteFile (temp + rename)\n * - File name is fixed to `{name}.{format}` (ignores server-supplied filename)\n *\n * @param format - Output file extension: \"zip\" (default) or \"skill\". Content is identical.\n * Returns the file path of the saved file.\n */\nexport async function downloadSkillZip(\n client: OkxRestClient,\n name: string,\n targetDir: string,\n format: \"zip\" | \"skill\" = \"zip\",\n): Promise<string> {\n const result = await client.privatePostBinary(\n \"/api/v5/skill/download\",\n { name },\n { maxBytes: MAX_DOWNLOAD_BYTES },\n );\n\n // Fixed filename — never trust server-supplied Content-Disposition\n const ext = format === \"skill\" ? \"skill\" : \"zip\";\n const fileName = `${name}.${ext}`;\n const filePath = safeWriteFile(targetDir, fileName, result.data);\n\n return filePath;\n}\n","import yauzl from \"yauzl\";\nimport { createWriteStream, mkdirSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { validateZipEntryPath } from \"../utils/safe-file.js\";\n\n/** Limits for zip extraction to prevent abuse. */\nexport interface ExtractLimits {\n /** Maximum total extracted size in bytes. Default: 100 MB. */\n maxTotalBytes?: number;\n /** Maximum number of files in the zip. Default: 1000. */\n maxFiles?: number;\n /** Maximum compression ratio per entry. Default: 100. */\n maxCompressionRatio?: number;\n}\n\nconst DEFAULT_MAX_TOTAL_BYTES = 100 * 1024 * 1024; // 100 MB\nconst DEFAULT_MAX_FILES = 1000;\nconst DEFAULT_MAX_COMPRESSION_RATIO = 100;\n\n/** Mutable counters passed through entry validation. */\ninterface ExtractState {\n fileCount: number;\n totalBytes: number;\n}\n\n/**\n * Validate a single zip entry against all security checks.\n * Throws on violation. Returns the resolved output path on success.\n */\nfunction validateEntry(\n entry: yauzl.Entry,\n targetDir: string,\n state: ExtractState,\n limits: { maxFiles: number; maxTotalBytes: number; maxCompressionRatio: number },\n): string {\n // File count limit\n state.fileCount++;\n if (state.fileCount > limits.maxFiles) {\n throw new Error(\n `Zip contains more than ${limits.maxFiles} entries, exceeding limit of ${limits.maxFiles}. Possible zip bomb.`,\n );\n }\n\n // Path traversal check\n const resolvedPath = validateZipEntryPath(targetDir, entry.fileName);\n\n // Symlink check: Unix external attributes with symlink flag (0xA000)\n const externalAttrs = entry.externalFileAttributes;\n if (externalAttrs) {\n const unixMode = (externalAttrs >>> 16) & 0xFFFF;\n if ((unixMode & 0o120000) === 0o120000) {\n throw new Error(`Zip entry \"${entry.fileName}\" is a symlink. Symlinks are not allowed for security.`);\n }\n }\n\n // Compression ratio check: detect single-entry zip bombs\n if (entry.compressedSize > 0) {\n const ratio = entry.uncompressedSize / entry.compressedSize;\n if (ratio > limits.maxCompressionRatio) {\n throw new Error(\n `Zip entry \"${entry.fileName}\" has compression ratio ${ratio.toFixed(1)}, exceeding limit of ${limits.maxCompressionRatio}. Possible zip bomb.`,\n );\n }\n }\n\n // Zip bomb check: accumulated uncompressed size\n state.totalBytes += entry.uncompressedSize;\n if (state.totalBytes > limits.maxTotalBytes) {\n throw new Error(\n `Extracted size ${state.totalBytes} bytes exceeds limit of ${limits.maxTotalBytes} bytes. Possible zip bomb.`,\n );\n }\n\n return resolvedPath;\n}\n\n/**\n * Safely extract a skill zip file to a target directory.\n *\n * Security measures (validated per-entry in validateEntry):\n * - Path traversal check: every entry path must resolve within targetDir\n * - Zip bomb protection: total extracted size capped at maxTotalBytes\n * - File count limit: prevents zip with excessive entries\n * - Symlink rejection: entries with symlink external attributes are rejected\n *\n * Returns the target directory path.\n */\nexport async function extractSkillZip(\n zipPath: string,\n targetDir: string,\n limits?: ExtractLimits,\n): Promise<string> {\n const maxTotalBytes = limits?.maxTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES;\n const maxFiles = limits?.maxFiles ?? DEFAULT_MAX_FILES;\n const maxCompressionRatio = limits?.maxCompressionRatio ?? DEFAULT_MAX_COMPRESSION_RATIO;\n const resolvedTarget = resolve(targetDir);\n\n mkdirSync(resolvedTarget, { recursive: true });\n\n // Security: archive expansion is guarded by validateEntry() which enforces\n // file count limits, size limits, path traversal checks, and symlink rejection.\n return new Promise<string>((resolvePromise, reject) => {\n yauzl.open(zipPath, { lazyEntries: true }, (err, zipfile) => {\n if (err) return reject(err);\n\n const state: ExtractState = { fileCount: 0, totalBytes: 0 };\n\n zipfile.readEntry();\n zipfile.on(\"entry\", (entry: yauzl.Entry) => {\n if (entry.fileName.endsWith(\"/\")) { zipfile.readEntry(); return; }\n\n let resolvedPath: string;\n try {\n resolvedPath = validateEntry(entry, resolvedTarget, state, { maxFiles, maxTotalBytes, maxCompressionRatio });\n } catch (e) {\n zipfile.close();\n return reject(e);\n }\n\n zipfile.openReadStream(entry, (streamErr, readStream) => {\n if (streamErr) { zipfile.close(); return reject(streamErr); }\n mkdirSync(dirname(resolvedPath), { recursive: true });\n const writeStream = createWriteStream(resolvedPath);\n readStream.pipe(writeStream);\n writeStream.on(\"close\", () => zipfile.readEntry());\n writeStream.on(\"error\", (writeErr) => { zipfile.close(); reject(writeErr); });\n });\n });\n\n zipfile.on(\"end\", () => resolvePromise(resolvedTarget));\n zipfile.on(\"error\", reject);\n });\n });\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SkillMeta } from \"./types.js\";\n\n/**\n * Read and parse _meta.json from an extracted skill directory.\n * Throws if _meta.json is missing or invalid.\n */\nexport function readMetaJson(contentDir: string): SkillMeta {\n const metaPath = join(contentDir, \"_meta.json\");\n if (!existsSync(metaPath)) {\n throw new Error(`_meta.json not found in ${contentDir}. Invalid skill package.`);\n }\n\n const raw = readFileSync(metaPath, \"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Failed to parse _meta.json: invalid JSON`);\n }\n\n const meta = parsed as Record<string, unknown>;\n if (typeof meta.name !== \"string\" || !meta.name) {\n throw new Error(`_meta.json: \"name\" field is required`);\n }\n if (typeof meta.version !== \"string\" || !meta.version) {\n throw new Error(`_meta.json: \"version\" field is required`);\n }\n\n return {\n name: String(meta.name),\n version: String(meta.version),\n title: typeof meta.title === \"string\" ? meta.title : \"\",\n description: typeof meta.description === \"string\" ? meta.description : \"\",\n };\n}\n\n/**\n * Validate that SKILL.md exists in the extracted skill directory.\n */\nexport function validateSkillMdExists(contentDir: string): void {\n const skillMdPath = join(contentDir, \"SKILL.md\");\n if (!existsSync(skillMdPath)) {\n throw new Error(`SKILL.md not found in ${contentDir}. Invalid skill package.`);\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { SkillMeta, SkillRecord, SkillRegistry } from \"./types.js\";\n\nconst DEFAULT_REGISTRY_PATH = join(homedir(), \".okx\", \"skills\", \"registry.json\");\n\n/** Read the local skill registry. Returns empty registry if file doesn't exist. */\nexport function readRegistry(registryPath = DEFAULT_REGISTRY_PATH): SkillRegistry {\n if (!existsSync(registryPath)) {\n return { version: 1, skills: {} };\n }\n try {\n const raw = readFileSync(registryPath, \"utf-8\");\n return JSON.parse(raw) as SkillRegistry;\n } catch {\n return { version: 1, skills: {} };\n }\n}\n\n/** Write the registry back to disk. */\nexport function writeRegistry(registry: SkillRegistry, registryPath = DEFAULT_REGISTRY_PATH): void {\n mkdirSync(dirname(registryPath), { recursive: true });\n writeFileSync(registryPath, JSON.stringify(registry, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/** Add or update a skill record from _meta.json data. */\nexport function upsertSkillRecord(meta: SkillMeta, registryPath = DEFAULT_REGISTRY_PATH): void {\n const registry = readRegistry(registryPath);\n const now = new Date().toISOString();\n const existing = registry.skills[meta.name];\n\n registry.skills[meta.name] = {\n name: meta.name,\n version: meta.version,\n description: meta.description,\n installedAt: existing?.installedAt ?? now,\n updatedAt: now,\n source: \"marketplace\",\n };\n\n writeRegistry(registry, registryPath);\n}\n\n/** Remove a skill from the registry. Returns true if the skill was found and removed. */\nexport function removeSkillRecord(name: string, registryPath = DEFAULT_REGISTRY_PATH): boolean {\n const registry = readRegistry(registryPath);\n if (!(name in registry.skills)) return false;\n delete registry.skills[name];\n writeRegistry(registry, registryPath);\n return true;\n}\n\n/** Get a single skill record by name. */\nexport function getSkillRecord(name: string, registryPath = DEFAULT_REGISTRY_PATH): SkillRecord | undefined {\n const registry = readRegistry(registryPath);\n return registry.skills[name];\n}\n\n/** Get the registry file path (for display). */\nexport function getRegistryPath(): string {\n return DEFAULT_REGISTRY_PATH;\n}\n","import type { ToolSpec, ToolArgs, ToolContext } from \"./types.js\";\nimport { downloadSkillZip } from \"../skills/index.js\";\n\nexport function registerSkillsTools(): ToolSpec[] {\n return [\n {\n name: \"skills_get_categories\",\n module: \"skills\",\n description:\n \"List all available skill categories in OKX Skills Marketplace. \" +\n \"Use the returned categoryId as input to skills_search for category filtering. \" +\n \"Do NOT use for searching or downloading skills — use skills_search or skills_download.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n isWrite: false,\n handler: handleGetCategories,\n },\n {\n name: \"skills_search\",\n module: \"skills\",\n description:\n \"Search for skills in OKX Skills Marketplace by keyword or category. \" +\n \"To get valid category IDs, call skills_get_categories first. \" +\n \"Returns skill names for use with skills_download. \" +\n \"Do NOT use for downloading — use skills_download.\",\n inputSchema: {\n type: \"object\",\n properties: {\n keyword: {\n type: \"string\",\n description: \"Search keyword (matches name, description, tags)\",\n },\n categories: {\n type: \"string\",\n description: \"Filter by category ID\",\n },\n page: {\n type: \"string\",\n description: \"Page number, starting from 1. Default: 1\",\n },\n limit: {\n type: \"string\",\n description: \"Results per page. Default: 20, max: 100\",\n },\n },\n additionalProperties: false,\n },\n isWrite: false,\n handler: handleSearch,\n },\n {\n name: \"skills_download\",\n module: \"skills\",\n description:\n \"Download a skill package from OKX Skills Marketplace to a local directory. \" +\n \"Always call skills_search first to confirm the skill name exists. \" +\n \"Downloads the latest approved version. \" +\n \"NOTE: Downloads third-party developer content — does NOT install to agents. \" +\n \"For full installation use CLI: okx skill add <name>. \" +\n \"Use when the user wants to inspect or manually install a skill package.\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"Skill name (unique identifier)\",\n },\n targetDir: {\n type: \"string\",\n description: \"Directory path where the file will be saved\",\n },\n format: {\n type: \"string\",\n description: \"Output file format: 'zip' or 'skill' (default: 'skill')\",\n enum: [\"zip\", \"skill\"],\n },\n },\n required: [\"name\", \"targetDir\"],\n additionalProperties: false,\n },\n isWrite: true,\n handler: handleDownload,\n },\n ];\n}\n\nasync function handleGetCategories(\n _args: ToolArgs,\n ctx: ToolContext,\n): Promise<unknown> {\n const result = await ctx.client.privateGet(\n \"/api/v5/skill/categories\",\n );\n return result;\n}\n\nasync function handleSearch(\n args: ToolArgs,\n ctx: ToolContext,\n): Promise<unknown> {\n const query: Record<string, string> = {};\n if (args.keyword) query.keyword = String(args.keyword);\n if (args.categories) query.categories = String(args.categories);\n if (args.page) query.page = String(args.page);\n if (args.limit) query.limit = String(args.limit);\n\n const result = await ctx.client.privateGet(\n \"/api/v5/skill/search\",\n query,\n );\n // totalPage is returned at the top level of the API response (not inside data)\n const totalPage = result.raw?.totalPage as string | undefined;\n return { ...result, totalPage };\n}\n\nasync function handleDownload(\n args: ToolArgs,\n ctx: ToolContext,\n): Promise<unknown> {\n const name = String(args.name);\n const targetDir = String(args.targetDir);\n const format = args.format === \"zip\" ? \"zip\" : \"skill\";\n\n const filePath = await downloadSkillZip(ctx.client, name, targetDir, format);\n\n return {\n endpoint: \"POST /api/v5/skill/download\",\n requestTime: new Date().toISOString(),\n data: {\n name,\n filePath,\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/** Build triggerParams for dca_create_order. */\nfunction buildTriggerParam(\n args: Record<string, unknown>,\n algoOrdType: string,\n): Record<string, string> {\n const triggerStrategy = readString(args, \"triggerStrategy\") ?? \"instant\";\n\n if (triggerStrategy === \"price\" && algoOrdType === \"spot_dca\") {\n throw new OkxApiError(\n \"triggerStrategy 'price' is only supported for contract_dca. spot_dca supports: instant, rsi\",\n { code: \"VALIDATION\", endpoint: `${BASE}/create` },\n );\n }\n\n const param: Record<string, string> = { triggerAction: \"start\", triggerStrategy };\n\n if (triggerStrategy === \"price\") {\n param[\"triggerPx\"] = requireString(args, \"triggerPx\");\n const triggerCond = readString(args, \"triggerCond\");\n if (triggerCond) param[\"triggerCond\"] = triggerCond;\n } else if (triggerStrategy === \"rsi\") {\n param[\"triggerCond\"] = requireString(args, \"triggerCond\");\n param[\"thold\"] = requireString(args, \"thold\");\n param[\"timeframe\"] = requireString(args, \"timeframe\");\n param[\"timePeriod\"] = readString(args, \"timePeriod\") ?? \"14\";\n }\n\n return param;\n}\n\n/** Validate conditional required params when maxSafetyOrds > 0. */\nfunction validateSafetyOrderParams(\n args: Record<string, unknown>,\n maxSafetyOrds: string,\n): void {\n if (Number(maxSafetyOrds) <= 0) return;\n const required = [\"safetyOrdAmt\", \"pxSteps\", \"pxStepsMult\", \"volMult\"] as const;\n for (const field of required) {\n if (!readString(args, field)) {\n throw new OkxApiError(`${field} is required when maxSafetyOrds > 0`, {\n code: \"VALIDATION\",\n endpoint: `${BASE}/create`,\n });\n }\n }\n}\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 const triggerParam = buildTriggerParam(args, algoOrdType);\n const maxSafetyOrds = requireString(args, \"maxSafetyOrds\");\n validateSafetyOrderParams(args, maxSafetyOrds);\n\n const allowReinvestRaw = args[\"allowReinvest\"];\n const allowReinvest = allowReinvestRaw !== undefined\n ? allowReinvestRaw === true || allowReinvestRaw === \"true\"\n : undefined;\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,\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 readBoolean,\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 for all currencies or a specific one. \" +\n \"To show market rates alongside balance (市场均利率), call earn_get_lending_rate_history. \" +\n \"earn_get_lending_rate_history also returns fixed-term (定期) product offers, so one call gives a complete view of both flexible and fixed options. \" +\n \"Do NOT use for fixed-term (定期) order queries — use earn_get_fixed_order_list 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_get_fixed_order_list\",\n module: \"earn.savings\",\n description:\n \"Get Simple Earn Fixed (定期赚币) lending order list. \" +\n \"Returns orders sorted by creation time descending. \" +\n \"Use this to check status of fixed-term lending orders (pending/earning/expired/settled/cancelled). \" +\n \"Do NOT use for flexible earn balance — use earn_get_savings_balance instead. \" +\n \"If the result is empty, do NOT display any fixed-term section in the output.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency, e.g. USDT. Omit for all.\",\n },\n state: {\n type: \"string\",\n description:\n \"Order state: pending (匹配中), earning (赚币中), expired (逾期), settled (已结算), cancelled (已撤销). 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/simple-earn-fixed/order-list\",\n compactObject({\n ccy: readString(args, \"ccy\"),\n state: readString(args, \"state\"),\n }),\n privateRateLimit(\"earn_get_fixed_order_list\", 3),\n );\n const result = normalizeResponse(response);\n if (Array.isArray(result[\"data\"])) {\n result[\"data\"] = (result[\"data\"] as Record<string, unknown>[]).map(\n ({ finalSettlementDate: _, ...rest }) => rest,\n );\n }\n return result;\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 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 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 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_fixed_purchase\",\n module: \"earn.savings\",\n description:\n \"Purchase Simple Earn Fixed (定期) product, two-step flow. \" +\n \"First call (confirm omitted or false): returns purchase preview with product details and risk warning. \" +\n \"Preview offer fields: lendQuota = remaining quota (剩余额度), soldOut = whether product is sold out (lendQuota is 0). \" +\n \"YOU MUST display the 'warning' field from the preview response to the user VERBATIM before asking for confirmation — do NOT omit or summarize it. \" +\n \"Second call (confirm=true): executes the purchase. Only proceed after the user explicitly confirms. \" +\n \"IMPORTANT: Orders in 'pending' (匹配中) state can still be cancelled via earn_fixed_redeem; once the status changes to 'earning' (赚币中), funds are LOCKED until maturity — no early redemption allowed.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency, e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Purchase amount\",\n },\n term: {\n type: \"string\",\n description: \"Term, e.g. 90D\",\n },\n confirm: {\n type: \"boolean\",\n description:\n \"Omit or false on the first call to preview the purchase details; \" +\n \"set to true on the second call to execute after user confirms.\",\n },\n },\n required: [\"ccy\", \"amt\", \"term\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const ccy = requireString(args, \"ccy\");\n const amt = requireString(args, \"amt\");\n const term = requireString(args, \"term\");\n const confirm = readBoolean(args, \"confirm\") ?? false;\n\n if (!confirm) {\n // First call: preview mode — fetch offer + current rate, no state change\n const [rateResponse, fixedResponse] = await Promise.all([\n context.client.publicGet(\n \"/api/v5/finance/savings/lending-rate-history\",\n compactObject({ ccy, limit: 1 }),\n publicRateLimit(\"earn_get_lending_rate_history\", 6),\n ),\n context.client.privateGet(\n \"/api/v5/finance/simple-earn-fixed/offers\",\n compactObject({ ccy }),\n privateRateLimit(\"earn_fixed_purchase_preview_offers\", 2),\n ).catch(() => null),\n ]);\n const rateResult = normalizeResponse(rateResponse);\n const fixedResult = fixedResponse ? normalizeResponse(fixedResponse) : { data: [] };\n const rateArr = Array.isArray(rateResult[\"data\"])\n ? (rateResult[\"data\"] as Record<string, unknown>[])\n : [];\n const allOffers = Array.isArray(fixedResult[\"data\"])\n ? (fixedResult[\"data\"] as Record<string, unknown>[])\n : [];\n const matchedOffer = allOffers.find(\n (o) => o[\"term\"] === term && o[\"ccy\"] === ccy,\n );\n const { borrowingOrderQuota: _, ...offerWithoutTotal } = matchedOffer ?? {};\n const offerWithSoldOut = matchedOffer\n ? { ...offerWithoutTotal, soldOut: offerWithoutTotal[\"lendQuota\"] === \"0\" }\n : null;\n\n return {\n preview: true,\n ccy,\n amt,\n term,\n offer: offerWithSoldOut,\n currentFlexibleRate: rateArr[0]?.[\"lendingRate\"] ?? null,\n warning:\n \"⚠️ Orders still in 'pending' state can be cancelled before matching completes. \" +\n \"Once the status changes to 'earning', funds are LOCKED until maturity — early redemption is NOT allowed. \" +\n \"Please call again with confirm=true to proceed.\",\n };\n }\n\n // Second call: execute purchase\n assertNotDemo(context.config, \"earn_fixed_purchase\");\n const response = await context.client.privatePost(\n \"/api/v5/finance/simple-earn-fixed/purchase\",\n { ccy, amt, term },\n privateRateLimit(\"earn_fixed_purchase\", 2),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_fixed_redeem\",\n module: \"earn.savings\",\n description:\n \"Redeem Simple Earn Fixed (定期赚币) order. [CAUTION] Redeems a fixed-term lending order. \" +\n \"Always redeems the full order amount. Only orders in 'pending' (匹配中) state can be redeemed — \" +\n \"orders in 'earning' state are locked until maturity and cannot be redeemed early. \" +\n \"Do NOT use for flexible earn redemption — use earn_savings_redeem instead.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n reqId: {\n type: \"string\",\n description: \"Request ID of the fixed-term order to redeem\",\n },\n },\n required: [\"reqId\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_fixed_redeem\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/simple-earn-fixed/redeem\",\n {\n reqId: requireString(args, \"reqId\"),\n },\n privateRateLimit(\"earn_fixed_redeem\", 2),\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 and fixed-term offers. \" +\n \"Use this tool when the user asks about Simple Earn products, current or historical lending rates, \" +\n \"or when displaying savings balance with market rate context (市场均利率). \" +\n \"Returns lending rate history (lendingRate field, newest-first) AND available fixed-term (定期) offers \" +\n \"with APR, term, min amount, and quota — one call gives a complete view of both flexible and fixed options. \" +\n \"In fixedOffers: lendQuota = remaining quota (剩余额度), soldOut = whether product is sold out (lendQuota is 0). \" +\n \"To get current flexible 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 7)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const ccy = readString(args, \"ccy\");\n const [rateResponse, fixedResponse] = await Promise.all([\n context.client.publicGet(\n \"/api/v5/finance/savings/lending-rate-history\",\n compactObject({\n ccy,\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 7,\n }),\n publicRateLimit(\"earn_get_lending_rate_history\", 6),\n ),\n context.client.privateGet(\n \"/api/v5/finance/simple-earn-fixed/offers\",\n compactObject({ ccy }),\n privateRateLimit(\"earn_get_lending_rate_history_fixed\", 2),\n ).catch(() => null),\n ]);\n\n const rateResult = normalizeResponse(rateResponse);\n // Remove redundant `rate` field — `lendingRate` is the canonical field\n const rateData = Array.isArray((rateResult as Record<string, unknown>)[\"data\"])\n ? ((rateResult as Record<string, unknown>)[\"data\"] as Array<Record<string, unknown>>).map(\n ({ rate: _, ...rest }) => rest,\n )\n : [];\n\n const fixedResult = fixedResponse ? normalizeResponse(fixedResponse) : { data: [] };\n const allOffers = ((fixedResult as Record<string, unknown>)[\"data\"] ?? []) as Array<Record<string, unknown>>;\n const fixedOffers = allOffers\n .map(({ borrowingOrderQuota: _, ...rest }) => ({\n ...rest,\n soldOut: rest[\"lendQuota\"] === \"0\",\n }));\n\n return {\n ...rateResult,\n data: rateData,\n fixedOffers,\n };\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 { 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.\",\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 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.\",\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 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]\",\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 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. Yields in response are decimal fractions, not percentages.\",\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. Yields in response are decimal fractions, not percentages.\",\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 rejects the order if quote yield falls below threshold. \" +\n \"Returns order result with quote snapshot (minAnnualizedYield is in percent; response yields are decimal fractions).\",\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 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 // API returns annualizedYield as decimal (e.g. 0.1748 = 17.48%), convert to percent for comparison\n if (minAnnualizedYield !== undefined) {\n const rawYield = parseFloat(quote[\"annualizedYield\"] as string);\n if (isNaN(rawYield)) {\n throw new OkxApiError(\n \"Quote returned non-numeric annualizedYield, cannot verify minimum yield threshold.\",\n {\n code: \"INVALID_YIELD_VALUE\",\n suggestion: \"Order not placed. The quote did not include a valid annualizedYield. Retry or pick a different product.\",\n },\n );\n }\n const actualYieldPct = rawYield * 100;\n if (actualYieldPct < minAnnualizedYield) {\n throw new OkxApiError(\n `Quote yield ${actualYieldPct.toFixed(2)}% is below the minimum threshold of ${minAnnualizedYield}%.`,\n {\n code: \"YIELD_BELOW_MIN\",\n suggestion: `Order not placed. Actual: ${actualYieldPct.toFixed(2)}%, 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, ToolArgs, ToolContext } from \"../types.js\";\nimport { ConfigError } from \"../../utils/errors.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\nconst EARN_DEMO_MESSAGE =\n \"Earn features (savings, DCD, on-chain staking, auto-earn) are not available in simulated trading mode.\";\nconst EARN_DEMO_SUGGESTION = \"Switch to a live account to use Earn features.\";\n\n/** Tools that bypass the blanket demo guard:\n * - isWrite=false tools are skipped by the guard condition\n * - dcd_redeem: isWrite=true but has CONDITIONAL demo check inside\n * (preview/no quoteId is read-only and allowed; execute mode has assertNotDemo)\n * - earn_fixed_purchase: isWrite=true but preview (confirm=false) is read-only;\n * execute path (confirm=true) has assertNotDemo inside the handler */\nconst DEMO_GUARD_SKIP = new Set([\"dcd_redeem\", \"earn_fixed_purchase\"]);\n\nfunction withDemoGuard(tool: ToolSpec): ToolSpec {\n if (!tool.isWrite || DEMO_GUARD_SKIP.has(tool.name)) return tool;\n const originalHandler = tool.handler;\n return {\n ...tool,\n handler: async (args: ToolArgs, context: ToolContext): Promise<unknown> => {\n if (context.config.demo) {\n throw new ConfigError(EARN_DEMO_MESSAGE, EARN_DEMO_SUGGESTION);\n }\n return originalHandler(args, context);\n },\n };\n}\n\nexport function registerAllEarnTools(): ToolSpec[] {\n const tools = [\n ...registerEarnTools(),\n ...registerOnchainEarnTools(),\n ...registerDcdTools(),\n ...registerAutoEarnTools(),\n ];\n return tools.map(withDemoGuard);\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\";\nimport { resolveQuoteCcySz } from \"./tgtccy-conversion.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. Before placing, use market_get_instruments to get ctVal (contract face value) — do NOT assume contract sizes. [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: \"Number of contracts. Each contract = ctVal units (e.g. 0.1 ETH for ETH-USDT-SWAP). Query market_get_instruments for exact ctVal. Set tgtCcy=quote_ccy to specify sz in USDT notional value; set tgtCcy=margin to specify sz as margin cost (notional = sz * leverage).\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n defaultType,\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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 const result = normalizeResponse(response);\n if (resolved.conversionNote) {\n result._conversion = resolved.conversionNote;\n }\n return result;\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\nconst TWO_DAYS_MS = 2 * 24 * 60 * 60 * 1000;\n\n/** Schema property shared by all market tools to opt-in to demo market data. */\nconst DEMO_PROPERTY = {\n demo: {\n type: \"boolean\" as const,\n description: \"Query simulated trading (demo) market data. Default: false (live market data).\",\n },\n};\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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. Automatically retrieves historical data (back to 2021) when requesting older time ranges. Use the `after` parameter to paginate back in time (the old `history` parameter has been removed). IMPORTANT: Before fetching with `after`/`before`, estimate the number of candles: time_range_ms / bar_interval_ms. If the estimate exceeds ~500 candles, inform the user of the estimated count and ask for confirmation before proceeding.\",\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 ...DEMO_PROPERTY,\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const afterTs = readString(args, \"after\");\n const beforeTs = readString(args, \"before\");\n const demo = readBoolean(args, \"demo\") ?? false;\n const query = compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: afterTs,\n before: beforeTs,\n limit: readNumber(args, \"limit\"),\n });\n const rateLimit = publicRateLimit(\"market_get_candles\", 40);\n\n const hasTimestamp = afterTs !== undefined || beforeTs !== undefined;\n // Only route to history based on `after`: `after=T` means \"data older than T\".\n // `before=T` means \"data newer than T\" (paginating forward), so it always needs\n // the recent endpoint — routing it to history would drop the latest 2 days.\n const useHistory = afterTs !== undefined && Number(afterTs) < Date.now() - TWO_DAYS_MS;\n\n const path = useHistory ? \"/api/v5/market/history-candles\" : \"/api/v5/market/candles\";\n const response = await context.client.publicGet(path, query, rateLimit, demo);\n\n // Defensive fallback: if the recent endpoint returns empty for a timestamped request,\n // the timestamp may straddle the 2-day boundary. Try history endpoint once.\n // Trade-off: truly empty ranges also trigger a second request, which is acceptable\n // since this case is rare and correctness matters more than avoiding one extra call.\n if (!useHistory && hasTimestamp && Array.isArray(response.data) && response.data.length === 0) {\n return normalizeResponse(await context.client.publicGet(\"/api/v5/market/history-candles\", query, rateLimit, demo));\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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 ...DEMO_PROPERTY,\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n const demo = readBoolean(args, \"demo\") ?? 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 demo,\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 demo,\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"market_get_stock_tokens\",\n module: \"market\",\n description:\n \"[Deprecated: use market_get_instruments_by_category with instCategory=\\\"3\\\" instead] Get all stock token instruments (instCategory=3). Stock tokens track real-world stock prices on OKX (e.g. AAPL-USDT-SWAP).\",\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 ...DEMO_PROPERTY,\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 readBoolean(args, \"demo\") ?? false,\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 name: \"market_get_instruments_by_category\",\n module: \"market\",\n description:\n \"Discover tradeable instruments by asset category. Stock tokens (instCategory=3, e.g. AAPL-USDT-SWAP, TSLA-USDT-SWAP), Metals (4, e.g. XAUUSDT-USDT-SWAP for gold), Commodities (5, e.g. OIL-USDT-SWAP for crude oil), Forex (6, e.g. EURUSDT-USDT-SWAP for EUR/USD), Bonds (7, e.g. US30Y-USDT-SWAP for crude oil). Use this to find instIds before querying prices or placing orders. Filters client-side by instCategory.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instCategory: {\n type: \"string\",\n enum: [\"3\", \"4\", \"5\", \"6\", \"7\"],\n description: \"Asset category: 3=Stock tokens, 4=Metals, 5=Commodities, 6=Forex, 7=Bonds\",\n },\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\",\n },\n ...DEMO_PROPERTY,\n },\n required: [\"instCategory\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instCategory = requireString(args, \"instCategory\");\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_instruments_by_category\", 20),\n readBoolean(args, \"demo\") ?? false,\n );\n const data = response.data;\n const filtered = Array.isArray(data)\n ? data.filter((item) => (item as Record<string, unknown>).instCategory === instCategory)\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\";\nimport { resolveQuoteCcySz } from \"./tgtccy-conversion.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\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n \"OPTION\",\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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\";\nimport { resolveQuoteCcySz } from \"./tgtccy-conversion.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. Before placing, use market_get_instruments to get ctVal (contract face value) — do NOT assume contract sizes. [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 by default. Set tgtCcy=quote_ccy to specify USDT notional value; set tgtCcy=margin to specify USDT margin cost (notional = sz * leverage).\",\n },\n tgtCcy: {\n type: \"string\",\n enum: [\"base_ccy\", \"quote_ccy\", \"margin\"],\n description: \"Size unit. base_ccy(default): sz in contracts; quote_ccy: sz in USDT notional value; margin: sz in USDT margin cost (actual position = sz * leverage)\",\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 resolved = await resolveQuoteCcySz(\n requireString(args, \"instId\"),\n requireString(args, \"sz\"),\n readString(args, \"tgtCcy\"),\n \"OPTION\",\n context.client,\n readString(args, \"tdMode\"),\n );\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: resolved.sz,\n tgtCcy: resolved.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(\"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 let path: string;\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 } else {\n path = \"/api/v5/trade/orders-pending\";\n }\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 { registerSkillsTools } from \"./skills.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 ...registerSkillsTools(),\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 live?: 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 */\n\nfunction resolveDemo(cli: CliOptions, toml: OkxProfile): boolean {\n if (cli.demo && cli.live) {\n throw new ConfigError(\n \"--demo and --live are mutually exclusive.\",\n \"Use --demo for simulated trading or --live to force live mode, not both.\",\n );\n }\n if (cli.live === true) return false;\n if (cli.demo === true) return true;\n return process.env.OKX_DEMO === \"1\" ||\n process.env.OKX_DEMO === \"true\" ||\n (toml.demo ?? false);\n}\n\nexport function loadConfig(cli: CliOptions): OkxConfig {\n const toml = readTomlProfile(cli.profile);\n const creds = loadCredentials(toml);\n\n const demo = resolveDemo(cli, toml);\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\nexport function 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\nexport async function fetchDistTags(packageName: string): Promise<Record<string, 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)}`, {\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 { \"dist-tags\"?: Record<string, string> };\n return data[\"dist-tags\"] ?? null;\n } catch {\n return null;\n }\n}\n\nexport async 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 { 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 { 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// ---------------------------------------------------------------------------\n// Environment context — injected once in main() after config load.\n// When null, all output functions behave as before (backward compat).\n// ---------------------------------------------------------------------------\n\nexport interface EnvContext {\n demo: boolean;\n profile: string;\n}\n\nlet envContext: EnvContext | null = null;\n\nexport function setEnvContext(ctx: EnvContext): void {\n envContext = ctx;\n}\n\nexport function resetEnvContext(): void {\n envContext = null;\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\n// ---------------------------------------------------------------------------\n// Opt-in JSON env wrapper — controlled by the --env CLI flag.\n// When disabled (default), printJson outputs raw data for backward compat.\n// When enabled, printJson wraps the data with {env, profile, data}.\n// ---------------------------------------------------------------------------\n\nlet jsonEnvEnabled = false;\n\nexport function setJsonEnvEnabled(enabled: boolean): void {\n jsonEnvEnabled = enabled;\n}\n\nexport function resetJsonEnvEnabled(): void {\n jsonEnvEnabled = false;\n}\n\nexport function printJson(data: unknown): void {\n const payload = jsonEnvEnabled && envContext\n ? {\n env: envContext.demo ? \"demo\" : \"live\",\n profile: envContext.profile,\n data,\n }\n : data;\n activeOutput.out(JSON.stringify(payload, null, 2) + EOL);\n}\n\nexport function printTable(rows: Record<string, unknown>[]): void {\n if (envContext) {\n const envLabel = envContext.demo ? \"demo (simulated trading)\" : \"live\";\n activeOutput.out(`Environment: ${envLabel}` + EOL + EOL);\n }\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 * Handle a single JSON-config client. Returns true if a failure was recorded.\n */\nfunction handleJsonClient(\n clientId: ClientId,\n report: Report,\n configuredClients: ClientId[],\n): boolean {\n const configPath = getConfigPath(clientId);\n if (!configPath) return false; // platform doesn't support this client\n\n const name = CLIENT_NAMES[clientId];\n const status = checkJsonMcpConfig(configPath);\n\n if (status === \"missing\") return false; // client not installed — skip silently\n\n if (status === \"found\") {\n ok(name, `configured (${sanitize(configPath)})`);\n report.add(`client_${clientId}`, `OK ${sanitize(configPath)}`);\n configuredClients.push(clientId);\n return false;\n }\n\n if (status === \"not-configured\") {\n fail(name, \"okx-trade-mcp not found in mcpServers\", [`Run: okx setup --client ${clientId}`]);\n report.add(`client_${clientId}`, \"NOT_CONFIGURED\");\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 }\n return true;\n}\n\n/**\n * Handle Claude Code client. Returns true if a hard failure was recorded.\n * \"not-configured\" is a warning only — Claude Code may be used for other purposes.\n */\nfunction handleClaudeCodeClient(report: Report, configuredClients: ClientId[]): boolean {\n const status = checkClaudeCodeConfig();\n if (status === \"missing\") return false;\n\n const name = CLIENT_NAMES[\"claude-code\"];\n\n if (status === \"found\") {\n ok(name, \"configured\");\n report.add(\"client_claude-code\", \"OK\");\n configuredClients.push(\"claude-code\");\n return false;\n }\n\n if (status === \"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 return false; // not a hard failure\n }\n\n fail(name, \"settings file has JSON parse error\", [\"Run: okx setup --client claude-code\"]);\n report.add(\"client_claude-code\", \"PARSE_ERROR\");\n return true;\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 const jsonClients: ClientId[] = [\"claude-desktop\", \"cursor\", \"windsurf\"];\n const configuredClients: ClientId[] = [];\n let anyFailed = false;\n\n for (const clientId of jsonClients) {\n if (handleJsonClient(clientId, report, configuredClients)) anyFailed = true;\n }\n\n // Claude Code — special handling (uses claude mcp add, config paths vary)\n if (handleClaudeCodeClient(report, configuredClients)) anyFailed = true;\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 { spawnSync } from \"node:child_process\";\nimport { readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { fetchLatestVersion, fetchDistTags, isNewerVersion } from \"@agent-tradekit/core\";\n\nconst PACKAGES = [\"@okx_ai/okx-trade-mcp\", \"@okx_ai/okx-trade-cli\"];\nconst CACHE_FILE = join(homedir(), \".okx\", \"last_check\");\nconst THROTTLE_MS = 12 * 60 * 60 * 1000; // 12 h\n\n// Resolve npm from the same bin directory as the active Node.js binary so we\n// never rely on the user's PATH for command resolution (avoids S4036).\nconst NPM_BIN = join(dirname(process.execPath), process.platform === \"win32\" ? \"npm.cmd\" : \"npm\");\n\nexport interface UpgradeOptions {\n beta?: boolean;\n check?: boolean;\n force?: boolean;\n}\n\nexport interface UpgradeResult {\n currentVersion: string;\n latestVersion: string;\n status: \"up-to-date\" | \"updated\" | \"update-available\" | \"error\";\n updated: boolean;\n}\n\nfunction readLastCheck(): number {\n try {\n return parseInt(readFileSync(CACHE_FILE, \"utf-8\").trim(), 10) || 0;\n } catch {\n return 0;\n }\n}\n\nfunction writeLastCheck(): void {\n try {\n mkdirSync(join(homedir(), \".okx\"), { recursive: true });\n writeFileSync(CACHE_FILE, String(Math.floor(Date.now() / 1000)), \"utf-8\");\n } catch {\n // ignore write failures\n }\n}\n\nfunction printResult(result: UpgradeResult, json: boolean): void {\n if (json) {\n process.stdout.write(JSON.stringify(result) + \"\\n\");\n } else {\n switch (result.status) {\n case \"up-to-date\":\n process.stderr.write(`[ok] Already up to date: ${result.currentVersion}\\n`);\n break;\n case \"update-available\":\n process.stderr.write(\n `[info] Update available: ${result.currentVersion} → ${result.latestVersion}\\n` +\n ` Run: okx upgrade\\n`,\n );\n break;\n case \"updated\":\n process.stderr.write(`[ok] Upgraded: ${result.currentVersion} → ${result.latestVersion}\\n`);\n break;\n case \"error\":\n process.stderr.write(`[error] Failed to fetch latest version from npm registry\\n`);\n break;\n }\n }\n}\n\nfunction isThrottled(options: UpgradeOptions): boolean {\n if (options.force || options.check) return false;\n return Date.now() - readLastCheck() * 1000 < THROTTLE_MS;\n}\n\nasync function resolveLatestVersion(beta: boolean): Promise<string | null> {\n if (beta) {\n const tags = await fetchDistTags(\"@okx_ai/okx-trade-cli\");\n return tags?.[\"next\"] ?? tags?.[\"latest\"] ?? null;\n }\n return fetchLatestVersion(\"@okx_ai/okx-trade-cli\");\n}\n\n// Use spawnSync with array args (no shell interpreter) to avoid S4721.\n// Bug #2 fix: when --json, suppress npm stdout to avoid polluting JSON output.\nfunction runNpmInstall(json: boolean): boolean {\n const result = spawnSync(NPM_BIN, [\"install\", \"-g\", ...PACKAGES], {\n stdio: json ? [\"inherit\", \"ignore\", process.stderr] : \"inherit\",\n shell: false,\n });\n return result.status === 0;\n}\n\nexport async function cmdUpgrade(\n currentVersion: string,\n options: UpgradeOptions,\n json: boolean,\n): Promise<void> {\n if (isThrottled(options)) {\n if (json) {\n process.stdout.write(\n JSON.stringify({ currentVersion, latestVersion: currentVersion, status: \"up-to-date\", updated: false }) + \"\\n\",\n );\n }\n return;\n }\n\n const latestVersion = await resolveLatestVersion(options.beta ?? false);\n\n if (!latestVersion) {\n printResult({ currentVersion, latestVersion: \"unknown\", status: \"error\", updated: false }, json);\n process.exitCode = 1;\n return;\n }\n\n // Strip prerelease suffix before comparing against stable latest (Bug #1 fix)\n const stableCurrentVersion = currentVersion.split(/[-+]/)[0] ?? currentVersion;\n const needsUpdate = options.force || isNewerVersion(stableCurrentVersion, latestVersion);\n\n if (!needsUpdate) {\n if (!options.check) writeLastCheck();\n printResult({ currentVersion, latestVersion, status: \"up-to-date\", updated: false }, json);\n return;\n }\n\n if (options.check) {\n printResult({ currentVersion, latestVersion, status: \"update-available\", updated: false }, json);\n return;\n }\n\n if (runNpmInstall(json)) {\n writeLastCheck();\n printResult({ currentVersion, latestVersion, status: \"updated\", updated: true }, json);\n } else {\n printResult({ currentVersion, latestVersion, status: \"error\", updated: false }, json);\n process.exitCode = 1;\n }\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 live?: 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,\n live: opts.live,\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, 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: \"[Deprecated: use instruments-by-category --instCategory 3] List all stock token instruments (instCategory=3, e.g. AAPL-USDT-SWAP)\",\n },\n \"instruments-by-category\": {\n usage: \"okx market instruments-by-category --instCategory <4|5|6|7> [--instType <SPOT|SWAP>] [--instId <id>]\",\n description: \"List instruments by asset category: 4=Metals (gold/silver), 5=Commodities (oil/gas), 6=Forex (EUR/USD), 7=Bonds\",\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, fixed-term, 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 and fixed-term offers (requires auth)\",\n },\n \"fixed-orders\": {\n usage: \"okx earn savings fixed-orders [--ccy <ccy>] [--state <pending|earning|expired|settled|cancelled>]\",\n description: \"List fixed-term earn orders\",\n },\n \"fixed-purchase\": {\n usage: \"okx earn savings fixed-purchase --ccy <ccy> --amt <n> --term <term> [--confirm]\",\n description: \"Purchase Simple Earn Fixed (定期). Preview by default; add --confirm to execute. Funds locked until maturity\",\n },\n \"fixed-redeem\": {\n usage: \"okx earn savings fixed-redeem <reqId>\",\n description: \"Redeem a fixed-term earn order (full amount)\",\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 | --live] [--output <file>]\",\n },\n\n skill: {\n description: \"OKX Skills Marketplace — search, install, and manage agent skills\",\n commands: {\n search: {\n usage: \"okx skill search [--keyword <kw>] [--categories <id>] [--page <n>] [--limit <n>]\",\n description: \"Search for skills in the marketplace\",\n },\n categories: {\n usage: \"okx skill categories\",\n description: \"List available skill categories\",\n },\n add: {\n usage: \"okx skill add <name>\",\n description: \"Download and install a skill to detected agents\",\n },\n download: {\n usage: \"okx skill download <name> [--dir <path>] [--format zip|skill]\",\n description: \"Download a skill package without installing\",\n },\n remove: {\n usage: \"okx skill remove <name>\",\n description: \"Remove an installed skill\",\n },\n check: {\n usage: \"okx skill check <name>\",\n description: \"Check if an installed skill has a newer version\",\n },\n list: {\n usage: \"okx skill list\",\n description: \"List all locally installed skills\",\n },\n },\n },\n\n upgrade: {\n description: \"Upgrade okx CLI and MCP server to the latest stable version\",\n usage: \"okx upgrade [--check] [--beta] [--force] [--json]\",\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 | --live] [--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 \" --live Force live trading mode (overrides profile demo=true; mutually exclusive with --demo)\",\n \" --json Output raw JSON\",\n \" --env With --json, wrap output as {env, profile, data}\",\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 pure-subgroup module body (e.g. bot). */\nfunction printSubgroupOnlyModule(lines: string[], moduleName: string, group: GroupInfo): void {\n const subgroupNames = Object.keys(group.subgroups!);\n const colWidth = Math.max(...subgroupNames.map((n) => n.length)) + 4;\n lines.push(`Usage: okx ${moduleName} <strategy> <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\");\n lines.push(\"Strategies:\");\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}\n\n/** Render mixed module body (direct commands + subgroups, e.g. spot, swap). */\nfunction printMixedModule(lines: string[], moduleName: string, group: GroupInfo): void {\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}\n\n/** Render commands-only module body (e.g. market, account). */\nfunction printCommandsOnlyModule(lines: string[], moduleName: string, group: GroupInfo): void {\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n}\n\n/** Render custom-usage module body (e.g. setup). */\nfunction printUsageModule(lines: string[], group: GroupInfo): void {\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/** 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 printSubgroupOnlyModule(lines, moduleName, group);\n } else if (hasSubgroups && hasCommands) {\n printMixedModule(lines, moduleName, group);\n } else if (hasCommands) {\n printCommandsOnlyModule(lines, moduleName, group);\n } else if (group.usage) {\n printUsageModule(lines, group);\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 env?: 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 instCategory?: string;\n quoteCcy?: string;\n archive?: boolean;\n valuation?: 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 reqId?: string;\n confirm?: boolean;\n // audit\n since?: string;\n tool?: string;\n // upgrade\n beta?: boolean;\n check?: boolean;\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 // market candle time range\n after?: string;\n before?: string;\n // skill marketplace\n keyword?: string;\n categories?: string;\n dir?: string;\n page?: string;\n format?: 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 env: { 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 after: { type: \"string\" },\n before: { 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 instCategory: { type: \"string\" },\n quoteCcy: { type: \"string\" },\n // account extras\n archive: { type: \"boolean\", default: false },\n valuation: { 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 reqId: { type: \"string\" },\n confirm: { type: \"boolean\", default: false },\n // audit\n since: { type: \"string\" },\n tool: { type: \"string\" },\n // upgrade\n beta: { type: \"boolean\", default: false },\n check: { type: \"boolean\", default: false },\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 // skill marketplace\n keyword: { type: \"string\" },\n categories: { type: \"string\" },\n dir: { type: \"string\" },\n page: { type: \"string\" },\n format: { 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, KNOWN_INDICATORS } 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; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_instruments\", { instType: opts.instType, instId: opts.instId, demo: opts.demo ?? false });\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; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_funding_rate\", { instId, history: opts.history, limit: opts.limit, demo: opts.demo ?? false });\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; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_mark_price\", { instType: opts.instType, instId: opts.instId, demo: opts.demo ?? false });\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; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_trades\", { instId, limit: opts.limit, demo: opts.demo ?? false });\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; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_ticker\", { instId: opts.instId, quoteCcy: opts.quoteCcy, demo: opts.demo ?? false });\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; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_candles\", { instId, bar: opts.bar, limit: opts.limit, history: opts.history, demo: opts.demo ?? false });\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 demo?: boolean,\n): Promise<void> {\n const result = await run(\"market_get_price_limit\", { instId, demo: demo ?? false });\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; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_open_interest\", { instType: opts.instType, instId: opts.instId, demo: opts.demo ?? false });\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 demo?: boolean,\n): Promise<void> {\n const result = await run(\"market_get_ticker\", { instId, demo: demo ?? false });\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 demo?: boolean,\n): Promise<void> {\n const result = await run(\"market_get_tickers\", { instType, demo: demo ?? false });\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 demo?: boolean,\n): Promise<void> {\n const result = await run(\"market_get_orderbook\", { instId, sz, demo: demo ?? false });\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; after?: string; before?: string; json: boolean; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_candles\", { instId, bar: opts.bar, limit: opts.limit, after: opts.after, before: opts.before, demo: opts.demo ?? false });\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 function cmdMarketIndicatorList(json: boolean): void {\n if (json) return printJson(KNOWN_INDICATORS);\n printTable(KNOWN_INDICATORS.map(({ name, description }) => ({ name, description })));\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 cmdMarketInstrumentsByCategory(\n run: ToolRunner,\n opts: { instCategory: string; instType?: string; instId?: string; json: boolean; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_instruments_by_category\", {\n instCategory: opts.instCategory,\n instType: opts.instType,\n instId: opts.instId,\n demo: opts.demo ?? false,\n });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n const CATEGORY_LABELS: Record<string, string> = {\n \"3\": \"Stock tokens\",\n \"4\": \"Metals\",\n \"5\": \"Commodities\",\n \"6\": \"Forex\",\n \"7\": \"Bonds\",\n };\n const label = CATEGORY_LABELS[opts.instCategory] ?? opts.instCategory;\n process.stdout.write(`instCategory=${opts.instCategory} (${label}) — ${items?.length ?? 0} instruments\\n\\n`);\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\nexport async function cmdMarketStockTokens(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; json: boolean; demo?: boolean },\n): Promise<void> {\n const result = await run(\"market_get_stock_tokens\", { instType: opts.instType, instId: opts.instId, demo: opts.demo ?? false });\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 const rows = 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 if (rows.length === 0 && data?.[0]) {\n printTable([{ currency: \"Total\", equity: data[0][\"totalEq\"] ?? \"0\", available: data[0][\"adjEq\"] ?? \"0\", frozen: \"-\" }]);\n return;\n }\n printTable(rows);\n}\n\nexport async function cmdAccountAssetBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n showValuation?: boolean,\n): Promise<void> {\n const result = await run(\"account_get_asset_balance\", {\n ccy,\n ...(showValuation ? { showValuation: true } : {}),\n }) as unknown as Record<string, unknown>;\n const data = (result.data ?? []) as Record<string, unknown>[];\n if (json) return printJson(showValuation ? { data, valuation: result.valuation } : data);\n const assetRows = 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 if (assetRows.length === 0 && data.length > 0) {\n outputLine(\"Total balance: 0\");\n } else {\n printTable(assetRows);\n }\n if (showValuation && result.valuation) {\n const valuationData = (result.valuation as Record<string, unknown>[]) ?? [];\n outputLine(\"\");\n outputLine(\"Asset Valuation by Account Type:\");\n printTable(\n valuationData.map((v) => {\n const details = (v[\"details\"] as Record<string, unknown>) ?? {};\n return {\n totalBal: v[\"totalBal\"],\n classic: details[\"classic\"],\n earn: details[\"earn\"],\n funding: details[\"funding\"],\n trading: details[\"trading\"],\n };\n }),\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, { 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 tgtCcy?: 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 tgtCcy: opts.tgtCcy,\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, OkxProfile, OkxTomlConfig } from \"@agent-tradekit/core\";\nimport { writeCliConfig } from \"../config/toml.js\";\nimport { output, errorOutput, outputLine, errorLine, printJson, printKv } from \"../formatter.js\";\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\n/** Tries to open a URL in the system browser; silently ignores failures. */\nfunction tryOpenUrl(url: string): void {\n try {\n let opener: string;\n if (process.platform === \"darwin\") {\n opener = \"open\";\n } else if (process.platform === \"win32\") {\n opener = \"start\";\n } else {\n opener = \"xdg-open\";\n }\n spawnSync(opener, [url], { stdio: \"ignore\", shell: process.platform === \"win32\" });\n } catch {\n // silently ignore\n }\n}\n\n/** Prompts for API credentials and returns them, or null if any field is empty. */\nasync function promptCredentials(\n rl: ReturnType<typeof createInterface>,\n t: (typeof messages)[Lang],\n): Promise<{ apiKey: string; secretKey: string; passphrase: string } | null> {\n const apiKey = (await prompt(rl, \"API Key: \")).trim();\n if (!apiKey) {\n errorLine(t.emptyApiKey);\n process.exitCode = 1;\n return null;\n }\n\n const secretKey = (await prompt(rl, \"Secret Key: \")).trim();\n if (!secretKey) {\n errorLine(t.emptySecretKey);\n process.exitCode = 1;\n return null;\n }\n\n const passphrase = (await prompt(rl, \"Passphrase: \")).trim();\n if (!passphrase) {\n errorLine(t.emptyPassphrase);\n process.exitCode = 1;\n return null;\n }\n\n return { apiKey, secretKey, passphrase };\n}\n\n/** Writes config to disk and outputs success messages, or prints manual fallback on error. */\nfunction saveConfig(config: OkxTomlConfig, profileName: string, t: (typeof messages)[Lang]): void {\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) errorOutput(t.permissionDenied(configPath));\n errorOutput(t.manualWrite(configPath));\n outputLine(tomlStringify(config as unknown as Record<string, unknown>));\n process.exitCode = 1;\n }\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 output(t.createApiKey(apiUrl));\n output(t.hint(demo ? t.hintDemo : t.hintLive));\n tryOpenUrl(apiUrl);\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 credentials = await promptCredentials(rl, t);\n if (!credentials) return;\n\n if (demo) outputLine(t.demoSelected);\n\n config.profiles[profileName] = buildProfileEntry(siteKey, credentials.apiKey, credentials.secretKey, credentials.passphrase, demo);\n\n // Auto-set as default_profile\n if (!config.default_profile || config.default_profile !== profileName) {\n config.default_profile = profileName;\n }\n\n saveConfig(config, profileName, t);\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 cmdEarnFixedOrderList(\n run: ToolRunner,\n opts: { ccy?: string; state?: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_get_fixed_order_list\", {\n ccy: opts.ccy, state: opts.state,\n }));\n printDataList(data, opts.json, \"No fixed earn orders\", (r) => ({\n reqId: r[\"reqId\"], ccy: r[\"ccy\"], amt: r[\"amt\"], rate: r[\"rate\"],\n term: r[\"term\"], state: r[\"state\"],\n accruedInterest: r[\"accruedInterest\"],\n cTime: new Date(Number(r[\"cTime\"])).toLocaleString(),\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\nfunction printFixedPurchasePreview(rec: Record<string, unknown>): void {\n const offer = rec[\"offer\"] as Record<string, unknown> | null;\n outputLine(\"\");\n outputLine(\"📋 Fixed Earn Purchase Preview\");\n outputLine(` Currency: ${rec[\"ccy\"]}`);\n outputLine(` Amount: ${rec[\"amt\"]}`);\n outputLine(` Term: ${rec[\"term\"]}`);\n if (rec[\"currentFlexibleRate\"]) {\n outputLine(` Current flexible rate: ${rec[\"currentFlexibleRate\"]}`);\n }\n if (offer) {\n printKv({\n rate: offer[\"rate\"],\n minLend: offer[\"minLend\"],\n remainingQuota: offer[\"lendQuota\"],\n soldOut: offer[\"soldOut\"] ? \"Yes\" : \"No\",\n });\n } else {\n outputLine(\" ⚠️ No matching offer found for this term.\");\n }\n outputLine(\"\");\n outputLine((rec[\"warning\"] as string) ?? \"\");\n outputLine(\"\");\n outputLine(\"Re-run with --confirm to execute.\");\n}\n\nexport async function cmdEarnFixedPurchase(\n run: ToolRunner,\n opts: { ccy: string; amt: string; term: string; confirm: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"earn_fixed_purchase\", {\n ccy: opts.ccy, amt: opts.amt, term: opts.term, confirm: opts.confirm,\n });\n if (!result || typeof result !== \"object\") {\n outputLine(\"No response data\");\n return;\n }\n const rec = result as unknown as Record<string, unknown>;\n\n if (rec[\"preview\"]) {\n if (opts.json) { printJson(rec); return; }\n printFixedPurchasePreview(rec);\n return;\n }\n\n // Execute mode — show result\n const data = extractData(result);\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { outputLine(\"No response data\"); return; }\n printKv({ reqId: r[\"reqId\"], ccy: r[\"ccy\"], amt: r[\"amt\"], term: r[\"term\"] });\n}\n\nexport async function cmdEarnFixedRedeem(\n run: ToolRunner,\n opts: { reqId: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_fixed_redeem\", { reqId: opts.reqId }));\n if (opts.json) { printJson(data); return; }\n if (!data.length) { outputLine(\"No response data\"); return; }\n printTable(data.map((r) => ({ reqId: r[\"reqId\"] })));\n}\n\nexport async function cmdEarnLendingRateHistory(\n run: ToolRunner,\n opts: { ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"earn_get_lending_rate_history\", { ccy: opts.ccy, limit: opts.limit });\n const data = extractData(result);\n const fixedOffers = extractFixedOffers(result);\n\n if (opts.json) { printJson({ data, fixedOffers }); return; }\n\n printDataList(data, false, \"No rate history data\", (r) => ({\n ccy: r[\"ccy\"], lendingRate: r[\"lendingRate\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n }));\n\n if (fixedOffers.length > 0) {\n outputLine(\"\");\n outputLine(\"Fixed-term offers:\");\n printTable(fixedOffers.map((r) => ({\n ccy: r[\"ccy\"], term: r[\"term\"], rate: r[\"rate\"],\n minLend: r[\"minLend\"],\n remainingQuota: r[\"lendQuota\"],\n soldOut: r[\"soldOut\"] ? \"Yes\" : \"No\",\n })));\n }\n}\n\nfunction extractFixedOffers(result: unknown): Record<string, unknown>[] {\n if (result && typeof result === \"object\") {\n const offers = (result as Record<string, unknown>)[\"fixedOffers\"];\n if (Array.isArray(offers)) return offers as Record<string, unknown>[];\n }\n return [];\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];\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 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 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\n// Note: minYield is in decimal (0.05 = 5%), matching the raw API format.\n// This differs from --minAnnualizedYield in quote-and-buy which is in percent (18 = 18%).\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\"] ? `${(parseFloat(q[\"termRate\"] as string) * 100).toFixed(2)}%` : \"—\",\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\"] ? `${(parseFloat(r[\"annualizedYield\"] as string) * 100).toFixed(2)}%` : \"—\",\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\"] ? `${(parseFloat(q[\"annualizedYield\"] as string) * 100).toFixed(2)}%` : \"—\",\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","import { tmpdir, homedir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\nimport { mkdirSync, rmSync, existsSync, copyFileSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n type ToolRunner,\n type OkxConfig,\n OkxRestClient,\n downloadSkillZip,\n extractSkillZip,\n readMetaJson,\n validateSkillMdExists,\n upsertSkillRecord,\n removeSkillRecord,\n readSkillRegistry,\n getSkillRecord,\n} from \"@agent-tradekit/core\";\nimport { outputLine, errorLine } from \"../formatter.js\";\n\n/**\n * Resolve the absolute path to `npx`.\n * Prefers the sibling of the current Node binary (most reliable, avoids PATH hijack).\n * Falls back to bare \"npx\" (OS PATH resolution) if the sibling doesn't exist.\n */\nfunction resolveNpx(): string {\n const sibling = join(dirname(process.execPath), \"npx\");\n if (existsSync(sibling)) return sibling;\n return \"npx\";\n}\n\n/** Notice shown after installing a third-party skill. */\nexport const THIRD_PARTY_INSTALL_NOTICE =\n \"Note: This skill was created by a third-party developer, not by OKX. Review SKILL.md before use.\";\n\n// ---------------------------------------------------------------------------\n// okx skill search <keyword>\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillSearch(\n run: ToolRunner,\n opts: { keyword?: string; categories?: string; page?: string; limit?: string; json: boolean },\n): Promise<void> {\n const args: Record<string, string> = {};\n if (opts.keyword) args.keyword = opts.keyword;\n if (opts.categories) args.categories = opts.categories;\n if (opts.page) args.page = opts.page;\n if (opts.limit) args.limit = opts.limit;\n\n const result = await run(\"skills_search\", args);\n const data = result.data as unknown[];\n const totalPage = (result as unknown as Record<string, unknown>).totalPage as string | undefined;\n\n if (opts.json) {\n outputLine(JSON.stringify(result, null, 2));\n return;\n }\n\n if (!Array.isArray(data) || data.length === 0) {\n outputLine(\"No skills found.\");\n return;\n }\n\n outputLine(\"\");\n outputLine(\" NAME VERSION DESCRIPTION\");\n for (const item of data as Array<{ name: string; latestVersion: string; description: string }>) {\n const name = (item.name ?? \"\").padEnd(20);\n const ver = (item.latestVersion ?? \"\").padEnd(10);\n const desc = (item.description ?? \"\").slice(0, 50);\n outputLine(` ${name}${ver}${desc}`);\n }\n outputLine(\"\");\n const page = opts.page ?? \"1\";\n const pageInfo = totalPage ? ` (page ${page}/${totalPage})` : \"\";\n outputLine(`${data.length} skills found${pageInfo}. Use \\`okx skill add <name>\\` to install.`);\n}\n\n// ---------------------------------------------------------------------------\n// okx skill categories\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillCategories(\n run: ToolRunner,\n json: boolean,\n): Promise<void> {\n const result = await run(\"skills_get_categories\", {});\n const data = result.data as unknown[];\n\n if (json) {\n outputLine(JSON.stringify(result, null, 2));\n return;\n }\n\n if (!Array.isArray(data) || data.length === 0) {\n outputLine(\"No categories found.\");\n return;\n }\n\n outputLine(\"\");\n outputLine(\" ID NAME\");\n for (const cat of data as Array<{ categoryId: string; name: string }>) {\n outputLine(` ${(cat.categoryId ?? \"\").padEnd(20)}${cat.name ?? \"\"}`);\n }\n outputLine(\"\");\n}\n\n// ---------------------------------------------------------------------------\n// okx skill add <name>\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillAdd(\n name: string,\n config: OkxConfig,\n json: boolean,\n): Promise<void> {\n const tmpBase = join(tmpdir(), `okx-skill-${randomUUID()}`);\n mkdirSync(tmpBase, { recursive: true });\n\n try {\n // Step 1: Download\n outputLine(`Downloading ${name}...`);\n const client = new OkxRestClient(config);\n const zipPath = await downloadSkillZip(client, name, tmpBase);\n\n // Step 2: Extract\n const contentDir = await extractSkillZip(zipPath, join(tmpBase, \"content\"));\n\n // Step 3: Validate\n const meta = readMetaJson(contentDir);\n validateSkillMdExists(contentDir);\n\n // Step 4: Install via npx skills add\n outputLine(\"Installing to detected agents...\");\n try {\n execFileSync(resolveNpx(), [\"skills\", \"add\", contentDir, \"-y\", \"-g\"], {\n stdio: \"inherit\",\n timeout: 60_000,\n });\n } catch (e) {\n // Copy zip to cwd so the user has a fallback after tmpBase is cleaned up\n const savedZip = join(process.cwd(), `${name}.zip`);\n try { copyFileSync(zipPath, savedZip); } catch { /* best-effort */ }\n errorLine(`npx skills add failed. The zip has been downloaded but not installed.`);\n errorLine(`You can manually install from: ${savedZip}`);\n throw e;\n }\n\n // Step 5: Update registry\n upsertSkillRecord(meta);\n\n printSkillInstallResult(meta, json);\n } finally {\n // Step 6: Cleanup\n rmSync(tmpBase, { recursive: true, force: true });\n }\n}\n\n// ---------------------------------------------------------------------------\n// okx skill download <name>\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillDownload(\n name: string,\n targetDir: string,\n config: OkxConfig,\n json: boolean,\n format: \"zip\" | \"skill\" = \"zip\",\n): Promise<void> {\n outputLine(`Downloading ${name}...`);\n const client = new OkxRestClient(config);\n const filePath = await downloadSkillZip(client, name, targetDir, format);\n\n if (json) {\n outputLine(JSON.stringify({ name, filePath }, null, 2));\n } else {\n outputLine(`✓ Downloaded ${name}.${format}`);\n outputLine(` Path: ${filePath}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// okx skill remove <name>\n// ---------------------------------------------------------------------------\n\nexport function cmdSkillRemove(name: string, json: boolean): void {\n const removed = removeSkillRecord(name);\n\n if (!removed) {\n errorLine(`Skill \"${name}\" is not installed.`);\n process.exitCode = 1;\n return;\n }\n\n // Remove from all agent directories via npx skills remove\n try {\n execFileSync(resolveNpx(), [\"skills\", \"remove\", name, \"-y\", \"-g\"], {\n stdio: \"inherit\",\n timeout: 60_000,\n });\n } catch {\n // Fallback: manually remove .agents/skills/<name>/\n const agentsPath = join(homedir(), \".agents\", \"skills\", name);\n try {\n rmSync(agentsPath, { recursive: true, force: true });\n } catch {\n // Ignore — cleanup is best-effort\n }\n }\n\n if (json) {\n outputLine(JSON.stringify({ name, status: \"removed\" }, null, 2));\n } else {\n outputLine(`✓ Skill \"${name}\" removed`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// okx skill check <name>\n// ---------------------------------------------------------------------------\n\nexport async function cmdSkillCheck(\n run: ToolRunner,\n name: string,\n json: boolean,\n): Promise<void> {\n const local = getSkillRecord(name);\n if (!local) {\n errorLine(`Skill \"${name}\" is not installed.`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(\"skills_search\", { keyword: name });\n const data = result.data as Array<{ name: string; latestVersion: string }>;\n const remote = data?.find((s) => s.name === name);\n\n if (!remote) {\n errorLine(`Skill \"${name}\" not found in marketplace.`);\n process.exitCode = 1;\n return;\n }\n\n const upToDate = local.version === remote.latestVersion;\n\n if (json) {\n outputLine(JSON.stringify({\n name,\n installedVersion: local.version,\n latestVersion: remote.latestVersion,\n upToDate,\n }, null, 2));\n } else if (upToDate) {\n outputLine(`${name}: installed v${local.version} → latest v${remote.latestVersion} (up to date)`);\n } else {\n outputLine(`${name}: installed v${local.version} → latest v${remote.latestVersion} (update available)`);\n outputLine(` Use \\`okx skill add ${name}\\` to update.`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// okx skill list\n// ---------------------------------------------------------------------------\n\nexport function cmdSkillList(json: boolean): void {\n const registry = readSkillRegistry();\n const skills = Object.values(registry.skills);\n\n if (json) {\n outputLine(JSON.stringify(registry, null, 2));\n return;\n }\n\n if (skills.length === 0) {\n outputLine(\"No skills installed.\");\n return;\n }\n\n outputLine(\"\");\n outputLine(\" NAME VERSION INSTALLED AT\");\n for (const s of skills) {\n const name = s.name.padEnd(20);\n const ver = s.version.padEnd(10);\n const date = s.installedAt.slice(0, 19).replace(\"T\", \" \");\n outputLine(` ${name}${ver}${date}`);\n }\n outputLine(\"\");\n outputLine(`${skills.length} skills installed.`);\n}\n\n// ---------------------------------------------------------------------------\n// Install result output (extracted for testability)\n// ---------------------------------------------------------------------------\n\n/** Format and output the install-success message. */\nexport function printSkillInstallResult(\n meta: { name: string; version: string },\n json: boolean,\n): void {\n if (json) {\n outputLine(JSON.stringify({ name: meta.name, version: meta.version, status: \"installed\" }, null, 2));\n } else {\n outputLine(`✓ Skill \"${meta.name}\" v${meta.version} installed`);\n outputLine(` ${THIRD_PARTY_INSTALL_NOTICE}`);\n }\n}\n"],"mappings":"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","names":["createRequire","mkdirSync","resolve","join","readFileSync","writeFileSync","existsSync","dirname","homedir","sep","endPtr","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","fs","path","os","resolve","elapsed","balanceResp","path","resolve","mkdirSync","join","existsSync","readFileSync","dirname","writeFileSync","messages","path","normalizeWrite","response","join","homedir","path","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","parse","os","fs","os","fs","sep","fs","sanitize","fs","path","os","createRequire","_require","createRequire","path","fs","os","sanitize","appData","resolve","maskKey","resolve","os","path","spawnSync","readFileSync","writeFileSync","mkdirSync","dirname","join","homedir","CACHE_FILE","join","homedir","dirname","readFileSync","mkdirSync","writeFileSync","spawnSync","EOL","fs","path","EOL","path","fs","path","os","getData","getData","getData","emitWriteResult","emitBatchResults","getData","emitWriteResult","emitBatchResults","getData","emitWriteResult","emitBatchResults","spawnSync","resolve","emitWriteResult","getData","homedir","join","dirname","mkdirSync","existsSync","copyFileSync","execFileSync","randomUUID","join","dirname","existsSync","randomUUID","mkdirSync","execFileSync","copyFileSync","homedir","_require","createRequire","CLI_VERSION","GIT_HASH","CLI_VERSION","GIT_HASH"]}