@okx_ai/okx-trade-cli 1.3.1-beta.14 → 1.3.1-beta.15
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 +109 -94
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +1 -1
package/dist/index.js
CHANGED
|
@@ -42,7 +42,7 @@ import { readFileSync as readFileSync4, writeFileSync as writeFileSync4, mkdirSy
|
|
|
42
42
|
import { join as join7, dirname as dirname4 } from "path";
|
|
43
43
|
import { homedir as homedir5 } from "os";
|
|
44
44
|
|
|
45
|
-
// ../../node_modules/smol-toml/dist/error.js
|
|
45
|
+
// ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js
|
|
46
46
|
function getLineColFromPtr(string, ptr) {
|
|
47
47
|
let lines = string.slice(0, ptr).split(/\r\n|\n|\r/g);
|
|
48
48
|
return [lines.length, lines.pop().length + 1];
|
|
@@ -82,7 +82,7 @@ ${codeblock}`, options);
|
|
|
82
82
|
}
|
|
83
83
|
};
|
|
84
84
|
|
|
85
|
-
// ../../node_modules/smol-toml/dist/util.js
|
|
85
|
+
// ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js
|
|
86
86
|
function isEscaped(str, ptr) {
|
|
87
87
|
let i = 0;
|
|
88
88
|
while (str[ptr - ++i] === "\\")
|
|
@@ -113,14 +113,9 @@ function skipComment(str, ptr) {
|
|
|
113
113
|
}
|
|
114
114
|
function skipVoid(str, ptr, banNewLines, banComments) {
|
|
115
115
|
let c;
|
|
116
|
-
while (1)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (banComments || c !== "#")
|
|
120
|
-
break;
|
|
121
|
-
ptr = skipComment(str, ptr);
|
|
122
|
-
}
|
|
123
|
-
return ptr;
|
|
116
|
+
while ((c = str[ptr]) === " " || c === " " || !banNewLines && (c === "\n" || c === "\r" && str[ptr + 1] === "\n"))
|
|
117
|
+
ptr++;
|
|
118
|
+
return banComments || c !== "#" ? ptr : skipVoid(str, skipComment(str, ptr), banNewLines);
|
|
124
119
|
}
|
|
125
120
|
function skipUntil(str, ptr, sep2, end, banNewLines = false) {
|
|
126
121
|
if (!end) {
|
|
@@ -161,7 +156,7 @@ function getStringEnd(str, seek) {
|
|
|
161
156
|
return seek;
|
|
162
157
|
}
|
|
163
158
|
|
|
164
|
-
// ../../node_modules/smol-toml/dist/date.js
|
|
159
|
+
// ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js
|
|
165
160
|
var DATE_TIME_RE = /^(\d{4}-\d{2}-\d{2})?[T ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|[-+]\d{2}:\d{2})?$/i;
|
|
166
161
|
var TomlDate = class _TomlDate extends Date {
|
|
167
162
|
#hasDate = false;
|
|
@@ -253,7 +248,7 @@ var TomlDate = class _TomlDate extends Date {
|
|
|
253
248
|
}
|
|
254
249
|
};
|
|
255
250
|
|
|
256
|
-
// ../../node_modules/smol-toml/dist/primitive.js
|
|
251
|
+
// ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js
|
|
257
252
|
var INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\d(_?\d)*))$/;
|
|
258
253
|
var FLOAT_REGEX = /^[+-]?\d(_?\d)*(\.\d(_?\d)*)?([eE][+-]?\d(_?\d)*)?$/;
|
|
259
254
|
var LEADING_ZERO = /^[+-]?0[0-9_]/;
|
|
@@ -392,7 +387,7 @@ function parseValue(value, toml, ptr, integersAsBigInt) {
|
|
|
392
387
|
return date;
|
|
393
388
|
}
|
|
394
389
|
|
|
395
|
-
// ../../node_modules/smol-toml/dist/extract.js
|
|
390
|
+
// ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js
|
|
396
391
|
function sliceAndTrimEndOf(str, startPtr, endPtr) {
|
|
397
392
|
let value = str.slice(startPtr, endPtr);
|
|
398
393
|
let commentIdx = value.indexOf("#");
|
|
@@ -459,7 +454,7 @@ function extractValue(str, ptr, end, depth, integersAsBigInt) {
|
|
|
459
454
|
];
|
|
460
455
|
}
|
|
461
456
|
|
|
462
|
-
// ../../node_modules/smol-toml/dist/struct.js
|
|
457
|
+
// ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js
|
|
463
458
|
var KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \t]*$/;
|
|
464
459
|
function parseKey(str, ptr, end = "=") {
|
|
465
460
|
let dot = ptr - 1;
|
|
@@ -607,7 +602,7 @@ function parseArray(str, ptr, depth, integersAsBigInt) {
|
|
|
607
602
|
return [res, ptr];
|
|
608
603
|
}
|
|
609
604
|
|
|
610
|
-
// ../../node_modules/smol-toml/dist/parse.js
|
|
605
|
+
// ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js
|
|
611
606
|
function peekTable(key, table, meta, type) {
|
|
612
607
|
let t = table;
|
|
613
608
|
let m = meta;
|
|
@@ -732,7 +727,7 @@ function parse(toml, { maxDepth = 1e3, integersAsBigInt } = {}) {
|
|
|
732
727
|
return res;
|
|
733
728
|
}
|
|
734
729
|
|
|
735
|
-
// ../../node_modules/smol-toml/dist/stringify.js
|
|
730
|
+
// ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js
|
|
736
731
|
var BARE_KEY = /^[a-z0-9-_]+$/i;
|
|
737
732
|
function extendedTypeOf(obj) {
|
|
738
733
|
let type = typeof obj;
|
|
@@ -921,7 +916,7 @@ function getDohBinaryPath() {
|
|
|
921
916
|
return process.env.OKX_DOH_BINARY_PATH;
|
|
922
917
|
}
|
|
923
918
|
const ext = process.platform === "win32" ? ".exe" : "";
|
|
924
|
-
return join(DOH_BIN_DIR, `okx-
|
|
919
|
+
return join(DOH_BIN_DIR, `okx-pilot${ext}`);
|
|
925
920
|
}
|
|
926
921
|
function execDohBinary(domain, exclude = [], userAgent) {
|
|
927
922
|
if (!ALLOWED_DOMAIN_RE.test(domain)) {
|
|
@@ -992,7 +987,7 @@ function classifyAndCache(node, hostname, failedNodes, cachePath) {
|
|
|
992
987
|
if (!node) {
|
|
993
988
|
return { mode: null, node: null };
|
|
994
989
|
}
|
|
995
|
-
if (node.ip === hostname
|
|
990
|
+
if (node.ip === hostname && node.host === hostname) {
|
|
996
991
|
writeCache(hostname, {
|
|
997
992
|
mode: "direct",
|
|
998
993
|
node: null,
|
|
@@ -1450,10 +1445,10 @@ var OKX_CODE_BEHAVIORS = {
|
|
|
1450
1445
|
"50011": { retry: true, suggestion: "Rate limited. Back off and retry after a delay." },
|
|
1451
1446
|
"50061": { retry: true, suggestion: "Too many connections. Reduce request frequency and retry." },
|
|
1452
1447
|
// Server temporarily unavailable → retryable
|
|
1453
|
-
"50001": { retry: true, suggestion: "
|
|
1454
|
-
"50004": { retry: true, suggestion: "Endpoint
|
|
1448
|
+
"50001": { retry: true, suggestion: "Service temporarily unavailable. Retry in a few minutes." },
|
|
1449
|
+
"50004": { retry: true, suggestion: "Endpoint request timeout. Retry later." },
|
|
1455
1450
|
"50013": { retry: true, suggestion: "System busy. Retry after 1-2 seconds." },
|
|
1456
|
-
"50026": { retry: true, suggestion: "
|
|
1451
|
+
"50026": { retry: true, suggestion: "System error. Retry in a few minutes." },
|
|
1457
1452
|
// Region / compliance restriction → do not retry
|
|
1458
1453
|
"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." },
|
|
1459
1454
|
"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." },
|
|
@@ -5374,7 +5369,7 @@ function registerOnchainEarnTools() {
|
|
|
5374
5369
|
];
|
|
5375
5370
|
}
|
|
5376
5371
|
var DCD_CODE_BEHAVIORS = {
|
|
5377
|
-
"50001": { retry: true, suggestion: "
|
|
5372
|
+
"50001": { retry: true, suggestion: "Service temporarily unavailable. Retry in a few minutes." },
|
|
5378
5373
|
"50002": { retry: false, suggestion: "Invalid JSON in request body. This is likely a bug \u2014 check request parameters." },
|
|
5379
5374
|
"50014": { retry: false, suggestion: "Missing required parameter. Check that all required fields are provided." },
|
|
5380
5375
|
"50016": { retry: false, suggestion: "notionalCcy does not match productId option type. Use baseCcy for CALL, quoteCcy for PUT." },
|
|
@@ -7819,7 +7814,7 @@ function registerMarketFilterTools() {
|
|
|
7819
7814
|
sortBy: {
|
|
7820
7815
|
type: "string",
|
|
7821
7816
|
enum: ["last", "chg24hPct", "marketCapUsd", "volUsd24h", "fundingRate", "oiUsd", "listTime"],
|
|
7822
|
-
description: "Sort field. Default: volUsd24h. Note: marketCapUsd is only meaningful for SPOT (null for SWAP/FUTURES)."
|
|
7817
|
+
description: "Sort field. Default: volUsd24h. Note: marketCapUsd is only meaningful for SPOT (null for SWAP/FUTURES). To rank by OI *change* (oiDeltaPct / absOiDeltaPct), use market_filter_oi_change \u2014 market_filter only sorts by the current snapshot."
|
|
7823
7818
|
},
|
|
7824
7819
|
sortOrder: {
|
|
7825
7820
|
type: "string",
|
|
@@ -7932,7 +7927,7 @@ function registerMarketFilterTools() {
|
|
|
7932
7927
|
bar: {
|
|
7933
7928
|
type: "string",
|
|
7934
7929
|
enum: [...OI_BARS],
|
|
7935
|
-
description: "Bar window for OI change computation: 5m, 15m, 1H, 4H, 1D. Default: 1H"
|
|
7930
|
+
description: "Bar window for OI change computation: 5m, 15m, 1H, 4H, 1D (case-insensitive on server, but send canonical form here). Default: 1H"
|
|
7936
7931
|
},
|
|
7937
7932
|
// Filters
|
|
7938
7933
|
minOiUsd: {
|
|
@@ -7950,8 +7945,8 @@ function registerMarketFilterTools() {
|
|
|
7950
7945
|
// Sort / pagination
|
|
7951
7946
|
sortBy: {
|
|
7952
7947
|
type: "string",
|
|
7953
|
-
enum: ["oiUsd", "oiDeltaUsd", "oiDeltaPct", "volUsd24h", "last"],
|
|
7954
|
-
description: "Sort field. Default: oiDeltaPct (largest movers first)"
|
|
7948
|
+
enum: ["oiUsd", "oiDeltaUsd", "oiDeltaPct", "absOiDeltaPct", "volUsd24h", "fundingRate", "last"],
|
|
7949
|
+
description: "Sort field. Default: oiDeltaPct (largest movers first, signed \u2014 longs and shorts separate). Use absOiDeltaPct to sort by |oiDeltaPct| (largest-magnitude moves regardless of direction). fundingRate is also supported for SWAP. Do NOT use the market_filter tool's sort fields (chg24hPct, marketCapUsd, listTime) here \u2014 they are not in the OI-change Row."
|
|
7955
7950
|
},
|
|
7956
7951
|
sortOrder: {
|
|
7957
7952
|
type: "string",
|
|
@@ -7992,38 +7987,40 @@ var NEWS_DETAIL = "/api/v5/orbit/news-detail";
|
|
|
7992
7987
|
var NEWS_DOMAINS = "/api/v5/orbit/news-platform";
|
|
7993
7988
|
var SENTIMENT_QUERY = "/api/v5/orbit/currency-sentiment-query";
|
|
7994
7989
|
var SENTIMENT_RANKING = "/api/v5/orbit/currency-sentiment-ranking";
|
|
7995
|
-
var NEWS_LANGUAGE = ["
|
|
7990
|
+
var NEWS_LANGUAGE = ["en-US", "zh-CN"];
|
|
7996
7991
|
function langHeader(lang) {
|
|
7997
|
-
|
|
7998
|
-
return { "Accept-Language":
|
|
7992
|
+
if (lang === "zh-CN" || lang === "zh_CN") return { "Accept-Language": "zh-CN" };
|
|
7993
|
+
return { "Accept-Language": "en-US" };
|
|
7999
7994
|
}
|
|
8000
7995
|
var NEWS_DETAIL_LVL = ["brief", "summary", "full"];
|
|
8001
|
-
var NEWS_IMPORTANCE = ["high", "
|
|
7996
|
+
var NEWS_IMPORTANCE = ["high", "low"];
|
|
8002
7997
|
var NEWS_SENTIMENT = ["bullish", "bearish", "neutral"];
|
|
8003
7998
|
var NEWS_SORT = ["latest", "relevant"];
|
|
8004
7999
|
var SENTIMENT_PERIOD = ["1h", "4h", "24h"];
|
|
8005
8000
|
var D_COINS_NEWS = 'Comma-separated uppercase ticker symbols (e.g. "BTC,ETH"). Normalize names/aliases to standard tickers.';
|
|
8006
8001
|
var D_COINS_SENTIMENT = 'Comma-separated uppercase ticker symbols, max 20 (e.g. "BTC,ETH"). Normalize names/aliases to standard tickers.';
|
|
8007
|
-
var D_LANGUAGE = "Content language:
|
|
8008
|
-
var D_BEGIN = "Start time, Unix epoch milliseconds.
|
|
8002
|
+
var D_LANGUAGE = "Content language: zh-CN or en-US. Infer from user's message. No server default.";
|
|
8003
|
+
var D_BEGIN = "Start time, Unix epoch milliseconds. API defaults to 72 hours ago when omitted. Pass explicitly for older topics (e.g. 'last 30 days'). Max range: 180 days. Parse relative time if given.";
|
|
8009
8004
|
var D_END = "End time, Unix epoch milliseconds. Parse relative time if given. Omit for no upper bound.";
|
|
8010
|
-
var D_IMPORTANCE = "Importance filter: high
|
|
8005
|
+
var D_IMPORTANCE = "Importance filter: 'low' returns all news (both low and high importance); 'high' narrows to major/breaking news only. Omitted \u2192 server default (high-only). Default to 'low' for broad browsing; pass 'high' only when the user explicitly asks for major news.";
|
|
8006
|
+
var D_PLATFORM = "Filter by news source. Use values from news_get_domains (e.g. blockbeats, odaily_flash). Omit for all sources.";
|
|
8011
8007
|
var D_LIMIT = "Number of results (default 10, max 50).";
|
|
8012
8008
|
function registerNewsTools() {
|
|
8013
|
-
|
|
8009
|
+
const tools = [
|
|
8014
8010
|
// -----------------------------------------------------------------------
|
|
8015
8011
|
// News browsing tools
|
|
8016
8012
|
// -----------------------------------------------------------------------
|
|
8017
8013
|
{
|
|
8018
8014
|
name: "news_get_latest",
|
|
8019
8015
|
module: "news",
|
|
8020
|
-
description: "Get crypto news sorted by time.
|
|
8016
|
+
description: "Get crypto news sorted by time. For broad browsing ('what happened recently', 'latest news', 'any big news today'), pass importance='low' to include both high and low importance. Server default (when importance omitted) returns only high-importance news. For coin-specific news, use news_get_by_coin instead.",
|
|
8021
8017
|
isWrite: false,
|
|
8022
8018
|
inputSchema: {
|
|
8023
8019
|
type: "object",
|
|
8024
8020
|
properties: {
|
|
8025
8021
|
coins: { type: "string", description: D_COINS_NEWS + " Optional." },
|
|
8026
8022
|
importance: { type: "string", enum: [...NEWS_IMPORTANCE], description: D_IMPORTANCE },
|
|
8023
|
+
platform: { type: "string", description: D_PLATFORM },
|
|
8027
8024
|
begin: { type: "number", description: D_BEGIN },
|
|
8028
8025
|
end: { type: "number", description: D_END },
|
|
8029
8026
|
language: { type: "string", enum: [...NEWS_LANGUAGE], description: D_LANGUAGE },
|
|
@@ -8044,6 +8041,7 @@ function registerNewsTools() {
|
|
|
8044
8041
|
compactObject({
|
|
8045
8042
|
sortBy: "latest",
|
|
8046
8043
|
importance: readString(args, "importance"),
|
|
8044
|
+
platform: readString(args, "platform"),
|
|
8047
8045
|
ccyList: readString(args, "coins"),
|
|
8048
8046
|
begin: readNumber(args, "begin"),
|
|
8049
8047
|
end: readNumber(args, "end"),
|
|
@@ -8067,6 +8065,7 @@ function registerNewsTools() {
|
|
|
8067
8065
|
properties: {
|
|
8068
8066
|
coins: { type: "string", description: D_COINS_NEWS + " Required." },
|
|
8069
8067
|
importance: { type: "string", enum: [...NEWS_IMPORTANCE], description: D_IMPORTANCE },
|
|
8068
|
+
platform: { type: "string", description: D_PLATFORM },
|
|
8070
8069
|
begin: { type: "number", description: D_BEGIN },
|
|
8071
8070
|
end: { type: "number", description: D_END },
|
|
8072
8071
|
language: { type: "string", enum: [...NEWS_LANGUAGE], description: D_LANGUAGE },
|
|
@@ -8087,6 +8086,7 @@ function registerNewsTools() {
|
|
|
8087
8086
|
sortBy: "latest",
|
|
8088
8087
|
ccyList: coins,
|
|
8089
8088
|
importance: readString(args, "importance"),
|
|
8089
|
+
platform: readString(args, "platform"),
|
|
8090
8090
|
begin: readNumber(args, "begin"),
|
|
8091
8091
|
end: readNumber(args, "end"),
|
|
8092
8092
|
detailLvl: readString(args, "detailLvl"),
|
|
@@ -8112,6 +8112,7 @@ function registerNewsTools() {
|
|
|
8112
8112
|
},
|
|
8113
8113
|
coins: { type: "string", description: D_COINS_NEWS + " Optional." },
|
|
8114
8114
|
importance: { type: "string", enum: [...NEWS_IMPORTANCE], description: D_IMPORTANCE },
|
|
8115
|
+
platform: { type: "string", description: D_PLATFORM },
|
|
8115
8116
|
sentiment: {
|
|
8116
8117
|
type: "string",
|
|
8117
8118
|
enum: [...NEWS_SENTIMENT],
|
|
@@ -8139,6 +8140,7 @@ function registerNewsTools() {
|
|
|
8139
8140
|
keyword: readString(args, "keyword") || void 0,
|
|
8140
8141
|
sortBy: readString(args, "sortBy") ?? "relevant",
|
|
8141
8142
|
importance: readString(args, "importance"),
|
|
8143
|
+
platform: readString(args, "platform"),
|
|
8142
8144
|
ccyList: readString(args, "coins"),
|
|
8143
8145
|
sentiment: readString(args, "sentiment"),
|
|
8144
8146
|
begin: readNumber(args, "begin"),
|
|
@@ -8284,6 +8286,24 @@ function registerNewsTools() {
|
|
|
8284
8286
|
}
|
|
8285
8287
|
}
|
|
8286
8288
|
];
|
|
8289
|
+
const domainsIdx = tools.findIndex((t) => t.name === "news_get_domains");
|
|
8290
|
+
if (domainsIdx === -1) throw new Error("news_get_domains not found in tools list");
|
|
8291
|
+
const [domainsTool] = tools.splice(domainsIdx, 1);
|
|
8292
|
+
return [...tools.map(withNewsDemoGuard), domainsTool];
|
|
8293
|
+
}
|
|
8294
|
+
var NEWS_DEMO_MESSAGE = "News features are not available in demo/simulated trading mode.";
|
|
8295
|
+
var NEWS_DEMO_SUGGESTION = "Switch to a live profile to use News features.";
|
|
8296
|
+
function withNewsDemoGuard(tool) {
|
|
8297
|
+
const originalHandler = tool.handler;
|
|
8298
|
+
return {
|
|
8299
|
+
...tool,
|
|
8300
|
+
handler: async (args, context) => {
|
|
8301
|
+
if (context.config.demo) {
|
|
8302
|
+
throw new ConfigError(NEWS_DEMO_MESSAGE, NEWS_DEMO_SUGGESTION);
|
|
8303
|
+
}
|
|
8304
|
+
return originalHandler(args, context);
|
|
8305
|
+
}
|
|
8306
|
+
};
|
|
8287
8307
|
}
|
|
8288
8308
|
function registerOptionAlgoTools() {
|
|
8289
8309
|
return [
|
|
@@ -10261,13 +10281,12 @@ function getPlatformDir() {
|
|
|
10261
10281
|
"darwin-arm64": "darwin-arm64",
|
|
10262
10282
|
"darwin-x64": "darwin-x64",
|
|
10263
10283
|
"linux-x64": "linux-x64",
|
|
10264
|
-
"linux-arm64": "linux-x64",
|
|
10265
10284
|
"win32-x64": "win32-x64"
|
|
10266
10285
|
};
|
|
10267
10286
|
return map[`${p}-${a}`] ?? null;
|
|
10268
10287
|
}
|
|
10269
10288
|
function getBinaryName() {
|
|
10270
|
-
return platform() === "win32" ? "okx-
|
|
10289
|
+
return platform() === "win32" ? "okx-pilot.exe" : "okx-pilot";
|
|
10271
10290
|
}
|
|
10272
10291
|
function hashFile(filePath) {
|
|
10273
10292
|
const buf = readFileSync7(filePath);
|
|
@@ -10906,34 +10925,12 @@ function runOkxAuthCapture(args) {
|
|
|
10906
10925
|
});
|
|
10907
10926
|
}
|
|
10908
10927
|
async function cmdAuthLogin(args) {
|
|
10909
|
-
let site = args.site?.trim();
|
|
10910
|
-
if (!site) site = process.env.OKX_SITE?.trim();
|
|
10911
|
-
if (!site) {
|
|
10912
|
-
try {
|
|
10913
|
-
const cfg = readFullConfig();
|
|
10914
|
-
const profileName = cfg.default_profile ?? "default";
|
|
10915
|
-
site = cfg.profiles?.[profileName]?.site?.trim();
|
|
10916
|
-
} catch {
|
|
10917
|
-
}
|
|
10918
|
-
}
|
|
10919
10928
|
const cliArgs = ["login"];
|
|
10920
|
-
if (site) cliArgs.push("--site", site);
|
|
10929
|
+
if (args.site) cliArgs.push("--site", args.site);
|
|
10921
10930
|
if (args.manual) cliArgs.push("--manual");
|
|
10922
10931
|
const code = await runOkxAuth(cliArgs);
|
|
10923
10932
|
if (code !== 0) {
|
|
10924
10933
|
process.exitCode = code;
|
|
10925
|
-
return;
|
|
10926
|
-
}
|
|
10927
|
-
const explicit = args.site?.trim();
|
|
10928
|
-
if (explicit) {
|
|
10929
|
-
try {
|
|
10930
|
-
const cfg = readFullConfig();
|
|
10931
|
-
const profileName = cfg.default_profile ?? "default";
|
|
10932
|
-
const profiles = { ...cfg.profiles ?? {} };
|
|
10933
|
-
profiles[profileName] = { ...profiles[profileName] ?? {}, site: explicit };
|
|
10934
|
-
writeFullConfig({ ...cfg, default_profile: profileName, profiles });
|
|
10935
|
-
} catch {
|
|
10936
|
-
}
|
|
10937
10934
|
}
|
|
10938
10935
|
}
|
|
10939
10936
|
async function cmdAuthLogout() {
|
|
@@ -11685,7 +11682,7 @@ async function cmdDiagnoseMcp(options = {}) {
|
|
|
11685
11682
|
|
|
11686
11683
|
// src/commands/diagnose.ts
|
|
11687
11684
|
var CLI_VERSION = readCliVersion();
|
|
11688
|
-
var GIT_HASH = true ? "
|
|
11685
|
+
var GIT_HASH = true ? "2075d12" : "dev";
|
|
11689
11686
|
function maskKey2(key) {
|
|
11690
11687
|
if (!key) return "(not set)";
|
|
11691
11688
|
if (key.length <= 8) return "****";
|
|
@@ -12224,17 +12221,17 @@ var CLI_REGISTRY = {
|
|
|
12224
12221
|
},
|
|
12225
12222
|
filter: {
|
|
12226
12223
|
toolName: "market_filter",
|
|
12227
|
-
usage: "okx market filter --instType <SPOT|SWAP|FUTURES> [--sortBy <
|
|
12228
|
-
description: "Screen / rank instruments by multi-dimensional criteria (price, volume, OI, funding rate, market cap, etc.)"
|
|
12224
|
+
usage: "okx market filter --instType <SPOT|SWAP|FUTURES> [--sortBy <last|chg24hPct|marketCapUsd|volUsd24h|fundingRate|oiUsd|listTime>] [--sortOrder <asc|desc>] [--limit <1-100>] [--baseCcy <ccy>] [--quoteCcy <ccy>] [--settleCcy <ccy>] [--instFamily <fam>] [--ctType <linear|inverse>] [--minLast <n>] [--maxLast <n>] [--minChg24hPct <n>] [--maxChg24hPct <n>] [--minMarketCapUsd <n>] [--maxMarketCapUsd <n>] [--minVolUsd24h <n>] [--maxVolUsd24h <n>] [--minFundingRate <n>] [--maxFundingRate <n>] [--minOiUsd <n>] [--maxOiUsd <n>]",
|
|
12225
|
+
description: "Screen / rank instruments by multi-dimensional criteria (price, volume, OI, funding rate, market cap, etc.). For OI *change* ranking use `market oi-change`."
|
|
12229
12226
|
},
|
|
12230
12227
|
"oi-history": {
|
|
12231
12228
|
toolName: "market_get_oi_history",
|
|
12232
|
-
usage: "okx market oi-history <instId> [--bar <5m|15m|1H|4H|1D>] [--limit <
|
|
12229
|
+
usage: "okx market oi-history <instId> [--bar <5m|15m|1H|4H|1D>] [--limit <1-500>] [--ts <ms>]",
|
|
12233
12230
|
description: "Open interest history time series with bar-over-bar delta for a single instrument"
|
|
12234
12231
|
},
|
|
12235
12232
|
"oi-change": {
|
|
12236
12233
|
toolName: "market_filter_oi_change",
|
|
12237
|
-
usage: "okx market oi-change --instType <SWAP|FUTURES> [--bar <5m|15m|1H|4H|1D>] [--sortBy <
|
|
12234
|
+
usage: "okx market oi-change --instType <SWAP|FUTURES> [--bar <5m|15m|1H|4H|1D>] [--sortBy <oiUsd|oiDeltaUsd|oiDeltaPct|absOiDeltaPct|volUsd24h|fundingRate|last>] [--sortOrder <asc|desc>] [--limit <1-100>] [--minOiUsd <n>] [--minVolUsd24h <n>] [--minAbsOiDeltaPct <n>]",
|
|
12238
12235
|
description: "Find instruments with largest OI changes over a bar window (accumulation/distribution scanner)"
|
|
12239
12236
|
}
|
|
12240
12237
|
},
|
|
@@ -12247,10 +12244,10 @@ var CLI_REGISTRY = {
|
|
|
12247
12244
|
usage: "okx market indicator list",
|
|
12248
12245
|
description: "List all supported technical indicators"
|
|
12249
12246
|
},
|
|
12250
|
-
"<
|
|
12247
|
+
"<indicator> <instId>": {
|
|
12251
12248
|
toolName: "market_get_indicator",
|
|
12252
|
-
usage: "okx market indicator <
|
|
12253
|
-
description: "Get indicator values for an instrument (e.g. okx market indicator BTC-USDT-SWAP
|
|
12249
|
+
usage: "okx market indicator <indicator> <instId> [--bar <3m|5m|15m|1H|4H|12Hutc|1Dutc|3Dutc|1Wutc>] [--limit <1-100>] [--backtest-time <ts>] [--params <json>]",
|
|
12250
|
+
description: "Get indicator values for an instrument (e.g. okx market indicator rsi BTC-USDT-SWAP). NOTE: 1m is not supported for indicators."
|
|
12254
12251
|
}
|
|
12255
12252
|
}
|
|
12256
12253
|
}
|
|
@@ -13009,29 +13006,29 @@ var CLI_REGISTRY = {
|
|
|
13009
13006
|
commands: {
|
|
13010
13007
|
latest: {
|
|
13011
13008
|
toolName: "news_get_latest",
|
|
13012
|
-
usage: "okx news latest [--coins BTC,ETH] [--lang
|
|
13009
|
+
usage: "okx news latest [--coins BTC,ETH] [--platform blockbeats] [--lang zh-CN] [--limit 20]"
|
|
13013
13010
|
},
|
|
13014
13011
|
important: {
|
|
13015
13012
|
toolName: "news_get_latest",
|
|
13016
|
-
usage: "okx news important [--coins BTC,ETH] [--lang
|
|
13013
|
+
usage: "okx news important [--coins BTC,ETH] [--lang zh-CN] [--limit 20]",
|
|
13017
13014
|
description: "Get important/high-impact crypto news"
|
|
13018
13015
|
},
|
|
13019
13016
|
"by-coin": {
|
|
13020
13017
|
toolName: "news_get_by_coin",
|
|
13021
|
-
usage: "okx news by-coin --coins BTC [--importance high] [--lang
|
|
13018
|
+
usage: "okx news by-coin --coins BTC [--importance high] [--platform blockbeats] [--lang zh-CN]"
|
|
13022
13019
|
},
|
|
13023
13020
|
search: {
|
|
13024
13021
|
toolName: "news_search",
|
|
13025
|
-
usage: "okx news search --keyword <term> [--coins BTC] [--sentiment bullish] [--lang
|
|
13022
|
+
usage: "okx news search --keyword <term> [--coins BTC] [--sentiment bullish] [--platform blockbeats] [--lang zh-CN]"
|
|
13026
13023
|
},
|
|
13027
13024
|
detail: {
|
|
13028
13025
|
toolName: "news_get_detail",
|
|
13029
|
-
usage: "okx news detail <id> [--lang
|
|
13026
|
+
usage: "okx news detail <id> [--lang zh-CN]"
|
|
13030
13027
|
},
|
|
13031
|
-
|
|
13028
|
+
platforms: {
|
|
13032
13029
|
toolName: "news_get_domains",
|
|
13033
|
-
usage: "okx news
|
|
13034
|
-
description: "List available news
|
|
13030
|
+
usage: "okx news platforms",
|
|
13031
|
+
description: "List available news platforms"
|
|
13035
13032
|
},
|
|
13036
13033
|
"coin-sentiment": {
|
|
13037
13034
|
toolName: "news_get_coin_sentiment",
|
|
@@ -13044,7 +13041,7 @@ var CLI_REGISTRY = {
|
|
|
13044
13041
|
},
|
|
13045
13042
|
"by-sentiment": {
|
|
13046
13043
|
toolName: "news_search",
|
|
13047
|
-
usage: "okx news by-sentiment --sentiment bullish [--coins BTC] [--sort-by latest]",
|
|
13044
|
+
usage: "okx news by-sentiment --sentiment bullish [--coins BTC] [--importance high] [--platform <source>] [--sort-by latest] [--begin <ms>] [--end <ms>]",
|
|
13048
13045
|
description: "Browse news filtered by sentiment direction"
|
|
13049
13046
|
},
|
|
13050
13047
|
"sentiment-rank": {
|
|
@@ -13251,7 +13248,8 @@ function formatTime(ts) {
|
|
|
13251
13248
|
async function cmdNewsLatest(run, opts) {
|
|
13252
13249
|
const result = await run("news_get_latest", {
|
|
13253
13250
|
coins: opts.coins,
|
|
13254
|
-
importance: opts.importance,
|
|
13251
|
+
importance: opts.importance ?? "low",
|
|
13252
|
+
platform: opts.platform,
|
|
13255
13253
|
begin: opts.begin,
|
|
13256
13254
|
end: opts.end,
|
|
13257
13255
|
language: opts.language,
|
|
@@ -13278,6 +13276,7 @@ async function cmdNewsImportant(run, opts) {
|
|
|
13278
13276
|
const result = await run("news_get_latest", {
|
|
13279
13277
|
coins: opts.coins,
|
|
13280
13278
|
importance: "high",
|
|
13279
|
+
platform: opts.platform,
|
|
13281
13280
|
begin: opts.begin,
|
|
13282
13281
|
end: opts.end,
|
|
13283
13282
|
language: opts.language,
|
|
@@ -13301,7 +13300,8 @@ async function cmdNewsImportant(run, opts) {
|
|
|
13301
13300
|
async function cmdNewsByCoin(run, coins, opts) {
|
|
13302
13301
|
const result = await run("news_get_by_coin", {
|
|
13303
13302
|
coins,
|
|
13304
|
-
importance: opts.importance,
|
|
13303
|
+
importance: opts.importance ?? "low",
|
|
13304
|
+
platform: opts.platform,
|
|
13305
13305
|
begin: opts.begin,
|
|
13306
13306
|
end: opts.end,
|
|
13307
13307
|
language: opts.language,
|
|
@@ -13326,7 +13326,8 @@ async function cmdNewsSearch(run, keyword, opts) {
|
|
|
13326
13326
|
const result = await run("news_search", {
|
|
13327
13327
|
keyword: keyword || void 0,
|
|
13328
13328
|
coins: opts.coins,
|
|
13329
|
-
importance: opts.importance,
|
|
13329
|
+
importance: opts.importance ?? "low",
|
|
13330
|
+
platform: opts.platform,
|
|
13330
13331
|
sentiment: opts.sentiment,
|
|
13331
13332
|
sortBy: opts.sortBy,
|
|
13332
13333
|
begin: opts.begin,
|
|
@@ -13379,12 +13380,12 @@ async function cmdNewsDetail(run, id, opts) {
|
|
|
13379
13380
|
content
|
|
13380
13381
|
});
|
|
13381
13382
|
}
|
|
13382
|
-
async function
|
|
13383
|
+
async function cmdNewsPlatforms(run, opts) {
|
|
13383
13384
|
const result = await run("news_get_domains", {});
|
|
13384
13385
|
const raw = getData(result);
|
|
13385
13386
|
const items = raw?.[0]?.["platform"] ?? [];
|
|
13386
13387
|
if (opts.json) return printJson(items);
|
|
13387
|
-
outputLine("Available news
|
|
13388
|
+
outputLine("Available news platforms:");
|
|
13388
13389
|
items.forEach((d) => outputLine(` ${d}`));
|
|
13389
13390
|
}
|
|
13390
13391
|
async function cmdNewsCoinSentiment(run, coins, opts) {
|
|
@@ -13766,6 +13767,7 @@ var CLI_OPTIONS = {
|
|
|
13766
13767
|
coins: { type: "string" },
|
|
13767
13768
|
sentiment: { type: "string" },
|
|
13768
13769
|
importance: { type: "string" },
|
|
13770
|
+
platform: { type: "string" },
|
|
13769
13771
|
keyword: { type: "string" },
|
|
13770
13772
|
"detail-lvl": { type: "string" },
|
|
13771
13773
|
period: { type: "string" },
|
|
@@ -17580,7 +17582,7 @@ async function cmdEventCancel(run, opts) {
|
|
|
17580
17582
|
// src/index.ts
|
|
17581
17583
|
var _require3 = createRequire3(import.meta.url);
|
|
17582
17584
|
var CLI_VERSION2 = _require3("../package.json").version;
|
|
17583
|
-
var GIT_HASH2 = true ? "
|
|
17585
|
+
var GIT_HASH2 = true ? "2075d12" : "dev";
|
|
17584
17586
|
function handleDohCommand(action, json, force, binaryPath) {
|
|
17585
17587
|
if (action === "status") return cmdDohStatus(json, binaryPath);
|
|
17586
17588
|
if (action === "install") return cmdDohInstall(json, binaryPath);
|
|
@@ -18424,21 +18426,22 @@ function handleNewsCommand(run, action, rest, v, json) {
|
|
|
18424
18426
|
const limit = v.limit !== void 0 ? Number(v.limit) : void 0;
|
|
18425
18427
|
const begin = v.begin !== void 0 ? Number(v.begin) : void 0;
|
|
18426
18428
|
const end = v.end !== void 0 ? Number(v.end) : void 0;
|
|
18427
|
-
const language = v.lang ?? "
|
|
18429
|
+
const language = v.lang ?? "en-US";
|
|
18428
18430
|
const detailLvl = v["detail-lvl"];
|
|
18429
18431
|
const after = v.after;
|
|
18430
18432
|
const period = v.period;
|
|
18431
18433
|
const points = v.points !== void 0 ? Number(v.points) : 24;
|
|
18432
18434
|
const sortBy = v["sort-by"];
|
|
18433
|
-
const
|
|
18434
|
-
const
|
|
18435
|
+
const platform3 = v.platform;
|
|
18436
|
+
const searchOpts = { coins: v.coins, importance: v.importance, platform: platform3, sentiment: v.sentiment, sortBy, begin, end, language, detailLvl, limit, after, json };
|
|
18437
|
+
const listOpts = { coins: v.coins, importance: v.importance, platform: platform3, begin, end, language, detailLvl, limit, after, json };
|
|
18435
18438
|
const dispatch = {
|
|
18436
18439
|
latest: () => cmdNewsLatest(run, listOpts),
|
|
18437
|
-
important: () => cmdNewsImportant(run, { coins: v.coins, begin, end, language, detailLvl, limit, json }),
|
|
18438
|
-
"by-coin": () => cmdNewsByCoin(run, v.coins ?? rest[0], { importance: v.importance, begin, end, language, detailLvl, limit, json }),
|
|
18440
|
+
important: () => cmdNewsImportant(run, { coins: v.coins, platform: platform3, begin, end, language, detailLvl, limit, json }),
|
|
18441
|
+
"by-coin": () => cmdNewsByCoin(run, v.coins ?? rest[0], { importance: v.importance, platform: platform3, begin, end, language, detailLvl, limit, json }),
|
|
18439
18442
|
search: () => cmdNewsSearch(run, v.keyword ?? rest[0], searchOpts),
|
|
18440
18443
|
detail: () => cmdNewsDetail(run, rest[0], { language, json }),
|
|
18441
|
-
|
|
18444
|
+
platforms: () => cmdNewsPlatforms(run, { json }),
|
|
18442
18445
|
"coin-sentiment": () => cmdNewsCoinSentiment(run, v.coins ?? rest[0], { period, json }),
|
|
18443
18446
|
"coin-trend": () => cmdNewsCoinTrend(run, v.coins ?? rest[0], { period, points, json }),
|
|
18444
18447
|
// by-sentiment is a convenience wrapper over news_search (no keyword, sentiment filter only)
|
|
@@ -18570,13 +18573,25 @@ function printVersion() {
|
|
|
18570
18573
|
}
|
|
18571
18574
|
}
|
|
18572
18575
|
function routeManagementCommand(module, action, rest, json, v) {
|
|
18573
|
-
if (module === "config")
|
|
18574
|
-
|
|
18576
|
+
if (module === "config") {
|
|
18577
|
+
const r = handleConfigCommand(action, rest, json, v.lang, v.force);
|
|
18578
|
+
return r ?? true;
|
|
18579
|
+
}
|
|
18580
|
+
if (module === "setup") {
|
|
18581
|
+
handleSetupCommand(v);
|
|
18582
|
+
return true;
|
|
18583
|
+
}
|
|
18575
18584
|
if (module === "auth") return handleAuthCommand(action, rest, v);
|
|
18576
18585
|
if (module === "upgrade") return cmdUpgrade(CLI_VERSION2, { beta: v.beta, check: v.check, force: v.force }, json);
|
|
18577
|
-
if (module === "doh")
|
|
18586
|
+
if (module === "doh") {
|
|
18587
|
+
const r = handleDohCommand(action, json, v.force ?? false);
|
|
18588
|
+
return r ?? true;
|
|
18589
|
+
}
|
|
18578
18590
|
if (module === "diagnose") return runDiagnose(v);
|
|
18579
|
-
if (module === "list-tools")
|
|
18591
|
+
if (module === "list-tools") {
|
|
18592
|
+
cmdListTools(json);
|
|
18593
|
+
return true;
|
|
18594
|
+
}
|
|
18580
18595
|
return void 0;
|
|
18581
18596
|
}
|
|
18582
18597
|
async function main() {
|
|
@@ -18598,7 +18613,7 @@ async function main() {
|
|
|
18598
18613
|
const v = values;
|
|
18599
18614
|
const json = v.json ?? false;
|
|
18600
18615
|
const mgmt = routeManagementCommand(module, action, rest, json, v);
|
|
18601
|
-
if (mgmt) return mgmt;
|
|
18616
|
+
if (mgmt !== void 0) return mgmt === true ? void 0 : mgmt;
|
|
18602
18617
|
const config = await loadProfileConfig({ profile: v.profile, demo: v.demo, live: v.live, verbose: v.verbose, userAgent: `okx-trade-cli/${CLI_VERSION2}`, sourceTag: "CLI" });
|
|
18603
18618
|
setEnvContext({ demo: config.demo, profile: v.profile ?? "default" });
|
|
18604
18619
|
setJsonEnvEnabled(v.env ?? false);
|