@tradejs/node 3.1.11 → 3.1.12-beta.217
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/ai.js +0 -1
- package/dist/ai.mjs +1 -1
- package/dist/backtest.js +99 -82
- package/dist/backtest.mjs +2 -2
- package/dist/{chunk-B6X2HEGL.mjs → chunk-6PIVDS4M.mjs} +6 -6
- package/dist/{chunk-C3KRBNUR.mjs → chunk-IKRSNRP6.mjs} +58 -31
- package/dist/chunk-NQO2MFP6.mjs +552 -0
- package/dist/cli.js +108 -91
- package/dist/cli.mjs +1 -1
- package/dist/registry.js +86 -65
- package/dist/registry.mjs +2 -2
- package/dist/runtimeDashboard.js +420 -216
- package/dist/runtimeDashboard.mjs +9 -9
- package/dist/runtimeStrategies.d.mts +66 -6
- package/dist/runtimeStrategies.d.ts +66 -6
- package/dist/runtimeStrategies.js +450 -218
- package/dist/runtimeStrategies.mjs +11 -3
- package/dist/strategies.js +97 -76
- package/dist/strategies.mjs +2 -2
- package/package.json +14 -8
- package/dist/chunk-7BAL7EN3.mjs +0 -345
package/dist/cli.js
CHANGED
|
@@ -74,7 +74,7 @@ var SCREENSHOT_CONCURRENCY_LIMIT = NODE_ENV === "production" ? 1 : 2;
|
|
|
74
74
|
// src/cli.ts
|
|
75
75
|
var import_files = require("@tradejs/infra/files");
|
|
76
76
|
var import_redis3 = require("@tradejs/infra/redis");
|
|
77
|
-
var
|
|
77
|
+
var import_logger4 = require("@tradejs/infra/logger");
|
|
78
78
|
var import_candles = require("@tradejs/infra/timescale/candles");
|
|
79
79
|
|
|
80
80
|
// src/ai.ts
|
|
@@ -655,7 +655,6 @@ var buildAiMarketContext = (signal) => ({
|
|
|
655
655
|
|
|
656
656
|
// src/strategy/manifests.ts
|
|
657
657
|
var import_indicators = require("@tradejs/core/indicators");
|
|
658
|
-
var import_logger2 = require("@tradejs/infra/logger");
|
|
659
658
|
|
|
660
659
|
// src/tradejsConfig.ts
|
|
661
660
|
var import_fs = __toESM(require("fs"));
|
|
@@ -1008,21 +1007,34 @@ var extractIndicatorPluginDefinition = (moduleExport) => {
|
|
|
1008
1007
|
);
|
|
1009
1008
|
return indicatorEntries ? { indicatorEntries } : null;
|
|
1010
1009
|
};
|
|
1011
|
-
var
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1010
|
+
var validateStrategyEntries = (moduleName, entries, state) => {
|
|
1011
|
+
const issues = [];
|
|
1012
|
+
const names = /* @__PURE__ */ new Set();
|
|
1013
|
+
entries.forEach((entry, index) => {
|
|
1014
|
+
const entryPath = `${moduleName}.strategyEntries[${index}]`;
|
|
1015
|
+
const strategyName = entry?.manifest?.name;
|
|
1016
|
+
if (typeof strategyName !== "string" || !strategyName.trim()) {
|
|
1017
|
+
issues.push(`${entryPath}: manifest.name is required`);
|
|
1018
|
+
} else if (names.has(strategyName) || state.strategyEntriesMap.has(strategyName)) {
|
|
1019
|
+
issues.push(`${entryPath}: duplicate strategy ${strategyName}`);
|
|
1020
|
+
} else {
|
|
1021
|
+
names.add(strategyName);
|
|
1017
1022
|
}
|
|
1018
|
-
if (
|
|
1019
|
-
|
|
1020
|
-
'Skip duplicate strategy "%s" from %s: already registered',
|
|
1021
|
-
strategyName,
|
|
1022
|
-
source
|
|
1023
|
-
);
|
|
1024
|
-
continue;
|
|
1023
|
+
if (!entry || typeof entry !== "object" || !entry.defaults || typeof entry.defaults !== "object" || Array.isArray(entry.defaults)) {
|
|
1024
|
+
issues.push(`${entryPath}: defaults must be an object`);
|
|
1025
1025
|
}
|
|
1026
|
+
if (typeof entry?.parseConfig !== "function") {
|
|
1027
|
+
issues.push(`${entryPath}: parseConfig is required`);
|
|
1028
|
+
}
|
|
1029
|
+
if (typeof entry?.createCore !== "function") {
|
|
1030
|
+
issues.push(`${entryPath}: createCore is required`);
|
|
1031
|
+
}
|
|
1032
|
+
});
|
|
1033
|
+
return issues;
|
|
1034
|
+
};
|
|
1035
|
+
var registerEntries = (entries, source, state) => {
|
|
1036
|
+
for (const entry of entries) {
|
|
1037
|
+
const strategyName = entry.manifest.name;
|
|
1026
1038
|
state.strategyManifestsMap.set(strategyName, entry.manifest);
|
|
1027
1039
|
state.strategyEntriesMap.set(strategyName, entry);
|
|
1028
1040
|
state.strategySourcesMap.set(strategyName, source);
|
|
@@ -1071,6 +1083,7 @@ var ensureStrategyPluginsLoaded = async (cwd = getTradejsProjectCwd()) => {
|
|
|
1071
1083
|
if (!pluginModuleNames.length) {
|
|
1072
1084
|
return;
|
|
1073
1085
|
}
|
|
1086
|
+
const issues = [];
|
|
1074
1087
|
for (const moduleName of pluginModuleNames) {
|
|
1075
1088
|
try {
|
|
1076
1089
|
const resolvedModuleName = resolvePluginModuleSpecifier(
|
|
@@ -1084,24 +1097,30 @@ var ensureStrategyPluginsLoaded = async (cwd = getTradejsProjectCwd()) => {
|
|
|
1084
1097
|
if (strategySet.has(moduleName)) {
|
|
1085
1098
|
const pluginDefinition = extractStrategyPluginDefinition(moduleExport);
|
|
1086
1099
|
if (!pluginDefinition) {
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
moduleName
|
|
1100
|
+
issues.push(
|
|
1101
|
+
`${moduleName}: export { strategyEntries } is missing`
|
|
1090
1102
|
);
|
|
1091
1103
|
} else {
|
|
1092
|
-
|
|
1093
|
-
pluginDefinition.strategyEntries,
|
|
1104
|
+
const entryIssues = validateStrategyEntries(
|
|
1094
1105
|
moduleName,
|
|
1106
|
+
pluginDefinition.strategyEntries,
|
|
1095
1107
|
state
|
|
1096
1108
|
);
|
|
1109
|
+
issues.push(...entryIssues);
|
|
1110
|
+
if (entryIssues.length === 0) {
|
|
1111
|
+
registerEntries(
|
|
1112
|
+
pluginDefinition.strategyEntries,
|
|
1113
|
+
moduleName,
|
|
1114
|
+
state
|
|
1115
|
+
);
|
|
1116
|
+
}
|
|
1097
1117
|
}
|
|
1098
1118
|
}
|
|
1099
1119
|
if (indicatorSet.has(moduleName)) {
|
|
1100
1120
|
const indicatorPluginDefinition = extractIndicatorPluginDefinition(moduleExport);
|
|
1101
1121
|
if (!indicatorPluginDefinition) {
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
moduleName
|
|
1122
|
+
issues.push(
|
|
1123
|
+
`${moduleName}: export { indicatorEntries } is missing`
|
|
1105
1124
|
);
|
|
1106
1125
|
} else {
|
|
1107
1126
|
(0, import_indicators.registerIndicatorEntries)(
|
|
@@ -1112,19 +1131,17 @@ var ensureStrategyPluginsLoaded = async (cwd = getTradejsProjectCwd()) => {
|
|
|
1112
1131
|
}
|
|
1113
1132
|
}
|
|
1114
1133
|
if (!strategySet.has(moduleName) && !indicatorSet.has(moduleName)) {
|
|
1115
|
-
|
|
1116
|
-
'Skip plugin "%s": no strategy/indicator sections requested in config',
|
|
1117
|
-
moduleName
|
|
1118
|
-
);
|
|
1134
|
+
issues.push(`${moduleName}: plugin is not declared in config`);
|
|
1119
1135
|
}
|
|
1120
1136
|
} catch (error) {
|
|
1121
|
-
|
|
1122
|
-
'Failed to load plugin "%s": %s',
|
|
1123
|
-
moduleName,
|
|
1124
|
-
String(error)
|
|
1125
|
-
);
|
|
1137
|
+
issues.push(`${moduleName}: failed to import: ${String(error)}`);
|
|
1126
1138
|
}
|
|
1127
1139
|
}
|
|
1140
|
+
if (issues.length > 0) {
|
|
1141
|
+
throw new Error(
|
|
1142
|
+
["Invalid TradeJS plugin catalog:", ...issues].join("\n")
|
|
1143
|
+
);
|
|
1144
|
+
}
|
|
1128
1145
|
})();
|
|
1129
1146
|
}
|
|
1130
1147
|
await state.pluginsLoadPromise;
|
|
@@ -1610,7 +1627,7 @@ var import_promises = __toESM(require("fs/promises"));
|
|
|
1610
1627
|
var import_path2 = __toESM(require("path"));
|
|
1611
1628
|
var import_puppeteer = __toESM(require("puppeteer"));
|
|
1612
1629
|
var import_async = require("@tradejs/core/async");
|
|
1613
|
-
var
|
|
1630
|
+
var import_logger2 = require("@tradejs/infra/logger");
|
|
1614
1631
|
var import_redis2 = require("@tradejs/infra/redis");
|
|
1615
1632
|
|
|
1616
1633
|
// src/dashboardUrl.ts
|
|
@@ -1755,7 +1772,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1755
1772
|
}
|
|
1756
1773
|
});
|
|
1757
1774
|
const maskedDashboardUrl = maskTokenInUrl(dashboardUrl);
|
|
1758
|
-
|
|
1775
|
+
import_logger2.logger.info(
|
|
1759
1776
|
"screenshot start: %s %sm url=%s path=%s",
|
|
1760
1777
|
symbol,
|
|
1761
1778
|
interval,
|
|
@@ -1780,7 +1797,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1780
1797
|
let browserCloseRequested = false;
|
|
1781
1798
|
try {
|
|
1782
1799
|
if (browserProcess) {
|
|
1783
|
-
|
|
1800
|
+
import_logger2.logger.info(
|
|
1784
1801
|
"screenshot browser: %s %sm captureAttempt=%d pid=%s exec=%s",
|
|
1785
1802
|
symbol,
|
|
1786
1803
|
interval,
|
|
@@ -1789,7 +1806,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1789
1806
|
browserProcess.spawnfile || "unknown"
|
|
1790
1807
|
);
|
|
1791
1808
|
}
|
|
1792
|
-
|
|
1809
|
+
import_logger2.logger.info(
|
|
1793
1810
|
"screenshot browser version: %s %sm captureAttempt=%d version=%s",
|
|
1794
1811
|
symbol,
|
|
1795
1812
|
interval,
|
|
@@ -1800,7 +1817,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1800
1817
|
if (browserCloseRequested) {
|
|
1801
1818
|
return;
|
|
1802
1819
|
}
|
|
1803
|
-
|
|
1820
|
+
import_logger2.logger.error(
|
|
1804
1821
|
"screenshot browser disconnected: %s %sm captureAttempt=%d",
|
|
1805
1822
|
symbol,
|
|
1806
1823
|
interval,
|
|
@@ -1813,7 +1830,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1813
1830
|
if (!text) {
|
|
1814
1831
|
return;
|
|
1815
1832
|
}
|
|
1816
|
-
|
|
1833
|
+
import_logger2.logger.error(
|
|
1817
1834
|
"screenshot browser stderr: %s %sm captureAttempt=%d (%s)",
|
|
1818
1835
|
symbol,
|
|
1819
1836
|
interval,
|
|
@@ -1829,7 +1846,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1829
1846
|
if (!request.isNavigationRequest() && request.resourceType() !== "document") {
|
|
1830
1847
|
return;
|
|
1831
1848
|
}
|
|
1832
|
-
|
|
1849
|
+
import_logger2.logger.error(
|
|
1833
1850
|
"screenshot request failed: %s %sm %s (%s)",
|
|
1834
1851
|
symbol,
|
|
1835
1852
|
interval,
|
|
@@ -1838,7 +1855,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1838
1855
|
);
|
|
1839
1856
|
});
|
|
1840
1857
|
page.on("pageerror", (error) => {
|
|
1841
|
-
|
|
1858
|
+
import_logger2.logger.error(
|
|
1842
1859
|
"screenshot page error: %s %sm (%s)",
|
|
1843
1860
|
symbol,
|
|
1844
1861
|
interval,
|
|
@@ -1846,7 +1863,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1846
1863
|
);
|
|
1847
1864
|
});
|
|
1848
1865
|
page.on("error", (error) => {
|
|
1849
|
-
|
|
1866
|
+
import_logger2.logger.error(
|
|
1850
1867
|
"screenshot target error: %s %sm (%s)",
|
|
1851
1868
|
symbol,
|
|
1852
1869
|
interval,
|
|
@@ -1854,7 +1871,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1854
1871
|
);
|
|
1855
1872
|
});
|
|
1856
1873
|
page.on("close", () => {
|
|
1857
|
-
|
|
1874
|
+
import_logger2.logger.info(
|
|
1858
1875
|
"screenshot page closed: %s %sm captureAttempt=%d",
|
|
1859
1876
|
symbol,
|
|
1860
1877
|
interval,
|
|
@@ -1871,7 +1888,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1871
1888
|
consoleMessagesLogged += 1;
|
|
1872
1889
|
const location = message.location();
|
|
1873
1890
|
const suffix = location.url ? ` ${maskTokenInUrl(location.url)}:${location.lineNumber ?? 0}:${location.columnNumber ?? 0}` : "";
|
|
1874
|
-
|
|
1891
|
+
import_logger2.logger.error(
|
|
1875
1892
|
"screenshot console %s: %s %sm captureAttempt=%d (%s%s)",
|
|
1876
1893
|
message.type(),
|
|
1877
1894
|
symbol,
|
|
@@ -1893,7 +1910,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1893
1910
|
)) {
|
|
1894
1911
|
return;
|
|
1895
1912
|
}
|
|
1896
|
-
|
|
1913
|
+
import_logger2.logger.error(
|
|
1897
1914
|
"screenshot response failed: %s %sm captureAttempt=%d status=%d type=%s url=%s",
|
|
1898
1915
|
symbol,
|
|
1899
1916
|
interval,
|
|
@@ -1905,7 +1922,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1905
1922
|
});
|
|
1906
1923
|
await page.setViewport(SCREENSHOT_VIEWPORT);
|
|
1907
1924
|
let gotoError = null;
|
|
1908
|
-
|
|
1925
|
+
import_logger2.logger.info(
|
|
1909
1926
|
"screenshot render: %s %sm captureAttempt=%d viewport=%dx%d@%d",
|
|
1910
1927
|
symbol,
|
|
1911
1928
|
interval,
|
|
@@ -1916,7 +1933,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1916
1933
|
);
|
|
1917
1934
|
for (let attempt = 1; attempt <= SCREENSHOT_NAVIGATION_ATTEMPTS; attempt += 1) {
|
|
1918
1935
|
try {
|
|
1919
|
-
|
|
1936
|
+
import_logger2.logger.info(
|
|
1920
1937
|
"screenshot goto: %s %sm captureAttempt=%d attempt=%d url=%s",
|
|
1921
1938
|
symbol,
|
|
1922
1939
|
interval,
|
|
@@ -1928,7 +1945,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1928
1945
|
waitUntil: "domcontentloaded",
|
|
1929
1946
|
timeout: SCREENSHOT_NAVIGATION_TIMEOUT_MS
|
|
1930
1947
|
});
|
|
1931
|
-
|
|
1948
|
+
import_logger2.logger.info(
|
|
1932
1949
|
"screenshot goto ok: %s %sm captureAttempt=%d attempt=%d status=%s finalUrl=%s",
|
|
1933
1950
|
symbol,
|
|
1934
1951
|
interval,
|
|
@@ -1937,7 +1954,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1937
1954
|
response ? String(response.status()) : "null",
|
|
1938
1955
|
maskTokenInUrl(page.url())
|
|
1939
1956
|
);
|
|
1940
|
-
|
|
1957
|
+
import_logger2.logger.info(
|
|
1941
1958
|
"screenshot page info: %s %sm captureAttempt=%d title=%s ua=%s",
|
|
1942
1959
|
symbol,
|
|
1943
1960
|
interval,
|
|
@@ -1949,7 +1966,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1949
1966
|
break;
|
|
1950
1967
|
} catch (error) {
|
|
1951
1968
|
gotoError = error;
|
|
1952
|
-
|
|
1969
|
+
import_logger2.logger.error(
|
|
1953
1970
|
"screenshot goto failed: %s %sm captureAttempt=%d attempt=%d url=%s (%s)",
|
|
1954
1971
|
symbol,
|
|
1955
1972
|
interval,
|
|
@@ -1984,7 +2001,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1984
2001
|
path: screenshotPath,
|
|
1985
2002
|
type: "png"
|
|
1986
2003
|
});
|
|
1987
|
-
|
|
2004
|
+
import_logger2.logger.info(
|
|
1988
2005
|
"screenshot saved: %s %sm path=%s",
|
|
1989
2006
|
symbol,
|
|
1990
2007
|
interval,
|
|
@@ -1996,7 +2013,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
1996
2013
|
}
|
|
1997
2014
|
} catch (error) {
|
|
1998
2015
|
captureError = error;
|
|
1999
|
-
|
|
2016
|
+
import_logger2.logger.error(
|
|
2000
2017
|
"screenshot capture failed: %s %sm captureAttempt=%d (%s)",
|
|
2001
2018
|
symbol,
|
|
2002
2019
|
interval,
|
|
@@ -2017,7 +2034,7 @@ var screenDashboard = async (signal, projectRoot, userName = "root") => {
|
|
|
2017
2034
|
// src/signals.ts
|
|
2018
2035
|
var import_async2 = require("@tradejs/core/async");
|
|
2019
2036
|
var import_math = require("@tradejs/core/math");
|
|
2020
|
-
var
|
|
2037
|
+
var import_logger3 = require("@tradejs/infra/logger");
|
|
2021
2038
|
var import_userSettings2 = require("@tradejs/infra/userSettings");
|
|
2022
2039
|
var escapeHtml = (s) => {
|
|
2023
2040
|
if (!s) return "";
|
|
@@ -2224,7 +2241,7 @@ var requestTelegram = async ({
|
|
|
2224
2241
|
return await parseTelegramResponse(res);
|
|
2225
2242
|
} catch (error) {
|
|
2226
2243
|
lastError = error;
|
|
2227
|
-
|
|
2244
|
+
import_logger3.logger.error(
|
|
2228
2245
|
"tg %s network failed: attempt=%d (%s)",
|
|
2229
2246
|
method,
|
|
2230
2247
|
attempt,
|
|
@@ -2257,7 +2274,7 @@ var sendTelegramMessage = async ({
|
|
|
2257
2274
|
})
|
|
2258
2275
|
}
|
|
2259
2276
|
});
|
|
2260
|
-
|
|
2277
|
+
import_logger3.logger.info(
|
|
2261
2278
|
"tg sendMessage: %s",
|
|
2262
2279
|
data?.ok ? "sent" : getTelegramErrorReason(data)
|
|
2263
2280
|
);
|
|
@@ -2299,7 +2316,7 @@ var sendDocumentToTG = async (document, options = {}) => {
|
|
|
2299
2316
|
body
|
|
2300
2317
|
}
|
|
2301
2318
|
});
|
|
2302
|
-
|
|
2319
|
+
import_logger3.logger.info(
|
|
2303
2320
|
"tg sendDocument: %s",
|
|
2304
2321
|
data?.ok ? "sent" : getTelegramErrorReason(data)
|
|
2305
2322
|
);
|
|
@@ -2435,7 +2452,7 @@ var sendSignal = async (signal, imgInterval, analysis, options = {}) => {
|
|
|
2435
2452
|
screenshot.byteOffset + screenshot.byteLength
|
|
2436
2453
|
);
|
|
2437
2454
|
} catch (error) {
|
|
2438
|
-
|
|
2455
|
+
import_logger3.logger.error(
|
|
2439
2456
|
"tg screenshot unavailable: %s (%s)",
|
|
2440
2457
|
symbol,
|
|
2441
2458
|
error?.message || String(error)
|
|
@@ -2467,7 +2484,7 @@ var sendSignal = async (signal, imgInterval, analysis, options = {}) => {
|
|
|
2467
2484
|
});
|
|
2468
2485
|
} catch (error) {
|
|
2469
2486
|
const reason = getErrorMessage2(error);
|
|
2470
|
-
|
|
2487
|
+
import_logger3.logger.error("tg sendPhoto request failed: %s", reason);
|
|
2471
2488
|
await sendTelegramMessage({
|
|
2472
2489
|
message: `${message}
|
|
2473
2490
|
|
|
@@ -2481,7 +2498,7 @@ Reason: <code>${escapeHtml(reason)}</code>`,
|
|
|
2481
2498
|
}
|
|
2482
2499
|
if (!data?.ok) {
|
|
2483
2500
|
const reason = getTelegramErrorReason(data);
|
|
2484
|
-
|
|
2501
|
+
import_logger3.logger.error("tg sendPhoto failed: %s", JSON.stringify(data));
|
|
2485
2502
|
await sendTelegramMessage({
|
|
2486
2503
|
message: `${message}
|
|
2487
2504
|
|
|
@@ -2493,7 +2510,7 @@ Reason: <code>${escapeHtml(reason)}</code>`,
|
|
|
2493
2510
|
});
|
|
2494
2511
|
return;
|
|
2495
2512
|
}
|
|
2496
|
-
|
|
2513
|
+
import_logger3.logger.info("tg sendPhoto: sent");
|
|
2497
2514
|
};
|
|
2498
2515
|
var formatAnalysisMessage = (signal, analysis) => {
|
|
2499
2516
|
const lines = [];
|
|
@@ -2585,7 +2602,7 @@ var sendSignalAnalysis = async (signal, analysis, options = {}) => {
|
|
|
2585
2602
|
})
|
|
2586
2603
|
}
|
|
2587
2604
|
});
|
|
2588
|
-
|
|
2605
|
+
import_logger3.logger.info(
|
|
2589
2606
|
"tg sendMessage (analysis): %s",
|
|
2590
2607
|
data?.ok ? "sent" : getTelegramErrorReason(data)
|
|
2591
2608
|
);
|
|
@@ -2616,8 +2633,8 @@ var cleanFiles = async (dir) => {
|
|
|
2616
2633
|
files = await (0, import_files.getFiles)(dir, projectRoot);
|
|
2617
2634
|
} catch (error) {
|
|
2618
2635
|
if (isEnoentError(error)) {
|
|
2619
|
-
|
|
2620
|
-
|
|
2636
|
+
import_logger4.logger.info(import_chalk.default.yellow("clean:", dir));
|
|
2637
|
+
import_logger4.logger.info("");
|
|
2621
2638
|
return;
|
|
2622
2639
|
}
|
|
2623
2640
|
throw error;
|
|
@@ -2626,7 +2643,7 @@ var cleanFiles = async (dir) => {
|
|
|
2626
2643
|
total: files.length,
|
|
2627
2644
|
width: 30
|
|
2628
2645
|
});
|
|
2629
|
-
|
|
2646
|
+
import_logger4.logger.info(import_chalk.default.yellow("clean:", dir));
|
|
2630
2647
|
for await (const file of files) {
|
|
2631
2648
|
completed++;
|
|
2632
2649
|
const fullPath = import_path3.default.join(projectRoot, dir, file);
|
|
@@ -2646,7 +2663,7 @@ var cleanFiles = async (dir) => {
|
|
|
2646
2663
|
bar.tick(completed === files.length ? completed % 100 : 100);
|
|
2647
2664
|
}
|
|
2648
2665
|
}
|
|
2649
|
-
|
|
2666
|
+
import_logger4.logger.info("");
|
|
2650
2667
|
};
|
|
2651
2668
|
var cleanRedis = async (area) => {
|
|
2652
2669
|
let completed = 0;
|
|
@@ -2655,7 +2672,7 @@ var cleanRedis = async (area) => {
|
|
|
2655
2672
|
total: keys.length,
|
|
2656
2673
|
width: 30
|
|
2657
2674
|
});
|
|
2658
|
-
|
|
2675
|
+
import_logger4.logger.info(import_chalk.default.yellow("clean:", area));
|
|
2659
2676
|
try {
|
|
2660
2677
|
for await (const key of keys) {
|
|
2661
2678
|
completed++;
|
|
@@ -2666,18 +2683,18 @@ var cleanRedis = async (area) => {
|
|
|
2666
2683
|
}
|
|
2667
2684
|
} catch (e) {
|
|
2668
2685
|
if (e instanceof import_redis3.RedisWriteBlockedError || String(e).includes("MISCONF")) {
|
|
2669
|
-
|
|
2686
|
+
import_logger4.logger.error(
|
|
2670
2687
|
"Redis write is blocked by MISCONF (RDB save failure). Cleanup stopped early."
|
|
2671
2688
|
);
|
|
2672
|
-
|
|
2689
|
+
import_logger4.logger.error(
|
|
2673
2690
|
"Check Redis logs and fix persistence/memory pressure before retry."
|
|
2674
2691
|
);
|
|
2675
|
-
|
|
2692
|
+
import_logger4.logger.info("");
|
|
2676
2693
|
return;
|
|
2677
2694
|
}
|
|
2678
2695
|
throw e;
|
|
2679
2696
|
}
|
|
2680
|
-
|
|
2697
|
+
import_logger4.logger.info("");
|
|
2681
2698
|
};
|
|
2682
2699
|
var update = async (connector, interval, tickers, preloadDays = import_constants.PRELOAD_DAYS, options = {}) => {
|
|
2683
2700
|
const preloadStart = Math.trunc(
|
|
@@ -2709,7 +2726,7 @@ var update = async (connector, interval, tickers, preloadDays = import_constants
|
|
|
2709
2726
|
});
|
|
2710
2727
|
const skippedCount = initialCount - queue.length;
|
|
2711
2728
|
if (skippedCount > 0) {
|
|
2712
|
-
|
|
2729
|
+
import_logger4.logger.info(
|
|
2713
2730
|
import_chalk.default.gray(
|
|
2714
2731
|
`update ${connectorLabel}: skip ${skippedCount}/${initialCount} cached symbols for interval=${interval}`
|
|
2715
2732
|
)
|
|
@@ -2717,12 +2734,12 @@ var update = async (connector, interval, tickers, preloadDays = import_constants
|
|
|
2717
2734
|
}
|
|
2718
2735
|
}
|
|
2719
2736
|
if (queue.length === 0) {
|
|
2720
|
-
|
|
2737
|
+
import_logger4.logger.info(
|
|
2721
2738
|
import_chalk.default.yellow(
|
|
2722
2739
|
`update: 0 (connector=${connectorLabel || "unknown"}, interval=${interval}, klineConcurrency=${KLINE_CONCURRENCY_LIMIT}, ${preloadLabel})`
|
|
2723
2740
|
)
|
|
2724
2741
|
);
|
|
2725
|
-
|
|
2742
|
+
import_logger4.logger.info("");
|
|
2726
2743
|
return;
|
|
2727
2744
|
}
|
|
2728
2745
|
const bar = new import_progress.default(
|
|
@@ -2732,7 +2749,7 @@ var update = async (connector, interval, tickers, preloadDays = import_constants
|
|
|
2732
2749
|
width: 30
|
|
2733
2750
|
}
|
|
2734
2751
|
);
|
|
2735
|
-
|
|
2752
|
+
import_logger4.logger.info(
|
|
2736
2753
|
import_chalk.default.yellow(
|
|
2737
2754
|
`update: ${queue.length} (connector=${connectorLabel || "unknown"}, interval=${interval}, klineConcurrency=${KLINE_CONCURRENCY_LIMIT}, ${preloadLabel})`
|
|
2738
2755
|
)
|
|
@@ -2748,12 +2765,12 @@ var update = async (connector, interval, tickers, preloadDays = import_constants
|
|
|
2748
2765
|
warmOnly: true
|
|
2749
2766
|
});
|
|
2750
2767
|
} catch {
|
|
2751
|
-
|
|
2768
|
+
import_logger4.logger.error("Failed loading: %s", symbol);
|
|
2752
2769
|
} finally {
|
|
2753
2770
|
bar.tick(1, { symbol: import_chalk.default.gray(symbol) });
|
|
2754
2771
|
}
|
|
2755
2772
|
});
|
|
2756
|
-
|
|
2773
|
+
import_logger4.logger.info("");
|
|
2757
2774
|
};
|
|
2758
2775
|
var parseSymbolsFromCLI = (symbol = "") => symbol.split(",").map((s) => {
|
|
2759
2776
|
const ticker = s.toUpperCase();
|
|
@@ -2793,7 +2810,7 @@ var getTickers = async (connector, include = "", exclude = "", limit, chunk, que
|
|
|
2793
2810
|
}
|
|
2794
2811
|
if (chunk) {
|
|
2795
2812
|
const [currentChunk, chunksCount] = chunk.split("/").map((c) => parseInt(c));
|
|
2796
|
-
|
|
2813
|
+
import_logger4.logger.info("chunk: %d / %d", currentChunk, chunksCount);
|
|
2797
2814
|
const chunkSize = Math.ceil(tickers.length / chunksCount);
|
|
2798
2815
|
const chunks = import_lodash.default.chunk(tickers, chunkSize);
|
|
2799
2816
|
tickers = chunks[currentChunk - 1];
|
|
@@ -2809,7 +2826,7 @@ var makeScreenshots = async (signals, interval, userName = "root") => {
|
|
|
2809
2826
|
width: 30
|
|
2810
2827
|
}
|
|
2811
2828
|
);
|
|
2812
|
-
|
|
2829
|
+
import_logger4.logger.info(import_chalk.default.yellow("screenshots:", `${interval}m`, signals.length));
|
|
2813
2830
|
await (0, import_async3.runWithConcurrency)(
|
|
2814
2831
|
signals,
|
|
2815
2832
|
SCREENSHOT_CONCURRENCY_LIMIT,
|
|
@@ -2817,7 +2834,7 @@ var makeScreenshots = async (signals, interval, userName = "root") => {
|
|
|
2817
2834
|
try {
|
|
2818
2835
|
await screenDashboard({ ...signal, interval }, projectRoot, userName);
|
|
2819
2836
|
} catch (error) {
|
|
2820
|
-
|
|
2837
|
+
import_logger4.logger.error(
|
|
2821
2838
|
"Failed screenshot: %s (%s)",
|
|
2822
2839
|
signal.symbol,
|
|
2823
2840
|
error?.message || String(error)
|
|
@@ -2827,7 +2844,7 @@ var makeScreenshots = async (signals, interval, userName = "root") => {
|
|
|
2827
2844
|
}
|
|
2828
2845
|
}
|
|
2829
2846
|
);
|
|
2830
|
-
|
|
2847
|
+
import_logger4.logger.info("");
|
|
2831
2848
|
};
|
|
2832
2849
|
var sendToAI = async (signals, userName = "root") => {
|
|
2833
2850
|
await ensureStrategyPluginsLoaded();
|
|
@@ -2838,17 +2855,17 @@ var sendToAI = async (signals, userName = "root") => {
|
|
|
2838
2855
|
width: 30
|
|
2839
2856
|
}
|
|
2840
2857
|
);
|
|
2841
|
-
|
|
2858
|
+
import_logger4.logger.info(import_chalk.default.yellow("AI:", signals.length));
|
|
2842
2859
|
await (0, import_async3.runWithConcurrency)(signals, AI_CONCURRENCY_LIMIT, async (signal) => {
|
|
2843
2860
|
try {
|
|
2844
2861
|
await askAI(signal, { userName });
|
|
2845
2862
|
} catch {
|
|
2846
|
-
|
|
2863
|
+
import_logger4.logger.error("Failed ask: %s", signal.symbol);
|
|
2847
2864
|
} finally {
|
|
2848
2865
|
bar.tick(1, { symbol: import_chalk.default.gray(signal.symbol) });
|
|
2849
2866
|
}
|
|
2850
2867
|
});
|
|
2851
|
-
|
|
2868
|
+
import_logger4.logger.info("");
|
|
2852
2869
|
};
|
|
2853
2870
|
var formatRuntimeCloseNotification = (event, _userName = event.userName ?? "root") => {
|
|
2854
2871
|
const ownership = event.openedByStrategy === event.strategy ? "matched" : `mismatch: opened by ${event.openedByStrategy}`;
|
|
@@ -2869,9 +2886,9 @@ var formatRuntimeCloseNotification = (event, _userName = event.userName ?? "root
|
|
|
2869
2886
|
].join("\n");
|
|
2870
2887
|
};
|
|
2871
2888
|
var sendRuntimeCloseNotificationsToTG = async (events, userName = "root") => {
|
|
2872
|
-
|
|
2889
|
+
import_logger4.logger.info(import_chalk.default.yellow("close messages:", events.length));
|
|
2873
2890
|
if (!events.length) {
|
|
2874
|
-
|
|
2891
|
+
import_logger4.logger.info("");
|
|
2875
2892
|
return;
|
|
2876
2893
|
}
|
|
2877
2894
|
const bar = new import_progress.default(
|
|
@@ -2887,7 +2904,7 @@ var sendRuntimeCloseNotificationsToTG = async (events, userName = "root") => {
|
|
|
2887
2904
|
userName
|
|
2888
2905
|
});
|
|
2889
2906
|
} catch (err) {
|
|
2890
|
-
|
|
2907
|
+
import_logger4.logger.error(
|
|
2891
2908
|
"Failed close notification: %s %s",
|
|
2892
2909
|
event.symbol,
|
|
2893
2910
|
err?.message || String(err)
|
|
@@ -2896,7 +2913,7 @@ var sendRuntimeCloseNotificationsToTG = async (events, userName = "root") => {
|
|
|
2896
2913
|
bar.tick(1, { symbol: import_chalk.default.gray(event.symbol) });
|
|
2897
2914
|
}
|
|
2898
2915
|
});
|
|
2899
|
-
|
|
2916
|
+
import_logger4.logger.info("");
|
|
2900
2917
|
};
|
|
2901
2918
|
var sendToTG = async (signals, imgInterval, userName = "root") => {
|
|
2902
2919
|
await ensureStrategyPluginsLoaded();
|
|
@@ -2927,9 +2944,9 @@ var sendToTG = async (signals, imgInterval, userName = "root") => {
|
|
|
2927
2944
|
const deliverableSignals = signals.filter(
|
|
2928
2945
|
(signal) => signal.orderStatus !== "skipped" && signal.orderStatus !== "canceled"
|
|
2929
2946
|
);
|
|
2930
|
-
|
|
2947
|
+
import_logger4.logger.info(import_chalk.default.yellow("messages:", deliverableSignals.length));
|
|
2931
2948
|
if (!deliverableSignals.length) {
|
|
2932
|
-
|
|
2949
|
+
import_logger4.logger.info("");
|
|
2933
2950
|
return;
|
|
2934
2951
|
}
|
|
2935
2952
|
const bar = new import_progress.default(
|
|
@@ -2972,7 +2989,7 @@ var sendToTG = async (signals, imgInterval, userName = "root") => {
|
|
|
2972
2989
|
};
|
|
2973
2990
|
shouldSendSignalAnalysis = true;
|
|
2974
2991
|
} catch (error) {
|
|
2975
|
-
|
|
2992
|
+
import_logger4.logger.error(
|
|
2976
2993
|
"LLM commentary failed: %s (%s)",
|
|
2977
2994
|
signal.symbol,
|
|
2978
2995
|
error?.message || String(error)
|
|
@@ -2989,7 +3006,7 @@ var sendToTG = async (signals, imgInterval, userName = "root") => {
|
|
|
2989
3006
|
await sendSignalAnalysis(signal, analysis, { userName });
|
|
2990
3007
|
}
|
|
2991
3008
|
} catch (err) {
|
|
2992
|
-
|
|
3009
|
+
import_logger4.logger.error(
|
|
2993
3010
|
"Signal notification failed: %s (%s)",
|
|
2994
3011
|
signal.symbol,
|
|
2995
3012
|
err?.message || String(err)
|
|
@@ -2998,7 +3015,7 @@ var sendToTG = async (signals, imgInterval, userName = "root") => {
|
|
|
2998
3015
|
bar.tick(1, { symbol: import_chalk.default.gray(signal.symbol) });
|
|
2999
3016
|
}
|
|
3000
3017
|
});
|
|
3001
|
-
|
|
3018
|
+
import_logger4.logger.info("");
|
|
3002
3019
|
};
|
|
3003
3020
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3004
3021
|
0 && (module.exports = {
|