@tradejs/node 3.1.11 → 3.1.12-beta.218

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/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 import_logger5 = require("@tradejs/infra/logger");
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 registerEntries = (entries, source, state) => {
1012
- for (const entry of entries) {
1013
- const strategyName = entry.manifest?.name;
1014
- if (!strategyName) {
1015
- import_logger2.logger.warn("Skip strategy entry without name from %s", source);
1016
- continue;
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 (state.strategyCreators.has(strategyName)) {
1019
- import_logger2.logger.warn(
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
- import_logger2.logger.warn(
1088
- 'Skip strategy plugin "%s": export { strategyEntries } is missing',
1089
- moduleName
1100
+ issues.push(
1101
+ `${moduleName}: export { strategyEntries } is missing`
1090
1102
  );
1091
1103
  } else {
1092
- registerEntries(
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
- import_logger2.logger.warn(
1103
- 'Skip indicator plugin "%s": export { indicatorEntries } is missing',
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
- import_logger2.logger.warn(
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
- import_logger2.logger.warn(
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 import_logger3 = require("@tradejs/infra/logger");
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
- import_logger3.logger.info(
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
- import_logger3.logger.info(
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
- import_logger3.logger.info(
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
- import_logger3.logger.error(
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
- import_logger3.logger.error(
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
- import_logger3.logger.error(
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
- import_logger3.logger.error(
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
- import_logger3.logger.error(
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
- import_logger3.logger.info(
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
- import_logger3.logger.error(
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
- import_logger3.logger.error(
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
- import_logger3.logger.info(
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
- import_logger3.logger.info(
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
- import_logger3.logger.info(
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
- import_logger3.logger.info(
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
- import_logger3.logger.error(
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
- import_logger3.logger.info(
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
- import_logger3.logger.error(
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 import_logger4 = require("@tradejs/infra/logger");
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
- import_logger4.logger.error(
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
- import_logger4.logger.info(
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
- import_logger4.logger.info(
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
- import_logger4.logger.error(
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
- import_logger4.logger.error("tg sendPhoto request failed: %s", reason);
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
- import_logger4.logger.error("tg sendPhoto failed: %s", JSON.stringify(data));
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
- import_logger4.logger.info("tg sendPhoto: sent");
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
- import_logger4.logger.info(
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
- import_logger5.logger.info(import_chalk.default.yellow("clean:", dir));
2620
- import_logger5.logger.info("");
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
- import_logger5.logger.info(import_chalk.default.yellow("clean:", dir));
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
- import_logger5.logger.info("");
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
- import_logger5.logger.info(import_chalk.default.yellow("clean:", area));
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
- import_logger5.logger.error(
2686
+ import_logger4.logger.error(
2670
2687
  "Redis write is blocked by MISCONF (RDB save failure). Cleanup stopped early."
2671
2688
  );
2672
- import_logger5.logger.error(
2689
+ import_logger4.logger.error(
2673
2690
  "Check Redis logs and fix persistence/memory pressure before retry."
2674
2691
  );
2675
- import_logger5.logger.info("");
2692
+ import_logger4.logger.info("");
2676
2693
  return;
2677
2694
  }
2678
2695
  throw e;
2679
2696
  }
2680
- import_logger5.logger.info("");
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
- import_logger5.logger.info(
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
- import_logger5.logger.info(
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
- import_logger5.logger.info("");
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
- import_logger5.logger.info(
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
- import_logger5.logger.error("Failed loading: %s", symbol);
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
- import_logger5.logger.info("");
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
- import_logger5.logger.info("chunk: %d / %d", currentChunk, chunksCount);
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
- import_logger5.logger.info(import_chalk.default.yellow("screenshots:", `${interval}m`, signals.length));
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
- import_logger5.logger.error(
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
- import_logger5.logger.info("");
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
- import_logger5.logger.info(import_chalk.default.yellow("AI:", signals.length));
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
- import_logger5.logger.error("Failed ask: %s", signal.symbol);
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
- import_logger5.logger.info("");
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
- import_logger5.logger.info(import_chalk.default.yellow("close messages:", events.length));
2889
+ import_logger4.logger.info(import_chalk.default.yellow("close messages:", events.length));
2873
2890
  if (!events.length) {
2874
- import_logger5.logger.info("");
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
- import_logger5.logger.error(
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
- import_logger5.logger.info("");
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
- import_logger5.logger.info(import_chalk.default.yellow("messages:", deliverableSignals.length));
2947
+ import_logger4.logger.info(import_chalk.default.yellow("messages:", deliverableSignals.length));
2931
2948
  if (!deliverableSignals.length) {
2932
- import_logger5.logger.info("");
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
- import_logger5.logger.error(
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
- import_logger5.logger.error(
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
- import_logger5.logger.info("");
3018
+ import_logger4.logger.info("");
3002
3019
  };
3003
3020
  // Annotate the CommonJS export names for ESM import in node:
3004
3021
  0 && (module.exports = {
package/dist/cli.mjs CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  askAI,
8
8
  ensureStrategyPluginsLoaded
9
- } from "./chunk-C3KRBNUR.mjs";
9
+ } from "./chunk-IKRSNRP6.mjs";
10
10
  import {
11
11
  getTradejsProjectCwd,
12
12
  loadTradejsConfig