@tradejs/cli 2.0.18 → 2.0.20

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.
Files changed (56) hide show
  1. package/dist/cli.js +14522 -15704
  2. package/dist/lib/aiExport.js +15 -1608
  3. package/dist/lib/aiPocketSearch.js +499 -67
  4. package/dist/lib/aiPocketSearchCli.js +113 -0
  5. package/dist/lib/aiTrainCharts.js +14 -1
  6. package/dist/lib/aiTrainMetrics.js +4 -1
  7. package/dist/lib/aiTrainResearch.js +88 -54
  8. package/dist/lib/binanceMarketContextBackfill.js +7 -6
  9. package/dist/lib/coinMarketCapContextBackfill.js +19 -18
  10. package/dist/lib/coreResearch.js +2738 -0
  11. package/dist/lib/derivativesContextBackfill.js +10 -9
  12. package/dist/lib/executionCalibration.js +6 -3
  13. package/dist/lib/hyperliquidWhaleBackfill.js +8 -8
  14. package/dist/lib/hyperliquidWhaleStream.js +4 -4
  15. package/dist/lib/marketContextPrepare.js +83 -1686
  16. package/dist/lib/runEnvironment.js +14 -1666
  17. package/dist/lib/runFormatting.js +1 -1607
  18. package/dist/lib/runtimeDebugEvidence.js +2 -48
  19. package/dist/lib/runtimeLineage.js +81 -48
  20. package/dist/lib/runtimeRedis.js +6 -57
  21. package/dist/lib/runtimeScorecard.js +153 -10
  22. package/dist/lib/runtimeStrategyBacktest.js +2 -48
  23. package/dist/lib/strategyGateFingerprint.js +80 -0
  24. package/dist/lib/strategyRelease.js +1365 -0
  25. package/dist/scripts/aiExport.js +17 -1610
  26. package/dist/scripts/aiPocketSearch.js +1070 -1770
  27. package/dist/scripts/aiTrain.js +108 -1688
  28. package/dist/scripts/backtest.js +120 -1760
  29. package/dist/scripts/binanceMarketIngest.js +5 -4
  30. package/dist/scripts/candlesMigrateProvider.js +6 -5186
  31. package/dist/scripts/cleanupMarketContext.js +4 -3
  32. package/dist/scripts/continuity.js +4 -3
  33. package/dist/scripts/coreResearch.js +2830 -0
  34. package/dist/scripts/derivativesIngest.js +6 -4
  35. package/dist/scripts/derivativesIngestCoinalyzeAll.js +5 -4
  36. package/dist/scripts/doctor.js +2 -5184
  37. package/dist/scripts/executionCalibration.js +6 -3
  38. package/dist/scripts/hyperliquidWhaleBackfill.js +8 -8
  39. package/dist/scripts/hyperliquidWhaleIngest.js +4 -4
  40. package/dist/scripts/hyperliquidWhalesUpdate.js +1 -1
  41. package/dist/scripts/migration.js +3 -3
  42. package/dist/scripts/mlExport.js +1 -1607
  43. package/dist/scripts/replay.js +239 -1855
  44. package/dist/scripts/replayRunner.js +239 -1855
  45. package/dist/scripts/replayRuntimeEvidence.js +29 -62
  46. package/dist/scripts/researchAuto.js +3 -49
  47. package/dist/scripts/results.js +1 -1607
  48. package/dist/scripts/runtimeEvidence.js +18 -56
  49. package/dist/scripts/runtimeParity.js +121 -1746
  50. package/dist/scripts/runtimeScorecard.js +883 -29
  51. package/dist/scripts/signals.js +1178 -2724
  52. package/dist/scripts/signalsDaemon.js +1183 -2696
  53. package/dist/scripts/signalsSummary.js +4 -26
  54. package/dist/scripts/strategyRelease.js +1469 -0
  55. package/dist/workers/testerWorker.js +2 -2
  56. package/package.json +13 -9
@@ -31,7 +31,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var replayRuntimeEvidence_exports = {};
32
32
  __export(replayRuntimeEvidence_exports, {
33
33
  main: () => main,
34
- replayRuntimeEvidence: () => replayRuntimeEvidence
34
+ replayRuntimeEvidence: () => replayRuntimeEvidence,
35
+ summarizeReplayComparison: () => summarizeReplayComparison
35
36
  });
36
37
  module.exports = __toCommonJS(replayRuntimeEvidence_exports);
37
38
  var import_promises = __toESM(require("fs/promises"));
@@ -46,17 +47,7 @@ var import_redis3 = require("@tradejs/infra/redis");
46
47
  // src/lib/runtimeRedis.ts
47
48
  var import_redis = require("@tradejs/infra/redis");
48
49
  var import_time = require("@tradejs/core/time");
49
- var RESERVED_STRATEGY_NAMES = /* @__PURE__ */ new Set(["charts"]);
50
- var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
51
- var resolveStrategyConfigIdentityByKey = (userName, key) => {
52
- const parts = key.split(":");
53
- if (parts.length !== 5) return null;
54
- const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
55
- if (users !== "users" || keyUserName !== userName || strategiesKey !== "strategies" || !strategyName || !configId || RESERVED_STRATEGY_NAMES.has(strategyName) || RESERVED_CONFIG_IDS.has(configId) || !/^[a-zA-Z0-9_-]+$/.test(configId)) {
56
- return null;
57
- }
58
- return { strategyName, configId };
59
- };
50
+ var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
60
51
  var isRuntimeTradeRecord = (value) => {
61
52
  if (!value || typeof value !== "object") {
62
53
  return false;
@@ -64,42 +55,6 @@ var isRuntimeTradeRecord = (value) => {
64
55
  const record = value;
65
56
  return typeof record.orderId === "string" && typeof record.strategy === "string" && typeof record.symbol === "string" && typeof record.entryTimestamp === "number" && typeof record.entryPrice === "number" && typeof record.qty === "number" && (record.direction === "LONG" || record.direction === "SHORT");
66
57
  };
67
- var resolveStrategyNameByConfigKey = (userName, key) => {
68
- return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
69
- };
70
- var getRuntimeStrategyConfigKeys = async (userName) => {
71
- const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
72
- return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
73
- };
74
- var loadRuntimeStrategyConfigs = async (userName, {
75
- onInvalidConfig
76
- } = {}) => {
77
- const configKeys = await getRuntimeStrategyConfigKeys(userName);
78
- const strategyConfigs = await Promise.all(
79
- configKeys.map(async (key) => {
80
- const strategyName = resolveStrategyNameByConfigKey(userName, key);
81
- const identity = resolveStrategyConfigIdentityByKey(userName, key);
82
- if (!strategyName || !identity) {
83
- return null;
84
- }
85
- const strategyConfig = await (0, import_redis.getData)(
86
- key,
87
- null
88
- );
89
- if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
90
- onInvalidConfig?.(key);
91
- return null;
92
- }
93
- return {
94
- key,
95
- strategyName,
96
- configId: identity.configId,
97
- strategyConfig
98
- };
99
- })
100
- );
101
- return strategyConfigs.filter(Boolean);
102
- };
103
58
  var loadRuntimeTrades = async (userName, {
104
59
  startTime,
105
60
  endTime
@@ -350,7 +305,7 @@ var collectRuntimeDebugEvidence = async ({
350
305
  loadRuntimeSignals(userName, { startTime, endTime }),
351
306
  loadRuntimeSignalEvaluations(userName, { startTime, endTime }),
352
307
  loadRuntimeSignalEvaluationStatsBuckets(userName),
353
- loadRuntimeStrategyConfigs(userName)
308
+ (0, import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs)(userName)
354
309
  ]);
355
310
  const tradesByOrderId = new Map(
356
311
  entryTrades.map((trade) => [trade.orderId, trade])
@@ -459,8 +414,6 @@ import_args.default.option(
459
414
  "Output JSON path",
460
415
  "output/replay-runtime-evidence.json"
461
416
  );
462
- var flags = import_args.default.parse(process.argv);
463
- var projectRoot = String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
464
417
  var toEpochMs = (value) => {
465
418
  if (value == null || value === "") {
466
419
  return null;
@@ -473,7 +426,7 @@ var toEpochMs = (value) => {
473
426
  const parsed = Date.parse(raw);
474
427
  return Number.isFinite(parsed) ? parsed : null;
475
428
  };
476
- var resolveWindow = () => {
429
+ var resolveWindow = (flags) => {
477
430
  const endTime = toEpochMs(flags.endTime) ?? Date.now();
478
431
  const hours = Math.max(
479
432
  1,
@@ -563,9 +516,13 @@ var summarizeReplayComparison = (runtimeComparison, strategies) => {
563
516
  [...matched, ...backtestOnly, ...runtimeOnly].map(resolveItemStrategy).filter((value) => typeof value === "string")
564
517
  )
565
518
  ].sort((left, right) => left.localeCompare(right));
519
+ const comparisonLineage = asRecord(comparison.lineage);
520
+ const replayLineage = asArray(comparisonLineage.replay).filter(
521
+ (entry) => !useFilter || strategySet.has(String(asRecord(entry).strategy ?? ""))
522
+ );
566
523
  return {
567
524
  mode: comparison.mode ?? null,
568
- lineage: comparison.lineage ?? null,
525
+ lineage: comparisonLineage ? { ...comparisonLineage, replay: replayLineage } : null,
569
526
  rows: asArray(comparison.rows).filter(
570
527
  (row) => !useFilter || strategySet.has(String(row.strategyName ?? ""))
571
528
  ),
@@ -671,9 +628,12 @@ var getReplayStrategies = (replayValue) => {
671
628
  var loadRuntimePayload = async ({
672
629
  startTime,
673
630
  endTime,
674
- strategies
631
+ strategies,
632
+ userName,
633
+ runtimeEvidenceFile,
634
+ projectRoot
675
635
  }) => {
676
- const runtimeEvidencePath = typeof flags.runtimeEvidence === "string" && flags.runtimeEvidence.trim() ? import_node_path.default.resolve(projectRoot, flags.runtimeEvidence.trim()) : null;
636
+ const runtimeEvidencePath = typeof runtimeEvidenceFile === "string" && runtimeEvidenceFile.trim() ? import_node_path.default.resolve(projectRoot, runtimeEvidenceFile.trim()) : null;
677
637
  if (runtimeEvidencePath) {
678
638
  const artifact = JSON.parse(
679
639
  await import_promises.default.readFile(runtimeEvidencePath, "utf8")
@@ -685,7 +645,7 @@ var loadRuntimePayload = async ({
685
645
  };
686
646
  }
687
647
  const runtimeEvidence = await collectRuntimeDebugEvidence({
688
- userName: flags.user,
648
+ userName,
689
649
  startTime,
690
650
  endTime,
691
651
  strategies: strategies.length ? strategies : void 0
@@ -694,7 +654,7 @@ var loadRuntimePayload = async ({
694
654
  source: "local-redis",
695
655
  path: null,
696
656
  payload: buildRuntimeEvidenceReportPayload({
697
- userName: flags.user,
657
+ userName,
698
658
  startTime,
699
659
  endTime,
700
660
  signals: runtimeEvidence.signals,
@@ -706,9 +666,12 @@ var loadRuntimePayload = async ({
706
666
  };
707
667
  };
708
668
  var replayRuntimeEvidence = async () => {
709
- const { startTime, endTime, source } = resolveWindow();
669
+ const flags = import_args.default.parse(process.argv);
670
+ const projectRoot = String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
671
+ const userName = String(flags.user ?? "root");
672
+ const { startTime, endTime, source } = resolveWindow(flags);
710
673
  const replay = await loadReplayResult({
711
- userName: flags.user,
674
+ userName,
712
675
  replayKey: typeof flags.replayKey === "string" && flags.replayKey.trim() ? flags.replayKey.trim() : void 0
713
676
  });
714
677
  const explicitStrategies = parseStrategyFilter(flags.strategy);
@@ -716,13 +679,16 @@ var replayRuntimeEvidence = async () => {
716
679
  const runtime = await loadRuntimePayload({
717
680
  startTime,
718
681
  endTime,
719
- strategies
682
+ strategies,
683
+ userName,
684
+ runtimeEvidenceFile: flags.runtimeEvidence,
685
+ projectRoot
720
686
  });
721
687
  const replayValue = asRecord(replay.value);
722
688
  const artifact = {
723
689
  reportType: "replay-runtime-evidence",
724
690
  generatedAt: Date.now(),
725
- userName: flags.user,
691
+ userName,
726
692
  window: {
727
693
  startTime,
728
694
  endTime,
@@ -774,5 +740,6 @@ var main = replayRuntimeEvidence;
774
740
  // Annotate the CommonJS export names for ESM import in node:
775
741
  0 && (module.exports = {
776
742
  main,
777
- replayRuntimeEvidence
743
+ replayRuntimeEvidence,
744
+ summarizeReplayComparison
778
745
  });
@@ -45,7 +45,7 @@ __export(researchAuto_exports, {
45
45
  parseJsonOutput: () => parseJsonOutput,
46
46
  releaseResearchAutoLock: () => releaseResearchAutoLock,
47
47
  resolveHeapMbFromEnv: () => resolveHeapMbFromEnv,
48
- resolveStrategyNameByConfigKey: () => resolveStrategyNameByConfigKey,
48
+ resolveStrategyNameByConfigKey: () => import_runtimeStrategyConfigs.resolveStrategyNameByConfigKey,
49
49
  resolveTarget: () => resolveTarget,
50
50
  runCliCommand: () => runCliCommand,
51
51
  toStrategyConfigGrid: () => toStrategyConfigGrid,
@@ -67,57 +67,11 @@ var import_strategies = require("@tradejs/strategies");
67
67
  // src/lib/runtimeRedis.ts
68
68
  var import_redis = require("@tradejs/infra/redis");
69
69
  var import_time = require("@tradejs/core/time");
70
- var RESERVED_STRATEGY_NAMES = /* @__PURE__ */ new Set(["charts"]);
71
- var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
72
- var resolveStrategyConfigIdentityByKey = (userName, key) => {
73
- const parts = key.split(":");
74
- if (parts.length !== 5) return null;
75
- const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
76
- if (users !== "users" || keyUserName !== userName || strategiesKey !== "strategies" || !strategyName || !configId || RESERVED_STRATEGY_NAMES.has(strategyName) || RESERVED_CONFIG_IDS.has(configId) || !/^[a-zA-Z0-9_-]+$/.test(configId)) {
77
- return null;
78
- }
79
- return { strategyName, configId };
80
- };
70
+ var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
81
71
  var isRuntimeStrategyEnabled = (strategyConfig) => {
82
72
  const enabled = strategyConfig.ENABLE;
83
73
  return enabled !== false;
84
74
  };
85
- var resolveStrategyNameByConfigKey = (userName, key) => {
86
- return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
87
- };
88
- var getRuntimeStrategyConfigKeys = async (userName) => {
89
- const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
90
- return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
91
- };
92
- var loadRuntimeStrategyConfigs = async (userName, {
93
- onInvalidConfig
94
- } = {}) => {
95
- const configKeys = await getRuntimeStrategyConfigKeys(userName);
96
- const strategyConfigs = await Promise.all(
97
- configKeys.map(async (key) => {
98
- const strategyName = resolveStrategyNameByConfigKey(userName, key);
99
- const identity = resolveStrategyConfigIdentityByKey(userName, key);
100
- if (!strategyName || !identity) {
101
- return null;
102
- }
103
- const strategyConfig = await (0, import_redis.getData)(
104
- key,
105
- null
106
- );
107
- if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
108
- onInvalidConfig?.(key);
109
- return null;
110
- }
111
- return {
112
- key,
113
- strategyName,
114
- configId: identity.configId,
115
- strategyConfig
116
- };
117
- })
118
- );
119
- return strategyConfigs.filter(Boolean);
120
- };
121
75
 
122
76
  // src/lib/runtimeStrategyBacktest.ts
123
77
  var import_chalk = __toESM(require("chalk"));
@@ -413,7 +367,7 @@ var listMergedFiles = async (outDir, strategyName) => {
413
367
  };
414
368
  var getBacktestResultsPrefix = (userName, config) => `users:${userName}:backtests:results:${config}:`;
415
369
  var listRuntimeStrategyNames = async (userName) => {
416
- const strategyConfigs = await loadRuntimeStrategyConfigs(userName);
370
+ const strategyConfigs = await (0, import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs)(userName);
417
371
  return strategyConfigs.filter(({ strategyConfig }) => isRuntimeStrategyEnabled(strategyConfig)).map(({ strategyName }) => strategyName).sort((left, right) => left.localeCompare(right));
418
372
  };
419
373
  var toStrategyConfigGrid = (strategyConfig) => {