@tradejs/cli 2.0.17 → 2.0.19

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 (42) hide show
  1. package/dist/cli.js +6122 -12724
  2. package/dist/lib/aiExport.js +1 -1607
  3. package/dist/lib/binanceMarketContextBackfill.js +7 -6
  4. package/dist/lib/coinMarketCapContextBackfill.js +19 -18
  5. package/dist/lib/derivativesContextBackfill.js +10 -9
  6. package/dist/lib/hyperliquidWhaleBackfill.js +8 -8
  7. package/dist/lib/hyperliquidWhaleStream.js +4 -4
  8. package/dist/lib/marketContextPrepare.js +83 -1686
  9. package/dist/lib/runEnvironment.js +14 -1666
  10. package/dist/lib/runFormatting.js +1 -1607
  11. package/dist/lib/runtimeDebugEvidence.js +2 -48
  12. package/dist/lib/runtimeEvidenceArtifacts.js +13 -1
  13. package/dist/lib/runtimeRedis.js +6 -57
  14. package/dist/lib/runtimeStrategyBacktest.js +2 -48
  15. package/dist/scripts/aiExport.js +1 -1607
  16. package/dist/scripts/aiPocketSearch.js +1 -1607
  17. package/dist/scripts/aiTrain.js +17 -1623
  18. package/dist/scripts/backtest.js +110 -1759
  19. package/dist/scripts/binanceMarketIngest.js +5 -4
  20. package/dist/scripts/candlesMigrateProvider.js +6 -5186
  21. package/dist/scripts/cleanupMarketContext.js +4 -3
  22. package/dist/scripts/continuity.js +4 -3
  23. package/dist/scripts/derivativesIngest.js +6 -4
  24. package/dist/scripts/derivativesIngestCoinalyzeAll.js +5 -4
  25. package/dist/scripts/doctor.js +2 -5184
  26. package/dist/scripts/hyperliquidWhaleBackfill.js +8 -8
  27. package/dist/scripts/hyperliquidWhaleIngest.js +4 -4
  28. package/dist/scripts/hyperliquidWhalesUpdate.js +1 -1
  29. package/dist/scripts/migration.js +3 -3
  30. package/dist/scripts/mlExport.js +1 -1607
  31. package/dist/scripts/replay.js +291 -1807
  32. package/dist/scripts/replayRunner.js +291 -1807
  33. package/dist/scripts/replayRuntimeEvidence.js +2 -48
  34. package/dist/scripts/researchAuto.js +3 -49
  35. package/dist/scripts/results.js +1 -1607
  36. package/dist/scripts/runtimeEvidence.js +15 -49
  37. package/dist/scripts/runtimeParity.js +121 -1746
  38. package/dist/scripts/signals.js +1057 -2647
  39. package/dist/scripts/signalsDaemon.js +1051 -2608
  40. package/dist/scripts/signalsSummary.js +4 -26
  41. package/dist/workers/testerWorker.js +2 -2
  42. package/package.json +11 -9
@@ -5,13 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __commonJS = (cb, mod) => function __require() {
9
- try {
10
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
11
- } catch (e) {
12
- throw mod = 0, e;
13
- }
14
- };
15
8
  var __export = (target, all) => {
16
9
  for (var name in all)
17
10
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -34,1605 +27,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
34
27
  ));
35
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
36
29
 
37
- // ../../node_modules/ms/index.js
38
- var require_ms = __commonJS({
39
- "../../node_modules/ms/index.js"(exports2, module2) {
40
- "use strict";
41
- var s = 1e3;
42
- var m = s * 60;
43
- var h = m * 60;
44
- var d = h * 24;
45
- var w = d * 7;
46
- var y = d * 365.25;
47
- module2.exports = function(val, options) {
48
- options = options || {};
49
- var type = typeof val;
50
- if (type === "string" && val.length > 0) {
51
- return parse(val);
52
- } else if (type === "number" && isFinite(val)) {
53
- return options.long ? fmtLong(val) : fmtShort(val);
54
- }
55
- throw new Error(
56
- "val is not a non-empty string or a valid number. val=" + JSON.stringify(val)
57
- );
58
- };
59
- function parse(str) {
60
- str = String(str);
61
- if (str.length > 100) {
62
- return;
63
- }
64
- var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
65
- str
66
- );
67
- if (!match) {
68
- return;
69
- }
70
- var n = parseFloat(match[1]);
71
- var type = (match[2] || "ms").toLowerCase();
72
- switch (type) {
73
- case "years":
74
- case "year":
75
- case "yrs":
76
- case "yr":
77
- case "y":
78
- return n * y;
79
- case "weeks":
80
- case "week":
81
- case "w":
82
- return n * w;
83
- case "days":
84
- case "day":
85
- case "d":
86
- return n * d;
87
- case "hours":
88
- case "hour":
89
- case "hrs":
90
- case "hr":
91
- case "h":
92
- return n * h;
93
- case "minutes":
94
- case "minute":
95
- case "mins":
96
- case "min":
97
- case "m":
98
- return n * m;
99
- case "seconds":
100
- case "second":
101
- case "secs":
102
- case "sec":
103
- case "s":
104
- return n * s;
105
- case "milliseconds":
106
- case "millisecond":
107
- case "msecs":
108
- case "msec":
109
- case "ms":
110
- return n;
111
- default:
112
- return void 0;
113
- }
114
- }
115
- function fmtShort(ms) {
116
- var msAbs = Math.abs(ms);
117
- if (msAbs >= d) {
118
- return Math.round(ms / d) + "d";
119
- }
120
- if (msAbs >= h) {
121
- return Math.round(ms / h) + "h";
122
- }
123
- if (msAbs >= m) {
124
- return Math.round(ms / m) + "m";
125
- }
126
- if (msAbs >= s) {
127
- return Math.round(ms / s) + "s";
128
- }
129
- return ms + "ms";
130
- }
131
- function fmtLong(ms) {
132
- var msAbs = Math.abs(ms);
133
- if (msAbs >= d) {
134
- return plural(ms, msAbs, d, "day");
135
- }
136
- if (msAbs >= h) {
137
- return plural(ms, msAbs, h, "hour");
138
- }
139
- if (msAbs >= m) {
140
- return plural(ms, msAbs, m, "minute");
141
- }
142
- if (msAbs >= s) {
143
- return plural(ms, msAbs, s, "second");
144
- }
145
- return ms + " ms";
146
- }
147
- function plural(ms, msAbs, n, name) {
148
- var isPlural = msAbs >= n * 1.5;
149
- return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
150
- }
151
- }
152
- });
153
-
154
- // ../../node_modules/list-it/node_modules/debug/src/common.js
155
- var require_common = __commonJS({
156
- "../../node_modules/list-it/node_modules/debug/src/common.js"(exports2, module2) {
157
- "use strict";
158
- function setup(env) {
159
- createDebug.debug = createDebug;
160
- createDebug.default = createDebug;
161
- createDebug.coerce = coerce;
162
- createDebug.disable = disable;
163
- createDebug.enable = enable;
164
- createDebug.enabled = enabled;
165
- createDebug.humanize = require_ms();
166
- createDebug.destroy = destroy;
167
- Object.keys(env).forEach((key) => {
168
- createDebug[key] = env[key];
169
- });
170
- createDebug.names = [];
171
- createDebug.skips = [];
172
- createDebug.formatters = {};
173
- function selectColor(namespace) {
174
- let hash = 0;
175
- for (let i = 0; i < namespace.length; i++) {
176
- hash = (hash << 5) - hash + namespace.charCodeAt(i);
177
- hash |= 0;
178
- }
179
- return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
180
- }
181
- createDebug.selectColor = selectColor;
182
- function createDebug(namespace) {
183
- let prevTime;
184
- let enableOverride = null;
185
- let namespacesCache;
186
- let enabledCache;
187
- function debug(...args2) {
188
- if (!debug.enabled) {
189
- return;
190
- }
191
- const self = debug;
192
- const curr = Number(/* @__PURE__ */ new Date());
193
- const ms = curr - (prevTime || curr);
194
- self.diff = ms;
195
- self.prev = prevTime;
196
- self.curr = curr;
197
- prevTime = curr;
198
- args2[0] = createDebug.coerce(args2[0]);
199
- if (typeof args2[0] !== "string") {
200
- args2.unshift("%O");
201
- }
202
- let index = 0;
203
- args2[0] = args2[0].replace(/%([a-zA-Z%])/g, (match, format2) => {
204
- if (match === "%%") {
205
- return "%";
206
- }
207
- index++;
208
- const formatter = createDebug.formatters[format2];
209
- if (typeof formatter === "function") {
210
- const val = args2[index];
211
- match = formatter.call(self, val);
212
- args2.splice(index, 1);
213
- index--;
214
- }
215
- return match;
216
- });
217
- createDebug.formatArgs.call(self, args2);
218
- const logFn = self.log || createDebug.log;
219
- logFn.apply(self, args2);
220
- }
221
- debug.namespace = namespace;
222
- debug.useColors = createDebug.useColors();
223
- debug.color = createDebug.selectColor(namespace);
224
- debug.extend = extend;
225
- debug.destroy = createDebug.destroy;
226
- Object.defineProperty(debug, "enabled", {
227
- enumerable: true,
228
- configurable: false,
229
- get: () => {
230
- if (enableOverride !== null) {
231
- return enableOverride;
232
- }
233
- if (namespacesCache !== createDebug.namespaces) {
234
- namespacesCache = createDebug.namespaces;
235
- enabledCache = createDebug.enabled(namespace);
236
- }
237
- return enabledCache;
238
- },
239
- set: (v) => {
240
- enableOverride = v;
241
- }
242
- });
243
- if (typeof createDebug.init === "function") {
244
- createDebug.init(debug);
245
- }
246
- return debug;
247
- }
248
- function extend(namespace, delimiter) {
249
- const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace);
250
- newDebug.log = this.log;
251
- return newDebug;
252
- }
253
- function enable(namespaces) {
254
- createDebug.save(namespaces);
255
- createDebug.namespaces = namespaces;
256
- createDebug.names = [];
257
- createDebug.skips = [];
258
- const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(/\s+/g, ",").split(",").filter(Boolean);
259
- for (const ns of split) {
260
- if (ns[0] === "-") {
261
- createDebug.skips.push(ns.slice(1));
262
- } else {
263
- createDebug.names.push(ns);
264
- }
265
- }
266
- }
267
- function matchesTemplate(search, template) {
268
- let searchIndex = 0;
269
- let templateIndex = 0;
270
- let starIndex = -1;
271
- let matchIndex = 0;
272
- while (searchIndex < search.length) {
273
- if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === "*")) {
274
- if (template[templateIndex] === "*") {
275
- starIndex = templateIndex;
276
- matchIndex = searchIndex;
277
- templateIndex++;
278
- } else {
279
- searchIndex++;
280
- templateIndex++;
281
- }
282
- } else if (starIndex !== -1) {
283
- templateIndex = starIndex + 1;
284
- matchIndex++;
285
- searchIndex = matchIndex;
286
- } else {
287
- return false;
288
- }
289
- }
290
- while (templateIndex < template.length && template[templateIndex] === "*") {
291
- templateIndex++;
292
- }
293
- return templateIndex === template.length;
294
- }
295
- function disable() {
296
- const namespaces = [
297
- ...createDebug.names,
298
- ...createDebug.skips.map((namespace) => "-" + namespace)
299
- ].join(",");
300
- createDebug.enable("");
301
- return namespaces;
302
- }
303
- function enabled(name) {
304
- for (const skip of createDebug.skips) {
305
- if (matchesTemplate(name, skip)) {
306
- return false;
307
- }
308
- }
309
- for (const ns of createDebug.names) {
310
- if (matchesTemplate(name, ns)) {
311
- return true;
312
- }
313
- }
314
- return false;
315
- }
316
- function coerce(val) {
317
- if (val instanceof Error) {
318
- return val.stack || val.message;
319
- }
320
- return val;
321
- }
322
- function destroy() {
323
- console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
324
- }
325
- createDebug.enable(createDebug.load());
326
- return createDebug;
327
- }
328
- module2.exports = setup;
329
- }
330
- });
331
-
332
- // ../../node_modules/list-it/node_modules/debug/src/browser.js
333
- var require_browser = __commonJS({
334
- "../../node_modules/list-it/node_modules/debug/src/browser.js"(exports2, module2) {
335
- "use strict";
336
- exports2.formatArgs = formatArgs;
337
- exports2.save = save;
338
- exports2.load = load;
339
- exports2.useColors = useColors;
340
- exports2.storage = localstorage();
341
- exports2.destroy = /* @__PURE__ */ (() => {
342
- let warned = false;
343
- return () => {
344
- if (!warned) {
345
- warned = true;
346
- console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
347
- }
348
- };
349
- })();
350
- exports2.colors = [
351
- "#0000CC",
352
- "#0000FF",
353
- "#0033CC",
354
- "#0033FF",
355
- "#0066CC",
356
- "#0066FF",
357
- "#0099CC",
358
- "#0099FF",
359
- "#00CC00",
360
- "#00CC33",
361
- "#00CC66",
362
- "#00CC99",
363
- "#00CCCC",
364
- "#00CCFF",
365
- "#3300CC",
366
- "#3300FF",
367
- "#3333CC",
368
- "#3333FF",
369
- "#3366CC",
370
- "#3366FF",
371
- "#3399CC",
372
- "#3399FF",
373
- "#33CC00",
374
- "#33CC33",
375
- "#33CC66",
376
- "#33CC99",
377
- "#33CCCC",
378
- "#33CCFF",
379
- "#6600CC",
380
- "#6600FF",
381
- "#6633CC",
382
- "#6633FF",
383
- "#66CC00",
384
- "#66CC33",
385
- "#9900CC",
386
- "#9900FF",
387
- "#9933CC",
388
- "#9933FF",
389
- "#99CC00",
390
- "#99CC33",
391
- "#CC0000",
392
- "#CC0033",
393
- "#CC0066",
394
- "#CC0099",
395
- "#CC00CC",
396
- "#CC00FF",
397
- "#CC3300",
398
- "#CC3333",
399
- "#CC3366",
400
- "#CC3399",
401
- "#CC33CC",
402
- "#CC33FF",
403
- "#CC6600",
404
- "#CC6633",
405
- "#CC9900",
406
- "#CC9933",
407
- "#CCCC00",
408
- "#CCCC33",
409
- "#FF0000",
410
- "#FF0033",
411
- "#FF0066",
412
- "#FF0099",
413
- "#FF00CC",
414
- "#FF00FF",
415
- "#FF3300",
416
- "#FF3333",
417
- "#FF3366",
418
- "#FF3399",
419
- "#FF33CC",
420
- "#FF33FF",
421
- "#FF6600",
422
- "#FF6633",
423
- "#FF9900",
424
- "#FF9933",
425
- "#FFCC00",
426
- "#FFCC33"
427
- ];
428
- function useColors() {
429
- if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) {
430
- return true;
431
- }
432
- if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
433
- return false;
434
- }
435
- let m;
436
- return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
437
- typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
438
- // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
439
- typeof navigator !== "undefined" && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
440
- typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
441
- }
442
- function formatArgs(args2) {
443
- args2[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args2[0] + (this.useColors ? "%c " : " ") + "+" + module2.exports.humanize(this.diff);
444
- if (!this.useColors) {
445
- return;
446
- }
447
- const c = "color: " + this.color;
448
- args2.splice(1, 0, c, "color: inherit");
449
- let index = 0;
450
- let lastC = 0;
451
- args2[0].replace(/%[a-zA-Z%]/g, (match) => {
452
- if (match === "%%") {
453
- return;
454
- }
455
- index++;
456
- if (match === "%c") {
457
- lastC = index;
458
- }
459
- });
460
- args2.splice(lastC, 0, c);
461
- }
462
- exports2.log = console.debug || console.log || (() => {
463
- });
464
- function save(namespaces) {
465
- try {
466
- if (namespaces) {
467
- exports2.storage.setItem("debug", namespaces);
468
- } else {
469
- exports2.storage.removeItem("debug");
470
- }
471
- } catch (error) {
472
- }
473
- }
474
- function load() {
475
- let r;
476
- try {
477
- r = exports2.storage.getItem("debug") || exports2.storage.getItem("DEBUG");
478
- } catch (error) {
479
- }
480
- if (!r && typeof process !== "undefined" && "env" in process) {
481
- r = process.env.DEBUG;
482
- }
483
- return r;
484
- }
485
- function localstorage() {
486
- try {
487
- return localStorage;
488
- } catch (error) {
489
- }
490
- }
491
- module2.exports = require_common()(exports2);
492
- var { formatters } = module2.exports;
493
- formatters.j = function(v) {
494
- try {
495
- return JSON.stringify(v);
496
- } catch (error) {
497
- return "[UnexpectedJSONParseError]: " + error.message;
498
- }
499
- };
500
- }
501
- });
502
-
503
- // ../../node_modules/has-flag/index.js
504
- var require_has_flag = __commonJS({
505
- "../../node_modules/has-flag/index.js"(exports2, module2) {
506
- "use strict";
507
- module2.exports = (flag, argv = process.argv) => {
508
- const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--";
509
- const position = argv.indexOf(prefix + flag);
510
- const terminatorPosition = argv.indexOf("--");
511
- return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
512
- };
513
- }
514
- });
515
-
516
- // ../../node_modules/supports-color/index.js
517
- var require_supports_color = __commonJS({
518
- "../../node_modules/supports-color/index.js"(exports2, module2) {
519
- "use strict";
520
- var os = require("os");
521
- var tty = require("tty");
522
- var hasFlag = require_has_flag();
523
- var { env } = process;
524
- var forceColor;
525
- if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) {
526
- forceColor = 0;
527
- } else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) {
528
- forceColor = 1;
529
- }
530
- if ("FORCE_COLOR" in env) {
531
- if (env.FORCE_COLOR === "true") {
532
- forceColor = 1;
533
- } else if (env.FORCE_COLOR === "false") {
534
- forceColor = 0;
535
- } else {
536
- forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);
537
- }
538
- }
539
- function translateLevel(level) {
540
- if (level === 0) {
541
- return false;
542
- }
543
- return {
544
- level,
545
- hasBasic: true,
546
- has256: level >= 2,
547
- has16m: level >= 3
548
- };
549
- }
550
- function supportsColor(haveStream, streamIsTTY) {
551
- if (forceColor === 0) {
552
- return 0;
553
- }
554
- if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) {
555
- return 3;
556
- }
557
- if (hasFlag("color=256")) {
558
- return 2;
559
- }
560
- if (haveStream && !streamIsTTY && forceColor === void 0) {
561
- return 0;
562
- }
563
- const min = forceColor || 0;
564
- if (env.TERM === "dumb") {
565
- return min;
566
- }
567
- if (process.platform === "win32") {
568
- const osRelease = os.release().split(".");
569
- if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
570
- return Number(osRelease[2]) >= 14931 ? 3 : 2;
571
- }
572
- return 1;
573
- }
574
- if ("CI" in env) {
575
- if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((sign) => sign in env) || env.CI_NAME === "codeship") {
576
- return 1;
577
- }
578
- return min;
579
- }
580
- if ("TEAMCITY_VERSION" in env) {
581
- return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
582
- }
583
- if (env.COLORTERM === "truecolor") {
584
- return 3;
585
- }
586
- if ("TERM_PROGRAM" in env) {
587
- const version = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
588
- switch (env.TERM_PROGRAM) {
589
- case "iTerm.app":
590
- return version >= 3 ? 3 : 2;
591
- case "Apple_Terminal":
592
- return 2;
593
- }
594
- }
595
- if (/-256(color)?$/i.test(env.TERM)) {
596
- return 2;
597
- }
598
- if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
599
- return 1;
600
- }
601
- if ("COLORTERM" in env) {
602
- return 1;
603
- }
604
- return min;
605
- }
606
- function getSupportLevel(stream) {
607
- const level = supportsColor(stream, stream && stream.isTTY);
608
- return translateLevel(level);
609
- }
610
- module2.exports = {
611
- supportsColor: getSupportLevel,
612
- stdout: translateLevel(supportsColor(true, tty.isatty(1))),
613
- stderr: translateLevel(supportsColor(true, tty.isatty(2)))
614
- };
615
- }
616
- });
617
-
618
- // ../../node_modules/list-it/node_modules/debug/src/node.js
619
- var require_node = __commonJS({
620
- "../../node_modules/list-it/node_modules/debug/src/node.js"(exports2, module2) {
621
- "use strict";
622
- var tty = require("tty");
623
- var util = require("util");
624
- exports2.init = init;
625
- exports2.log = log;
626
- exports2.formatArgs = formatArgs;
627
- exports2.save = save;
628
- exports2.load = load;
629
- exports2.useColors = useColors;
630
- exports2.destroy = util.deprecate(
631
- () => {
632
- },
633
- "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."
634
- );
635
- exports2.colors = [6, 2, 3, 4, 5, 1];
636
- try {
637
- const supportsColor = require_supports_color();
638
- if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
639
- exports2.colors = [
640
- 20,
641
- 21,
642
- 26,
643
- 27,
644
- 32,
645
- 33,
646
- 38,
647
- 39,
648
- 40,
649
- 41,
650
- 42,
651
- 43,
652
- 44,
653
- 45,
654
- 56,
655
- 57,
656
- 62,
657
- 63,
658
- 68,
659
- 69,
660
- 74,
661
- 75,
662
- 76,
663
- 77,
664
- 78,
665
- 79,
666
- 80,
667
- 81,
668
- 92,
669
- 93,
670
- 98,
671
- 99,
672
- 112,
673
- 113,
674
- 128,
675
- 129,
676
- 134,
677
- 135,
678
- 148,
679
- 149,
680
- 160,
681
- 161,
682
- 162,
683
- 163,
684
- 164,
685
- 165,
686
- 166,
687
- 167,
688
- 168,
689
- 169,
690
- 170,
691
- 171,
692
- 172,
693
- 173,
694
- 178,
695
- 179,
696
- 184,
697
- 185,
698
- 196,
699
- 197,
700
- 198,
701
- 199,
702
- 200,
703
- 201,
704
- 202,
705
- 203,
706
- 204,
707
- 205,
708
- 206,
709
- 207,
710
- 208,
711
- 209,
712
- 214,
713
- 215,
714
- 220,
715
- 221
716
- ];
717
- }
718
- } catch (error) {
719
- }
720
- exports2.inspectOpts = Object.keys(process.env).filter((key) => {
721
- return /^debug_/i.test(key);
722
- }).reduce((obj, key) => {
723
- const prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, (_, k) => {
724
- return k.toUpperCase();
725
- });
726
- let val = process.env[key];
727
- if (/^(yes|on|true|enabled)$/i.test(val)) {
728
- val = true;
729
- } else if (/^(no|off|false|disabled)$/i.test(val)) {
730
- val = false;
731
- } else if (val === "null") {
732
- val = null;
733
- } else {
734
- val = Number(val);
735
- }
736
- obj[prop] = val;
737
- return obj;
738
- }, {});
739
- function useColors() {
740
- return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty.isatty(process.stderr.fd);
741
- }
742
- function formatArgs(args2) {
743
- const { namespace: name, useColors: useColors2 } = this;
744
- if (useColors2) {
745
- const c = this.color;
746
- const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c);
747
- const prefix = ` ${colorCode};1m${name} \x1B[0m`;
748
- args2[0] = prefix + args2[0].split("\n").join("\n" + prefix);
749
- args2.push(colorCode + "m+" + module2.exports.humanize(this.diff) + "\x1B[0m");
750
- } else {
751
- args2[0] = getDate() + name + " " + args2[0];
752
- }
753
- }
754
- function getDate() {
755
- if (exports2.inspectOpts.hideDate) {
756
- return "";
757
- }
758
- return (/* @__PURE__ */ new Date()).toISOString() + " ";
759
- }
760
- function log(...args2) {
761
- return process.stderr.write(util.formatWithOptions(exports2.inspectOpts, ...args2) + "\n");
762
- }
763
- function save(namespaces) {
764
- if (namespaces) {
765
- process.env.DEBUG = namespaces;
766
- } else {
767
- delete process.env.DEBUG;
768
- }
769
- }
770
- function load() {
771
- return process.env.DEBUG;
772
- }
773
- function init(debug) {
774
- debug.inspectOpts = {};
775
- const keys = Object.keys(exports2.inspectOpts);
776
- for (let i = 0; i < keys.length; i++) {
777
- debug.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]];
778
- }
779
- }
780
- module2.exports = require_common()(exports2);
781
- var { formatters } = module2.exports;
782
- formatters.o = function(v) {
783
- this.inspectOpts.colors = this.useColors;
784
- return util.inspect(v, this.inspectOpts).split("\n").map((str) => str.trim()).join(" ");
785
- };
786
- formatters.O = function(v) {
787
- this.inspectOpts.colors = this.useColors;
788
- return util.inspect(v, this.inspectOpts);
789
- };
790
- }
791
- });
792
-
793
- // ../../node_modules/list-it/node_modules/debug/src/index.js
794
- var require_src = __commonJS({
795
- "../../node_modules/list-it/node_modules/debug/src/index.js"(exports2, module2) {
796
- "use strict";
797
- if (typeof process === "undefined" || process.type === "renderer" || process.browser === true || process.__nwjs) {
798
- module2.exports = require_browser();
799
- } else {
800
- module2.exports = require_node();
801
- }
802
- }
803
- });
804
-
805
- // ../../node_modules/eastasianwidth/eastasianwidth.js
806
- var require_eastasianwidth = __commonJS({
807
- "../../node_modules/eastasianwidth/eastasianwidth.js"(exports2, module2) {
808
- "use strict";
809
- var eaw = {};
810
- if ("undefined" == typeof module2) {
811
- window.eastasianwidth = eaw;
812
- } else {
813
- module2.exports = eaw;
814
- }
815
- eaw.eastAsianWidth = function(character) {
816
- var x = character.charCodeAt(0);
817
- var y = character.length == 2 ? character.charCodeAt(1) : 0;
818
- var codePoint = x;
819
- if (55296 <= x && x <= 56319 && (56320 <= y && y <= 57343)) {
820
- x &= 1023;
821
- y &= 1023;
822
- codePoint = x << 10 | y;
823
- codePoint += 65536;
824
- }
825
- if (12288 == codePoint || 65281 <= codePoint && codePoint <= 65376 || 65504 <= codePoint && codePoint <= 65510) {
826
- return "F";
827
- }
828
- if (8361 == codePoint || 65377 <= codePoint && codePoint <= 65470 || 65474 <= codePoint && codePoint <= 65479 || 65482 <= codePoint && codePoint <= 65487 || 65490 <= codePoint && codePoint <= 65495 || 65498 <= codePoint && codePoint <= 65500 || 65512 <= codePoint && codePoint <= 65518) {
829
- return "H";
830
- }
831
- if (4352 <= codePoint && codePoint <= 4447 || 4515 <= codePoint && codePoint <= 4519 || 4602 <= codePoint && codePoint <= 4607 || 9001 <= codePoint && codePoint <= 9002 || 11904 <= codePoint && codePoint <= 11929 || 11931 <= codePoint && codePoint <= 12019 || 12032 <= codePoint && codePoint <= 12245 || 12272 <= codePoint && codePoint <= 12283 || 12289 <= codePoint && codePoint <= 12350 || 12353 <= codePoint && codePoint <= 12438 || 12441 <= codePoint && codePoint <= 12543 || 12549 <= codePoint && codePoint <= 12589 || 12593 <= codePoint && codePoint <= 12686 || 12688 <= codePoint && codePoint <= 12730 || 12736 <= codePoint && codePoint <= 12771 || 12784 <= codePoint && codePoint <= 12830 || 12832 <= codePoint && codePoint <= 12871 || 12880 <= codePoint && codePoint <= 13054 || 13056 <= codePoint && codePoint <= 19903 || 19968 <= codePoint && codePoint <= 42124 || 42128 <= codePoint && codePoint <= 42182 || 43360 <= codePoint && codePoint <= 43388 || 44032 <= codePoint && codePoint <= 55203 || 55216 <= codePoint && codePoint <= 55238 || 55243 <= codePoint && codePoint <= 55291 || 63744 <= codePoint && codePoint <= 64255 || 65040 <= codePoint && codePoint <= 65049 || 65072 <= codePoint && codePoint <= 65106 || 65108 <= codePoint && codePoint <= 65126 || 65128 <= codePoint && codePoint <= 65131 || 110592 <= codePoint && codePoint <= 110593 || 127488 <= codePoint && codePoint <= 127490 || 127504 <= codePoint && codePoint <= 127546 || 127552 <= codePoint && codePoint <= 127560 || 127568 <= codePoint && codePoint <= 127569 || 131072 <= codePoint && codePoint <= 194367 || 177984 <= codePoint && codePoint <= 196605 || 196608 <= codePoint && codePoint <= 262141) {
832
- return "W";
833
- }
834
- if (32 <= codePoint && codePoint <= 126 || 162 <= codePoint && codePoint <= 163 || 165 <= codePoint && codePoint <= 166 || 172 == codePoint || 175 == codePoint || 10214 <= codePoint && codePoint <= 10221 || 10629 <= codePoint && codePoint <= 10630) {
835
- return "Na";
836
- }
837
- if (161 == codePoint || 164 == codePoint || 167 <= codePoint && codePoint <= 168 || 170 == codePoint || 173 <= codePoint && codePoint <= 174 || 176 <= codePoint && codePoint <= 180 || 182 <= codePoint && codePoint <= 186 || 188 <= codePoint && codePoint <= 191 || 198 == codePoint || 208 == codePoint || 215 <= codePoint && codePoint <= 216 || 222 <= codePoint && codePoint <= 225 || 230 == codePoint || 232 <= codePoint && codePoint <= 234 || 236 <= codePoint && codePoint <= 237 || 240 == codePoint || 242 <= codePoint && codePoint <= 243 || 247 <= codePoint && codePoint <= 250 || 252 == codePoint || 254 == codePoint || 257 == codePoint || 273 == codePoint || 275 == codePoint || 283 == codePoint || 294 <= codePoint && codePoint <= 295 || 299 == codePoint || 305 <= codePoint && codePoint <= 307 || 312 == codePoint || 319 <= codePoint && codePoint <= 322 || 324 == codePoint || 328 <= codePoint && codePoint <= 331 || 333 == codePoint || 338 <= codePoint && codePoint <= 339 || 358 <= codePoint && codePoint <= 359 || 363 == codePoint || 462 == codePoint || 464 == codePoint || 466 == codePoint || 468 == codePoint || 470 == codePoint || 472 == codePoint || 474 == codePoint || 476 == codePoint || 593 == codePoint || 609 == codePoint || 708 == codePoint || 711 == codePoint || 713 <= codePoint && codePoint <= 715 || 717 == codePoint || 720 == codePoint || 728 <= codePoint && codePoint <= 731 || 733 == codePoint || 735 == codePoint || 768 <= codePoint && codePoint <= 879 || 913 <= codePoint && codePoint <= 929 || 931 <= codePoint && codePoint <= 937 || 945 <= codePoint && codePoint <= 961 || 963 <= codePoint && codePoint <= 969 || 1025 == codePoint || 1040 <= codePoint && codePoint <= 1103 || 1105 == codePoint || 8208 == codePoint || 8211 <= codePoint && codePoint <= 8214 || 8216 <= codePoint && codePoint <= 8217 || 8220 <= codePoint && codePoint <= 8221 || 8224 <= codePoint && codePoint <= 8226 || 8228 <= codePoint && codePoint <= 8231 || 8240 == codePoint || 8242 <= codePoint && codePoint <= 8243 || 8245 == codePoint || 8251 == codePoint || 8254 == codePoint || 8308 == codePoint || 8319 == codePoint || 8321 <= codePoint && codePoint <= 8324 || 8364 == codePoint || 8451 == codePoint || 8453 == codePoint || 8457 == codePoint || 8467 == codePoint || 8470 == codePoint || 8481 <= codePoint && codePoint <= 8482 || 8486 == codePoint || 8491 == codePoint || 8531 <= codePoint && codePoint <= 8532 || 8539 <= codePoint && codePoint <= 8542 || 8544 <= codePoint && codePoint <= 8555 || 8560 <= codePoint && codePoint <= 8569 || 8585 == codePoint || 8592 <= codePoint && codePoint <= 8601 || 8632 <= codePoint && codePoint <= 8633 || 8658 == codePoint || 8660 == codePoint || 8679 == codePoint || 8704 == codePoint || 8706 <= codePoint && codePoint <= 8707 || 8711 <= codePoint && codePoint <= 8712 || 8715 == codePoint || 8719 == codePoint || 8721 == codePoint || 8725 == codePoint || 8730 == codePoint || 8733 <= codePoint && codePoint <= 8736 || 8739 == codePoint || 8741 == codePoint || 8743 <= codePoint && codePoint <= 8748 || 8750 == codePoint || 8756 <= codePoint && codePoint <= 8759 || 8764 <= codePoint && codePoint <= 8765 || 8776 == codePoint || 8780 == codePoint || 8786 == codePoint || 8800 <= codePoint && codePoint <= 8801 || 8804 <= codePoint && codePoint <= 8807 || 8810 <= codePoint && codePoint <= 8811 || 8814 <= codePoint && codePoint <= 8815 || 8834 <= codePoint && codePoint <= 8835 || 8838 <= codePoint && codePoint <= 8839 || 8853 == codePoint || 8857 == codePoint || 8869 == codePoint || 8895 == codePoint || 8978 == codePoint || 9312 <= codePoint && codePoint <= 9449 || 9451 <= codePoint && codePoint <= 9547 || 9552 <= codePoint && codePoint <= 9587 || 9600 <= codePoint && codePoint <= 9615 || 9618 <= codePoint && codePoint <= 9621 || 9632 <= codePoint && codePoint <= 9633 || 9635 <= codePoint && codePoint <= 9641 || 9650 <= codePoint && codePoint <= 9651 || 9654 <= codePoint && codePoint <= 9655 || 9660 <= codePoint && codePoint <= 9661 || 9664 <= codePoint && codePoint <= 9665 || 9670 <= codePoint && codePoint <= 9672 || 9675 == codePoint || 9678 <= codePoint && codePoint <= 9681 || 9698 <= codePoint && codePoint <= 9701 || 9711 == codePoint || 9733 <= codePoint && codePoint <= 9734 || 9737 == codePoint || 9742 <= codePoint && codePoint <= 9743 || 9748 <= codePoint && codePoint <= 9749 || 9756 == codePoint || 9758 == codePoint || 9792 == codePoint || 9794 == codePoint || 9824 <= codePoint && codePoint <= 9825 || 9827 <= codePoint && codePoint <= 9829 || 9831 <= codePoint && codePoint <= 9834 || 9836 <= codePoint && codePoint <= 9837 || 9839 == codePoint || 9886 <= codePoint && codePoint <= 9887 || 9918 <= codePoint && codePoint <= 9919 || 9924 <= codePoint && codePoint <= 9933 || 9935 <= codePoint && codePoint <= 9953 || 9955 == codePoint || 9960 <= codePoint && codePoint <= 9983 || 10045 == codePoint || 10071 == codePoint || 10102 <= codePoint && codePoint <= 10111 || 11093 <= codePoint && codePoint <= 11097 || 12872 <= codePoint && codePoint <= 12879 || 57344 <= codePoint && codePoint <= 63743 || 65024 <= codePoint && codePoint <= 65039 || 65533 == codePoint || 127232 <= codePoint && codePoint <= 127242 || 127248 <= codePoint && codePoint <= 127277 || 127280 <= codePoint && codePoint <= 127337 || 127344 <= codePoint && codePoint <= 127386 || 917760 <= codePoint && codePoint <= 917999 || 983040 <= codePoint && codePoint <= 1048573 || 1048576 <= codePoint && codePoint <= 1114109) {
838
- return "A";
839
- }
840
- return "N";
841
- };
842
- eaw.characterLength = function(character) {
843
- var code = this.eastAsianWidth(character);
844
- if (code == "F" || code == "W" || code == "A") {
845
- return 2;
846
- } else {
847
- return 1;
848
- }
849
- };
850
- function stringToArray(string) {
851
- return string.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
852
- }
853
- eaw.length = function(string) {
854
- var characters = stringToArray(string);
855
- var len = 0;
856
- for (var i = 0; i < characters.length; i++) {
857
- len = len + this.characterLength(characters[i]);
858
- }
859
- return len;
860
- };
861
- eaw.slice = function(text, start, end) {
862
- textLen = eaw.length(text);
863
- start = start ? start : 0;
864
- end = end ? end : 1;
865
- if (start < 0) {
866
- start = textLen + start;
867
- }
868
- if (end < 0) {
869
- end = textLen + end;
870
- }
871
- var result = "";
872
- var eawLen = 0;
873
- var chars = stringToArray(text);
874
- for (var i = 0; i < chars.length; i++) {
875
- var char = chars[i];
876
- var charLen = eaw.length(char);
877
- if (eawLen >= start - (charLen == 2 ? 1 : 0)) {
878
- if (eawLen + charLen <= end) {
879
- result += char;
880
- } else {
881
- break;
882
- }
883
- }
884
- eawLen += charLen;
885
- }
886
- return result;
887
- };
888
- }
889
- });
890
-
891
- // ../../node_modules/list-it/lib/data-cell.js
892
- var require_data_cell = __commonJS({
893
- "../../node_modules/list-it/lib/data-cell.js"(exports2, module2) {
894
- "use strict";
895
- var eaw = require_eastasianwidth();
896
- function DataCell() {
897
- this.data = "";
898
- }
899
- module2.exports = DataCell;
900
- DataCell.prototype.getData = function() {
901
- return this.data;
902
- };
903
- DataCell.prototype.setData = function(data) {
904
- this.data = data;
905
- };
906
- DataCell.prototype.visibleLength = function() {
907
- if (typeof this.data != "string") {
908
- return ("" + this.data).length;
909
- }
910
- return DataCell.visibleLength(this.data);
911
- };
912
- DataCell.visibleLength = function(data) {
913
- const s = data.replace(/\x1b[^m]*m/g, "");
914
- return eaw.length(s);
915
- };
916
- }
917
- });
918
-
919
- // ../../node_modules/list-it/lib/row.js
920
- var require_row = __commonJS({
921
- "../../node_modules/list-it/lib/row.js"(exports2, module2) {
922
- "use strict";
923
- function Row() {
924
- this.cells = [];
925
- this.empty = true;
926
- this.fixed = false;
927
- }
928
- module2.exports = Row;
929
- Row.prototype.getCellLength = function() {
930
- return this.cells.length;
931
- };
932
- Row.prototype.getCell = function(idx) {
933
- return this.cells[idx];
934
- };
935
- Row.prototype.pushCell = function(cell) {
936
- if (this.isFixed()) {
937
- throw "pushCell Fail, The row was already fixed.";
938
- }
939
- this.empty = false;
940
- return this.cells.push(cell);
941
- };
942
- Row.prototype.fix = function() {
943
- this.fixed = true;
944
- };
945
- Row.prototype.isEmpty = function() {
946
- return this.empty;
947
- };
948
- Row.prototype.isFixed = function() {
949
- return this.fixed;
950
- };
951
- }
952
- });
953
-
954
- // ../../node_modules/list-it/lib/column.js
955
- var require_column = __commonJS({
956
- "../../node_modules/list-it/lib/column.js"(exports2, module2) {
957
- "use strict";
958
- var DataCell = require_data_cell();
959
- function Column() {
960
- this.opt = {
961
- "autoAlign": false
962
- };
963
- this.width = 0;
964
- this.textWidth = null;
965
- this.intLen = 0;
966
- this.fracLen = 0;
967
- this.expLen = 0;
968
- this.cellAtRow = {};
969
- this.header = null;
970
- }
971
- module2.exports = Column;
972
- Column.prototype.getWidth = function() {
973
- return this.width;
974
- };
975
- Column.prototype.setTextWidth = function(textWidth) {
976
- this.textWidth = textWidth;
977
- };
978
- Column.prototype.setCellAt = function(row, cell) {
979
- this.cellAtRow[row] = cell;
980
- };
981
- Column.prototype.setHeader = function(header) {
982
- this.header = header;
983
- };
984
- Column.prototype.hasHeader = function() {
985
- return this.header != null;
986
- };
987
- Column.prototype.updateWidth = function() {
988
- const headerWidth = !this.hasHeader() ? 0 : DataCell.visibleLength("" + this.header);
989
- this.width = headerWidth;
990
- Object.keys(this.cellAtRow).forEach((key) => {
991
- const cell = this.cellAtRow[key];
992
- const data = cell.getData();
993
- let width = cell.visibleLength();
994
- if (typeof data == "number") {
995
- if (this.opt.autoAlign) {
996
- this.updateNumWidth(data);
997
- width = this.getNumMaxWidth();
998
- }
999
- }
1000
- if (width > this.width) {
1001
- this.width = width;
1002
- }
1003
- if (typeof data == "string") {
1004
- if (this.textWidth && this.textWidth > headerWidth) {
1005
- if (this.width > this.textWidth) {
1006
- this.width = this.textWidth;
1007
- }
1008
- }
1009
- }
1010
- });
1011
- };
1012
- Column.prototype.formatColumnHeader = function() {
1013
- if (!this.hasHeader()) {
1014
- return null;
1015
- }
1016
- const width = this.getWidth();
1017
- const header = this.header;
1018
- const headerWidth = DataCell.visibleLength("" + header);
1019
- if (header.length == headerWidth && width - headerWidth <= 0) {
1020
- return ("" + header).substring(0, width);
1021
- }
1022
- return "" + header + " ".repeat(width - headerWidth);
1023
- };
1024
- Column.prototype.formatCell = function(data) {
1025
- const width = this.getWidth();
1026
- if (this.opt.autoAlign) {
1027
- if (typeof data == "number") {
1028
- return this.makeAutoAlignNum(data).padStart(width, " ");
1029
- }
1030
- }
1031
- const dataWidth = DataCell.visibleLength("" + data);
1032
- if (data.length == dataWidth && width - dataWidth <= 0) {
1033
- return ("" + data).substring(0, width);
1034
- }
1035
- return "" + data + " ".repeat(width - dataWidth);
1036
- };
1037
- Column.prototype.setAutoAlign = function(autoAlign) {
1038
- this.opt.autoAlign = autoAlign;
1039
- };
1040
- Column.prototype.updateNumWidth = function(num) {
1041
- const numInfo = this.analyzeNumber(num);
1042
- const intLen = numInfo.intStr.length;
1043
- const fracLen = numInfo.fracStr.length;
1044
- const expLen = numInfo.expStr.length;
1045
- if (intLen > this.intLen) {
1046
- this.intLen = intLen;
1047
- }
1048
- if (fracLen > this.fracLen) {
1049
- this.fracLen = fracLen;
1050
- }
1051
- if (expLen > this.expLen) {
1052
- this.expLen = expLen;
1053
- }
1054
- };
1055
- Column.prototype.getNumMaxWidth = function() {
1056
- return this.intLen + this.fracLen + (this.fracLen > 0 ? 1 : 0) + this.expLen + (this.expLen > 0 ? 1 : 0);
1057
- };
1058
- Column.prototype.makeAutoAlignNum = function(num) {
1059
- const numInfo = this.analyzeNumber(num);
1060
- const intStr = numInfo.intStr.padStart(this.intLen, " ");
1061
- const fracStr = numInfo.expStr != "" ? numInfo.fracStr.padEnd(this.fracLen, "0") : numInfo.fracStr.padEnd(this.fracLen, " ");
1062
- const expStr = numInfo.expStr.padEnd(this.expLen, " ");
1063
- if (numInfo.expStr != "") {
1064
- return [intStr, ".", fracStr, "e", expStr].join("");
1065
- }
1066
- if (numInfo.pointPos >= 0) {
1067
- if (this.expLen > 0) {
1068
- return [intStr, ".", fracStr, " ", expStr].join("");
1069
- }
1070
- return [intStr, ".", fracStr].join("");
1071
- } else if (this.fracLen == 0) {
1072
- return intStr;
1073
- }
1074
- if (this.expLen > 0) {
1075
- return [intStr, ".0", fracStr.substr(1), " ", expStr].join("");
1076
- }
1077
- return [intStr, ".0", fracStr.substr(1)].join("");
1078
- };
1079
- Column.prototype.analyzeNumber = function(num) {
1080
- const s = "" + num;
1081
- let intStr = "";
1082
- let fracStr = "";
1083
- const pointPos = s.indexOf(".");
1084
- const expIndex = s.indexOf("e");
1085
- if (expIndex >= 0) {
1086
- if (pointPos < 0) {
1087
- return {
1088
- pointPos: expIndex,
1089
- intStr: s.substr(0, expIndex),
1090
- fracStr: "0",
1091
- expStr: s.substr(expIndex + 1)
1092
- };
1093
- }
1094
- return {
1095
- pointPos,
1096
- intStr: s.substr(0, pointPos),
1097
- fracStr: s.substring(pointPos + 1, expIndex),
1098
- expStr: s.substr(expIndex + 1)
1099
- };
1100
- }
1101
- if (pointPos < 0) {
1102
- intStr = s;
1103
- } else {
1104
- intStr = s.substr(0, pointPos);
1105
- fracStr = s.substr(pointPos + 1);
1106
- }
1107
- return {
1108
- "pointPos": pointPos,
1109
- "intStr": intStr,
1110
- "fracStr": fracStr,
1111
- "expStr": ""
1112
- };
1113
- };
1114
- }
1115
- });
1116
-
1117
- // ../../node_modules/ansi-escape-sequences/dist/index.cjs
1118
- var require_dist = __commonJS({
1119
- "../../node_modules/ansi-escape-sequences/dist/index.cjs"(exports2, module2) {
1120
- "use strict";
1121
- function isObject(input) {
1122
- return typeof input === "object" && input !== null;
1123
- }
1124
- function isArrayLike(input) {
1125
- return isObject(input) && typeof input.length === "number";
1126
- }
1127
- function arrayify(input) {
1128
- if (Array.isArray(input)) {
1129
- return input;
1130
- } else if (input === void 0) {
1131
- return [];
1132
- } else if (isArrayLike(input) || input instanceof Set) {
1133
- return Array.from(input);
1134
- } else {
1135
- return [input];
1136
- }
1137
- }
1138
- var csi = "\x1B[";
1139
- var ansi = {};
1140
- ansi.style = {
1141
- reset: "\x1B[0m",
1142
- bold: "\x1B[1m",
1143
- italic: "\x1B[3m",
1144
- underline: "\x1B[4m",
1145
- fontDefault: "\x1B[10m",
1146
- font2: "\x1B[11m",
1147
- font3: "\x1B[12m",
1148
- font4: "\x1B[13m",
1149
- font5: "\x1B[14m",
1150
- font6: "\x1B[15m",
1151
- imageNegative: "\x1B[7m",
1152
- imagePositive: "\x1B[27m",
1153
- black: "\x1B[30m",
1154
- red: "\x1B[31m",
1155
- green: "\x1B[32m",
1156
- yellow: "\x1B[33m",
1157
- blue: "\x1B[34m",
1158
- magenta: "\x1B[35m",
1159
- cyan: "\x1B[36m",
1160
- white: "\x1B[37m",
1161
- grey: "\x1B[90m",
1162
- gray: "\x1B[90m",
1163
- brightRed: "\x1B[91m",
1164
- brightGreen: "\x1B[92m",
1165
- brightYellow: "\x1B[93m",
1166
- brightBlue: "\x1B[94m",
1167
- brightMagenta: "\x1B[95m",
1168
- brightCyan: "\x1B[96m",
1169
- brightWhite: "\x1B[97m",
1170
- "bg-black": "\x1B[40m",
1171
- "bg-red": "\x1B[41m",
1172
- "bg-green": "\x1B[42m",
1173
- "bg-yellow": "\x1B[43m",
1174
- "bg-blue": "\x1B[44m",
1175
- "bg-magenta": "\x1B[45m",
1176
- "bg-cyan": "\x1B[46m",
1177
- "bg-white": "\x1B[47m",
1178
- "bg-grey": "\x1B[100m",
1179
- "bg-gray": "\x1B[100m",
1180
- "bg-brightRed": "\x1B[101m",
1181
- "bg-brightGreen": "\x1B[102m",
1182
- "bg-brightYellow": "\x1B[103m",
1183
- "bg-brightBlue": "\x1B[104m",
1184
- "bg-brightMagenta": "\x1B[105m",
1185
- "bg-brightCyan": "\x1B[106m",
1186
- "bg-brightWhite": "\x1B[107m"
1187
- };
1188
- ansi.rgb = function(r, g, b) {
1189
- return `\x1B[38;2;${r};${g};${b}m`;
1190
- };
1191
- ansi.bgRgb = function(r, g, b) {
1192
- return `\x1B[48;2;${r};${g};${b}m`;
1193
- };
1194
- ansi.styles = function(styles) {
1195
- styles = arrayify(styles);
1196
- return styles.map(function(effect) {
1197
- const rgbMatches = effect.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
1198
- const bgRgbMatches = effect.match(/bg-rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
1199
- if (bgRgbMatches) {
1200
- const [full, r, g, b] = bgRgbMatches;
1201
- return ansi.bgRgb(r, g, b);
1202
- } else if (rgbMatches) {
1203
- const [full, r, g, b] = rgbMatches;
1204
- return ansi.rgb(r, g, b);
1205
- } else {
1206
- return ansi.style[effect];
1207
- }
1208
- }).join("");
1209
- };
1210
- ansi.format = function(str, styleArray) {
1211
- const re = /\[([\w\s-\(\),]+)\]{([^]*?)}/;
1212
- let matches;
1213
- str = String(str);
1214
- if (!str) return "";
1215
- while (matches = str.match(re)) {
1216
- const inlineStyles = matches[1].split(/\s+/);
1217
- const inlineString = matches[2];
1218
- str = str.replace(matches[0], ansi.format(inlineString, inlineStyles));
1219
- }
1220
- return styleArray && styleArray.length ? ansi.styles(styleArray) + str + ansi.style.reset : str;
1221
- };
1222
- ansi.cursor = {
1223
- /**
1224
- * Moves the cursor `lines` cells up. If the cursor is already at the edge of the screen, this has no effect
1225
- * @param [lines=1] {number}
1226
- * @return {string}
1227
- */
1228
- up: function(lines) {
1229
- return csi + (lines || 1) + "A";
1230
- },
1231
- /**
1232
- * Moves the cursor `lines` cells down. If the cursor is already at the edge of the screen, this has no effect
1233
- * @param [lines=1] {number}
1234
- * @return {string}
1235
- */
1236
- down: function(lines) {
1237
- return csi + (lines || 1) + "B";
1238
- },
1239
- /**
1240
- * Moves the cursor `lines` cells forward. If the cursor is already at the edge of the screen, this has no effect
1241
- * @param [lines=1] {number}
1242
- * @return {string}
1243
- */
1244
- forward: function(lines) {
1245
- return csi + (lines || 1) + "C";
1246
- },
1247
- /**
1248
- * Moves the cursor `lines` cells back. If the cursor is already at the edge of the screen, this has no effect
1249
- * @param [lines=1] {number}
1250
- * @return {string}
1251
- */
1252
- back: function(lines) {
1253
- return csi + (lines || 1) + "D";
1254
- },
1255
- /**
1256
- * Moves cursor to beginning of the line n lines down.
1257
- * @param [lines=1] {number}
1258
- * @return {string}
1259
- */
1260
- nextLine: function(lines) {
1261
- return csi + (lines || 1) + "E";
1262
- },
1263
- /**
1264
- * Moves cursor to beginning of the line n lines up.
1265
- * @param [lines=1] {number}
1266
- * @return {string}
1267
- */
1268
- previousLine: function(lines) {
1269
- return csi + (lines || 1) + "F";
1270
- },
1271
- /**
1272
- * Moves the cursor to column n.
1273
- * @param n {number} - column number
1274
- * @return {string}
1275
- */
1276
- horizontalAbsolute: function(n) {
1277
- return csi + n + "G";
1278
- },
1279
- /**
1280
- * Moves the cursor to row n, column m. The values are 1-based, and default to 1 (top left corner) if omitted.
1281
- * @param n {number} - row number
1282
- * @param m {number} - column number
1283
- * @return {string}
1284
- */
1285
- position: function(n, m) {
1286
- return csi + (n || 1) + ";" + (m || 1) + "H";
1287
- },
1288
- /**
1289
- * Hides the cursor
1290
- */
1291
- hide: csi + "?25l",
1292
- /**
1293
- * Shows the cursor
1294
- */
1295
- show: csi + "?25h"
1296
- };
1297
- ansi.erase = {
1298
- /**
1299
- * Clears part of the screen. If n is 0 (or missing), clear from cursor to end of screen. If n is 1, clear from cursor to beginning of the screen. If n is 2, clear entire screen.
1300
- * @param n {number}
1301
- * @return {string}
1302
- */
1303
- display: function(n) {
1304
- return csi + (n || 0) + "J";
1305
- },
1306
- /**
1307
- * Erases part of the line. If n is zero (or missing), clear from cursor to the end of the line. If n is one, clear from cursor to beginning of the line. If n is two, clear entire line. Cursor position does not change.
1308
- * @param n {number}
1309
- * @return {string}
1310
- */
1311
- inLine: function(n) {
1312
- return csi + (n || 0) + "K";
1313
- }
1314
- };
1315
- module2.exports = ansi;
1316
- }
1317
- });
1318
-
1319
- // ../../node_modules/list-it/lib/list-it-buffer.js
1320
- var require_list_it_buffer = __commonJS({
1321
- "../../node_modules/list-it/lib/list-it-buffer.js"(exports2, module2) {
1322
- "use strict";
1323
- var debug = require_src()("list-it-buffer");
1324
- var DataCell = require_data_cell();
1325
- var Row = require_row();
1326
- var Column = require_column();
1327
- var ansi = require_dist();
1328
- function ListItBuffer(opt) {
1329
- opt = opt || {};
1330
- this.opt = {
1331
- "autoAlign": true,
1332
- "columnWidth": null,
1333
- "header": null,
1334
- "headerBold": false,
1335
- "headerColor": "",
1336
- "headerUnderline": false
1337
- };
1338
- if (opt.header != null && !Array.isArray(opt.header)) {
1339
- throw new Error([
1340
- `Invalid header was specified. It must be an array, but (${JSON.stringify(opt.header)}):${typeof opt.header} was specified.`
1341
- ].join(" "));
1342
- }
1343
- if (opt.headerColor && !(opt.headerColor in COLORS)) {
1344
- throw new Error([
1345
- `Invalid color ${JSON.stringify(opt.headerColor)} was specified.`,
1346
- "Available color names:",
1347
- ...AVAILABLE_COLORS.map((color) => `* ${JSON.stringify(color)}`)
1348
- ].join("\n"));
1349
- }
1350
- Object.keys(this.opt).forEach((key) => {
1351
- if (key in opt) {
1352
- this.opt[key] = opt[key];
1353
- }
1354
- });
1355
- this.lines = [];
1356
- this.columns = [];
1357
- this.columnWidth = this.opt.columnWidth;
1358
- if (this.opt.header) {
1359
- this.setHeaderRow(this.opt.header);
1360
- }
1361
- }
1362
- module2.exports = ListItBuffer;
1363
- ListItBuffer.prototype.nl = function() {
1364
- const lastRowIndex = this.lines.length - 1;
1365
- if (lastRowIndex >= 0 && !this.lines[lastRowIndex].isFixed()) {
1366
- this.lines[lastRowIndex].fix();
1367
- }
1368
- this.pushNewRow();
1369
- return this;
1370
- };
1371
- ListItBuffer.prototype.d = function(data) {
1372
- if (arguments.length > 1) {
1373
- const array = Array.apply(null, arguments);
1374
- if (ListItBuffer.isMultiDimensionalArray(array)) {
1375
- array.forEach((row) => this.addRow(row));
1376
- } else {
1377
- array.forEach((data2) => this.d(data2));
1378
- }
1379
- return this;
1380
- }
1381
- if (Array.isArray(data)) {
1382
- if (ListItBuffer.isMultiDimensionalArray(data)) {
1383
- data.forEach((row) => this.addRow(row));
1384
- } else if (ListItBuffer.isObjectArray(data)) {
1385
- data = objectArrayToTable(data);
1386
- if (!this.header && (this.opt.headerBold || this.opt.headerColor || this.opt.headerUnderline)) {
1387
- this.setHeaderRow(data.shift());
1388
- }
1389
- data.forEach((row) => this.addRow(row));
1390
- } else {
1391
- this.addRow(data);
1392
- }
1393
- return this;
1394
- }
1395
- const rowidx = this.lines.length - 1;
1396
- if (rowidx < 0 || this.lines[rowidx].isFixed()) {
1397
- this.pushNewRow();
1398
- }
1399
- const cell = new DataCell();
1400
- cell.setData(data);
1401
- const iRow = this.lines.length - 1;
1402
- let iCol = this.lines[iRow].getCellLength();
1403
- if (iCol >= this.columns.length) {
1404
- this.addColumn();
1405
- }
1406
- this.columns[iCol].setCellAt(iRow, cell);
1407
- this.lines[iRow].pushCell(cell);
1408
- return this;
1409
- };
1410
- ListItBuffer.isMultiDimensionalArray = function(arr) {
1411
- if (!Array.isArray(arr)) {
1412
- throw Error("The parameter arr must be array");
1413
- }
1414
- for (let element of arr) {
1415
- if (!Array.isArray(element)) {
1416
- return false;
1417
- }
1418
- }
1419
- return true;
1420
- };
1421
- ListItBuffer.isObjectArray = function(arr) {
1422
- if (!Array.isArray(arr)) {
1423
- throw Error("The parameter arr must be array");
1424
- }
1425
- const ctor = arr[0].constructor;
1426
- for (let element of arr) {
1427
- if (typeof element != "object") {
1428
- return false;
1429
- } else {
1430
- if (element.constructor.name != ctor.name) {
1431
- return false;
1432
- }
1433
- }
1434
- }
1435
- return true;
1436
- };
1437
- ListItBuffer.prototype.addRow = function(row) {
1438
- row.forEach((col) => {
1439
- switch (typeof col) {
1440
- case "string":
1441
- case "number":
1442
- this.d(col);
1443
- break;
1444
- default:
1445
- this.d(col != null ? col.toString() : "(null)");
1446
- break;
1447
- }
1448
- });
1449
- this.nl();
1450
- };
1451
- ListItBuffer.prototype.pushNewRow = function() {
1452
- this.lines.push(new Row());
1453
- };
1454
- ListItBuffer.prototype.toString = function() {
1455
- const rows = [];
1456
- this.columns.forEach((column, iCol) => {
1457
- if (this.header != null) {
1458
- column.setHeader(this.header[iCol] || "");
1459
- }
1460
- column.setTextWidth(this.getColumnWidth(iCol));
1461
- column.updateWidth();
1462
- });
1463
- if (this.header != null) {
1464
- const headerLine = this.applyHeaderStyleOption(
1465
- this.columns.map((column) => column.formatColumnHeader()).join(" ")
1466
- );
1467
- rows.push(headerLine);
1468
- const headerUnderline = this.generateHeaderUnderline();
1469
- if (headerUnderline) {
1470
- rows.push(headerUnderline);
1471
- }
1472
- }
1473
- this.lines.forEach((line) => {
1474
- if (line.isFixed() || !line.isEmpty()) {
1475
- if (line.isEmpty()) {
1476
- rows.push("\n");
1477
- } else {
1478
- rows.push(this.columns.map((column, iCol) => {
1479
- const cell = line.getCell(iCol);
1480
- const data = cell.getData();
1481
- return column.formatCell(data);
1482
- }).join(" "));
1483
- }
1484
- }
1485
- });
1486
- return rows.join("\n");
1487
- };
1488
- var COLORS = {};
1489
- var BGCOLORS = {};
1490
- Object.keys(ansi.style).forEach((key) => {
1491
- const value = ansi.style[key];
1492
- if (/^bg-/.test(key)) {
1493
- BGCOLORS[key.substr(3)] = value;
1494
- } else {
1495
- COLORS[key] = value;
1496
- debug(`COLOR-KEY: ${key}`);
1497
- }
1498
- });
1499
- Object.keys(COLORS).forEach((key) => {
1500
- if (!(key in BGCOLORS)) {
1501
- delete COLORS[key];
1502
- debug(`remove COLOR-KEY: ${key}`);
1503
- }
1504
- });
1505
- var AVAILABLE_COLORS = Object.keys(COLORS);
1506
- debug(`AVAILABLE_COLORS:${JSON.stringify(AVAILABLE_COLORS)}`);
1507
- ListItBuffer.prototype.applyHeaderStyleOption = function(line) {
1508
- if (!this.opt.headerBold && !this.opt.headerColor) {
1509
- return line;
1510
- }
1511
- const textBuffer = [];
1512
- if (this.opt.headerBold) {
1513
- textBuffer.push(ansi.style.bold);
1514
- }
1515
- if (this.opt.headerColor) {
1516
- textBuffer.push(COLORS[this.opt.headerColor]);
1517
- }
1518
- textBuffer.push(line);
1519
- textBuffer.push(ansi.style.reset);
1520
- return textBuffer.join("");
1521
- };
1522
- ListItBuffer.prototype.generateHeaderUnderline = function() {
1523
- if (!this.opt.headerUnderline) {
1524
- return null;
1525
- }
1526
- if (this.header == null) {
1527
- return null;
1528
- }
1529
- return this.columns.map(
1530
- (column) => "-".repeat(column.getWidth())
1531
- ).join(" ");
1532
- };
1533
- function objectArrayToTable(objects) {
1534
- const keys = Object.keys(objects[0]);
1535
- const body = objects.map((item) => keys.map((key) => {
1536
- if (item[key] != null && typeof item[key] == "object" && item[key].constructor.name == "Date") {
1537
- return item[key].toISOString();
1538
- }
1539
- return item[key];
1540
- }));
1541
- return [keys, ...body];
1542
- }
1543
- ListItBuffer.prototype.setColumnWidth = function(indexOfColumns, width) {
1544
- this.columnWidth = this.columnWidth || [];
1545
- if (typeof indexOfColumns !== "number") {
1546
- throw new Error("indexOfColumns must be a number");
1547
- }
1548
- if (!width) {
1549
- delete this.columnWidth[indexOfColumns];
1550
- } else {
1551
- if (typeof width !== "number") {
1552
- throw new Error("width must be a number");
1553
- }
1554
- this.columnWidth[indexOfColumns] = width;
1555
- }
1556
- return this;
1557
- };
1558
- ListItBuffer.prototype.setColumnWidthAll = function(widthForAll) {
1559
- if (widthForAll != null && !Array.isArray(widthForAll) && typeof widthForAll !== "number") {
1560
- throw new Error(
1561
- "widthForAll must be one of a null, an Array or a number"
1562
- );
1563
- }
1564
- if (Array.isArray(widthForAll)) {
1565
- for (let i = 0; i < widthForAll.length; i++) {
1566
- const width = widthForAll[i];
1567
- if (width != void 0 && typeof width !== "number") {
1568
- throw new Error(
1569
- `widthForAll[${i}] must be an undefined or a number`
1570
- );
1571
- }
1572
- }
1573
- }
1574
- this.columnWidth = widthForAll;
1575
- return this;
1576
- };
1577
- ListItBuffer.prototype.getColumnWidth = function(indexOfColumns) {
1578
- if (Array.isArray(this.columnWidth)) {
1579
- return this.columnWidth[indexOfColumns];
1580
- }
1581
- return this.columnWidth;
1582
- };
1583
- ListItBuffer.prototype.setHeaderRow = function(header) {
1584
- if (header && !Array.isArray(header)) {
1585
- throw new Error([
1586
- "The header must be an array,",
1587
- `but ${typeof header} was specified.`,
1588
- `header: ${JSON.stringify(header)}`
1589
- ].join(" "));
1590
- }
1591
- this.header = header;
1592
- if (this.header == null) {
1593
- this.columns.forEach((column) => column.setHeader(null));
1594
- } else {
1595
- this.header.forEach((headerText, iCol) => {
1596
- if (iCol >= this.columns.length) {
1597
- this.addColumn(headerText);
1598
- }
1599
- });
1600
- }
1601
- return this;
1602
- };
1603
- ListItBuffer.prototype.addColumn = function(headerText) {
1604
- const column = new Column();
1605
- if (headerText) {
1606
- column.setHeader(headerText);
1607
- }
1608
- if (this.opt.autoAlign) {
1609
- column.setAutoAlign(true);
1610
- }
1611
- this.columns.push(column);
1612
- };
1613
- }
1614
- });
1615
-
1616
- // ../../node_modules/list-it/index.js
1617
- var require_list_it = __commonJS({
1618
- "../../node_modules/list-it/index.js"(exports2, module2) {
1619
- "use strict";
1620
- var ListItBuffer = require_list_it_buffer();
1621
- function ListIt2(opt) {
1622
- ListItBuffer.call(this, opt);
1623
- }
1624
- ListIt2.prototype = new ListItBuffer();
1625
- ListIt2.buffer = function(opt) {
1626
- opt = opt || {};
1627
- if (!("autoAlign" in opt)) {
1628
- opt.autoAlign = false;
1629
- }
1630
- return new ListIt2(opt);
1631
- };
1632
- module2.exports = ListIt2;
1633
- }
1634
- });
1635
-
1636
30
  // src/scripts/replay.ts
1637
31
  var replay_exports = {};
1638
32
  __export(replay_exports, {
@@ -1649,7 +43,7 @@ var import_redis6 = require("@tradejs/infra/redis");
1649
43
 
1650
44
  // src/lib/runFormatting.ts
1651
45
  var import_date_fns = require("date-fns");
1652
- var ListIt = require_list_it();
46
+ var ListIt = require("list-it");
1653
47
  var createListIt = () => new ListIt({
1654
48
  autoAlign: true,
1655
49
  headerUnderline: true
@@ -1713,20 +107,20 @@ var resolveTimeWindow = ({
1713
107
  const explicitStart = toEpochMs(startTime);
1714
108
  const explicitEnd = toEpochMs(endTime);
1715
109
  const resolvedDays = toPositiveNumber(days);
1716
- const alignToLastClosedInterval = (window2, preserveDuration) => {
110
+ const alignToLastClosedInterval = (window, preserveDuration) => {
1717
111
  if (typeof closedIntervalMs !== "number" || !Number.isFinite(closedIntervalMs) || closedIntervalMs <= 0) {
1718
- return window2;
112
+ return window;
1719
113
  }
1720
- const alignedEnd = Math.floor(window2.end / closedIntervalMs) * closedIntervalMs - 1;
1721
- const delta = window2.end - alignedEnd;
1722
- const alignedStart = preserveDuration ? window2.start - delta : window2.start;
114
+ const alignedEnd = Math.floor(window.end / closedIntervalMs) * closedIntervalMs - 1;
115
+ const delta = window.end - alignedEnd;
116
+ const alignedStart = preserveDuration ? window.start - delta : window.start;
1723
117
  if (alignedStart >= alignedEnd) {
1724
118
  throw new Error(
1725
119
  `Invalid closed-candle window: start (${alignedStart}) must be less than end (${alignedEnd})`
1726
120
  );
1727
121
  }
1728
122
  return {
1729
- ...window2,
123
+ ...window,
1730
124
  start: Math.trunc(alignedStart),
1731
125
  end: Math.trunc(alignedEnd)
1732
126
  };
@@ -1787,17 +181,7 @@ var import_chalk = __toESM(require("chalk"));
1787
181
  // src/lib/runtimeRedis.ts
1788
182
  var import_redis = require("@tradejs/infra/redis");
1789
183
  var import_time = require("@tradejs/core/time");
1790
- var RESERVED_STRATEGY_NAMES = /* @__PURE__ */ new Set(["charts"]);
1791
- var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
1792
- var resolveStrategyConfigIdentityByKey = (userName, key) => {
1793
- const parts = key.split(":");
1794
- if (parts.length !== 5) return null;
1795
- const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
1796
- 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)) {
1797
- return null;
1798
- }
1799
- return { strategyName, configId };
1800
- };
184
+ var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
1801
185
  var isRuntimeStrategyEnabled = (strategyConfig) => {
1802
186
  const enabled = strategyConfig.ENABLE;
1803
187
  return enabled !== false;
@@ -1809,42 +193,6 @@ var isRuntimeTradeRecord = (value) => {
1809
193
  const record = value;
1810
194
  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");
1811
195
  };
1812
- var resolveStrategyNameByConfigKey = (userName, key) => {
1813
- return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
1814
- };
1815
- var getRuntimeStrategyConfigKeys = async (userName) => {
1816
- const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
1817
- return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
1818
- };
1819
- var loadRuntimeStrategyConfigs = async (userName, {
1820
- onInvalidConfig
1821
- } = {}) => {
1822
- const configKeys = await getRuntimeStrategyConfigKeys(userName);
1823
- const strategyConfigs = await Promise.all(
1824
- configKeys.map(async (key) => {
1825
- const strategyName = resolveStrategyNameByConfigKey(userName, key);
1826
- const identity = resolveStrategyConfigIdentityByKey(userName, key);
1827
- if (!strategyName || !identity) {
1828
- return null;
1829
- }
1830
- const strategyConfig = await (0, import_redis.getData)(
1831
- key,
1832
- null
1833
- );
1834
- if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
1835
- onInvalidConfig?.(key);
1836
- return null;
1837
- }
1838
- return {
1839
- key,
1840
- strategyName,
1841
- configId: identity.configId,
1842
- strategyConfig
1843
- };
1844
- })
1845
- );
1846
- return strategyConfigs.filter(Boolean);
1847
- };
1848
196
  var loadRuntimeTrades = async (userName, {
1849
197
  startTime,
1850
198
  endTime
@@ -1894,7 +242,7 @@ var toStrategyConfigGrid = (strategyConfig) => Object.fromEntries(
1894
242
  Object.entries(strategyConfig).filter(([key]) => !BACKTEST_CLI_RUNTIME_CONFIG_KEYS.has(key)).map(([key, value]) => [key, [value]])
1895
243
  );
1896
244
  var loadRuntimeStrategyBacktestConfigs = async (userName) => {
1897
- const configs = await loadRuntimeStrategyConfigs(userName, {
245
+ const configs = await (0, import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs)(userName, {
1898
246
  onInvalidConfig: (key) => {
1899
247
  console.log(import_chalk.default.yellow(`Skip invalid runtime strategy config: ${key}`));
1900
248
  }
@@ -2277,7 +625,7 @@ var prepareRunEnvironment = async ({
2277
625
  instrument
2278
626
  ])
2279
627
  );
2280
- const window2 = resolveTimeWindow({
628
+ const window = resolveTimeWindow({
2281
629
  days,
2282
630
  startTime,
2283
631
  endTime,
@@ -2286,7 +634,7 @@ var prepareRunEnvironment = async ({
2286
634
  closedIntervalMs
2287
635
  });
2288
636
  const preloadStart = (0, import_time2.getBacktestPreloadStart)(
2289
- window2.start,
637
+ window.start,
2290
638
  import_constants.BACKTEST_PRELOAD_DAYS
2291
639
  );
2292
640
  if (!cacheOnly) {
@@ -2306,7 +654,7 @@ var prepareRunEnvironment = async ({
2306
654
  interval,
2307
655
  symbols: loadedTickers,
2308
656
  preloadStart,
2309
- preloadEnd: window2.end,
657
+ preloadEnd: window.end,
2310
658
  universe,
2311
659
  log: (message) => console.log(import_chalk3.default.gray(message))
2312
660
  });
@@ -2322,7 +670,7 @@ var prepareRunEnvironment = async ({
2322
670
  {
2323
671
  connectorLabel: connectorName,
2324
672
  preloadStart,
2325
- preloadEnd: window2.end,
673
+ preloadEnd: window.end,
2326
674
  skipCovered: true
2327
675
  }
2328
676
  )
@@ -2334,7 +682,7 @@ var prepareRunEnvironment = async ({
2334
682
  marketConnector,
2335
683
  tickers: loadedTickers,
2336
684
  instrumentsBySymbol,
2337
- window: window2,
685
+ window,
2338
686
  preloadStart,
2339
687
  universe,
2340
688
  accountId,
@@ -2346,7 +694,7 @@ var prepareRunEnvironment = async ({
2346
694
 
2347
695
  // src/lib/marketContextPrepare.ts
2348
696
  var import_chalk7 = __toESM(require("chalk"));
2349
- var import_timescale5 = require("@tradejs/infra/timescale");
697
+ var import_marketContext3 = require("@tradejs/infra/timescale/marketContext");
2350
698
  var import_registry = require("@tradejs/node/registry");
2351
699
 
2352
700
  // src/lib/binanceMarketContextBackfill.ts
@@ -2355,7 +703,8 @@ var import_chalk4 = __toESM(require("chalk"));
2355
703
  var import_connectors4 = require("@tradejs/connectors");
2356
704
  var import_connectors5 = require("@tradejs/node/connectors");
2357
705
  var import_strategies = require("@tradejs/node/strategies");
2358
- var import_timescale = require("@tradejs/infra/timescale");
706
+ var import_marketContext = require("@tradejs/infra/timescale/marketContext");
707
+ var import_client = require("@tradejs/infra/timescale/client");
2359
708
 
2360
709
  // src/lib/binanceMarketData.ts
2361
710
  var MARKET_FEATURE_INTERVAL_MS = {
@@ -2863,7 +1212,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
2863
1212
  if (endMs <= Math.min(breadthStartMs, tradeFlowStartMs)) {
2864
1213
  return skippedBackfillResult();
2865
1214
  }
2866
- await (0, import_timescale.waitForDbReady)();
1215
+ await (0, import_client.waitForDbReady)();
2867
1216
  const connector = await getBinanceConnector({
2868
1217
  projectRoot: params.projectRoot,
2869
1218
  userName: params.userName
@@ -2909,7 +1258,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
2909
1258
  )
2910
1259
  );
2911
1260
  if (includeTradeFlow && referenceSymbols.length) {
2912
- const coverage = await (0, import_timescale.getMarketTradeFlowCoverage)({
1261
+ const coverage = await (0, import_marketContext.getMarketTradeFlowCoverage)({
2913
1262
  symbols: referenceSymbols,
2914
1263
  interval,
2915
1264
  startMs: tradeFlowStartMs,
@@ -2993,7 +1342,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
2993
1342
  const ts = row.ts.getTime();
2994
1343
  return ts >= chunk.startMs && ts <= chunk.endMs;
2995
1344
  });
2996
- await (0, import_timescale.upsertMarketTradeFlowRows)(boundedRows);
1345
+ await (0, import_marketContext.upsertMarketTradeFlowRows)(boundedRows);
2997
1346
  tradeFlowRows += boundedRows.length;
2998
1347
  chunkBar?.tick(1, {
2999
1348
  rows: tradeFlowRows,
@@ -3021,7 +1370,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
3021
1370
  });
3022
1371
  const plans = await Promise.all(
3023
1372
  breadthUniverses.map(async (definition) => {
3024
- const coverage = await (0, import_timescale.getMarketBreadthCoverage)({
1373
+ const coverage = await (0, import_marketContext.getMarketBreadthCoverage)({
3025
1374
  universe: definition.universe,
3026
1375
  interval,
3027
1376
  startMs: breadthStartMs,
@@ -3122,7 +1471,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
3122
1471
  const ts = row.ts.getTime();
3123
1472
  return ts >= chunk.startMs && ts <= chunk.endMs;
3124
1473
  });
3125
- await (0, import_timescale.upsertMarketBreadthRows)(rows);
1474
+ await (0, import_marketContext.upsertMarketBreadthRows)(rows);
3126
1475
  breadthRows += rows.length;
3127
1476
  }
3128
1477
  }
@@ -3150,7 +1499,8 @@ var import_progress2 = __toESM(require("progress"));
3150
1499
  var import_async = require("@tradejs/core/async");
3151
1500
  var import_constants2 = require("@tradejs/core/constants");
3152
1501
  var import_indicators = require("@tradejs/core/indicators");
3153
- var import_timescale2 = require("@tradejs/infra/timescale");
1502
+ var import_derivatives = require("@tradejs/infra/timescale/derivatives");
1503
+ var import_client2 = require("@tradejs/infra/timescale/client");
3154
1504
  var import_userSettings = require("@tradejs/infra/userSettings");
3155
1505
  var HOUR_MS = 60 * 60 * 1e3;
3156
1506
  var DAY_MS2 = 24 * HOUR_MS;
@@ -3663,13 +2013,13 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
3663
2013
  if (!intervalWindows.length) {
3664
2014
  return skippedBackfillResult2();
3665
2015
  }
3666
- await (0, import_timescale2.waitForDbReady)();
2016
+ await (0, import_client2.waitForDbReady)();
3667
2017
  const edgesByInterval = /* @__PURE__ */ new Map();
3668
2018
  await Promise.all(
3669
2019
  intervalWindows.map(async ({ interval }) => {
3670
2020
  edgesByInterval.set(
3671
2021
  interval,
3672
- await (0, import_timescale2.getDerivativesDataEdgesForSymbols)(symbols, interval)
2022
+ await (0, import_derivatives.getDerivativesDataEdgesForSymbols)(symbols, interval)
3673
2023
  );
3674
2024
  })
3675
2025
  );
@@ -3678,32 +2028,32 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
3678
2028
  const liquidationCoverageRangesByInterval = /* @__PURE__ */ new Map();
3679
2029
  const coverageNowMs = Date.now();
3680
2030
  await Promise.all(
3681
- intervalWindows.map(async (window2) => {
2031
+ intervalWindows.map(async (window) => {
3682
2032
  const confirmedLiquidationWindow = (0, import_indicators.resolveCoinalyzeConfirmedIntradayCoverage)({
3683
- interval: window2.interval,
3684
- fromMs: window2.fromMs,
3685
- toMs: window2.toMs,
2033
+ interval: window.interval,
2034
+ fromMs: window.fromMs,
2035
+ toMs: window.toMs,
3686
2036
  nowMs: coverageNowMs
3687
2037
  });
3688
2038
  const [coverageRows, liquidationCoverageRows] = await Promise.all([
3689
- (0, import_timescale2.getDerivativesBackfillCoverage)({
2039
+ (0, import_derivatives.getDerivativesBackfillCoverage)({
3690
2040
  source: "coinalyze",
3691
2041
  symbols,
3692
- interval: window2.interval,
3693
- fromMs: window2.fromMs,
3694
- toMs: window2.toMs
2042
+ interval: window.interval,
2043
+ fromMs: window.fromMs,
2044
+ toMs: window.toMs
3695
2045
  }),
3696
- confirmedLiquidationWindow ? (0, import_timescale2.getDerivativesMetricCoverage)({
2046
+ confirmedLiquidationWindow ? (0, import_derivatives.getDerivativesMetricCoverage)({
3697
2047
  source: "coinalyze",
3698
2048
  metric: "liquidation",
3699
2049
  symbols,
3700
- interval: window2.interval,
2050
+ interval: window.interval,
3701
2051
  fromMs: confirmedLiquidationWindow.fromMs,
3702
2052
  toMs: confirmedLiquidationWindow.toMs
3703
2053
  }) : Promise.resolve([])
3704
2054
  ]);
3705
2055
  coverageKeysByInterval.set(
3706
- window2.interval,
2056
+ window.interval,
3707
2057
  new Set(
3708
2058
  coverageRows.map(
3709
2059
  (row) => coverageKey({
@@ -3722,7 +2072,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
3722
2072
  ranges.push({ fromMs: row.fromMs, toMs: row.toMs });
3723
2073
  rangesBySymbol.set(symbol, ranges);
3724
2074
  }
3725
- coverageRangesByInterval.set(window2.interval, rangesBySymbol);
2075
+ coverageRangesByInterval.set(window.interval, rangesBySymbol);
3726
2076
  const liquidationRangesBySymbol = /* @__PURE__ */ new Map();
3727
2077
  for (const row of liquidationCoverageRows) {
3728
2078
  const symbol = row.symbol.toUpperCase();
@@ -3731,33 +2081,33 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
3731
2081
  liquidationRangesBySymbol.set(symbol, ranges);
3732
2082
  }
3733
2083
  liquidationCoverageRangesByInterval.set(
3734
- window2.interval,
2084
+ window.interval,
3735
2085
  liquidationRangesBySymbol
3736
2086
  );
3737
2087
  })
3738
2088
  );
3739
2089
  const cachedWindows = intervalWindows.reduce(
3740
- (sum, window2) => sum + countBackfillWindows({
3741
- fromMs: window2.fromMs,
3742
- toMs: window2.toMs,
2090
+ (sum, window) => sum + countBackfillWindows({
2091
+ fromMs: window.fromMs,
2092
+ toMs: window.toMs,
3743
2093
  batchMs,
3744
- intervalMs: window2.intervalMs
2094
+ intervalMs: window.intervalMs
3745
2095
  }),
3746
2096
  0
3747
2097
  );
3748
- const allBackfillWindowsCached = mode !== "signals" && intervalWindows.every((window2) => {
3749
- const edgesBySymbol = edgesByInterval.get(window2.interval);
3750
- const coverageKeys = coverageKeysByInterval.get(window2.interval);
2098
+ const allBackfillWindowsCached = mode !== "signals" && intervalWindows.every((window) => {
2099
+ const edgesBySymbol = edgesByInterval.get(window.interval);
2100
+ const coverageKeys = coverageKeysByInterval.get(window.interval);
3751
2101
  const backfillWindows = buildBackfillWindows({
3752
- fromMs: window2.fromMs,
3753
- toMs: window2.toMs,
2102
+ fromMs: window.fromMs,
2103
+ toMs: window.toMs,
3754
2104
  batchMs,
3755
- intervalMs: window2.intervalMs
2105
+ intervalMs: window.intervalMs
3756
2106
  });
3757
2107
  return symbols.every(
3758
2108
  (symbol) => backfillWindows.every((backfillWindow) => {
3759
2109
  const normalizedSymbol = symbol.toUpperCase();
3760
- const coverageRanges = coverageRangesByInterval.get(window2.interval)?.get(normalizedSymbol) ?? [];
2110
+ const coverageRanges = coverageRangesByInterval.get(window.interval)?.get(normalizedSymbol) ?? [];
3761
2111
  const dataCovered = hasDerivativesWindowCoverage({
3762
2112
  edges: edgesBySymbol?.get(normalizedSymbol),
3763
2113
  fromMs: backfillWindow.fromMs,
@@ -3766,26 +2116,26 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
3766
2116
  ranges: coverageRanges,
3767
2117
  fromMs: backfillWindow.fromMs,
3768
2118
  toMs: backfillWindow.toMs,
3769
- intervalMs: window2.intervalMs
2119
+ intervalMs: window.intervalMs
3770
2120
  }) == null || coverageKeys?.has(
3771
2121
  coverageKey({
3772
2122
  symbol: normalizedSymbol,
3773
- interval: window2.interval,
2123
+ interval: window.interval,
3774
2124
  fromMs: backfillWindow.fromMs,
3775
2125
  toMs: backfillWindow.toMs
3776
2126
  })
3777
2127
  );
3778
2128
  const confirmedLiquidationWindow = (0, import_indicators.resolveCoinalyzeConfirmedIntradayCoverage)({
3779
- interval: window2.interval,
2129
+ interval: window.interval,
3780
2130
  fromMs: backfillWindow.fromMs,
3781
2131
  toMs: backfillWindow.toMs,
3782
2132
  nowMs: coverageNowMs
3783
2133
  });
3784
2134
  const liquidationCovered = confirmedLiquidationWindow == null || resolveDerivativesContextMissingCoverageFetchFromMs({
3785
- ranges: liquidationCoverageRangesByInterval.get(window2.interval)?.get(normalizedSymbol) ?? [],
2135
+ ranges: liquidationCoverageRangesByInterval.get(window.interval)?.get(normalizedSymbol) ?? [],
3786
2136
  fromMs: confirmedLiquidationWindow.fromMs,
3787
2137
  toMs: confirmedLiquidationWindow.toMs,
3788
- intervalMs: window2.intervalMs
2138
+ intervalMs: window.intervalMs
3789
2139
  }) == null;
3790
2140
  return dataCovered && liquidationCovered;
3791
2141
  })
@@ -3835,11 +2185,11 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
3835
2185
  );
3836
2186
  const symbolBatches = chunkArray(matches, symbolBatchSize);
3837
2187
  const windowsPerPair = intervalWindows.reduce(
3838
- (sum, window2) => sum + countBackfillWindows({
3839
- fromMs: window2.fromMs,
3840
- toMs: window2.toMs,
2188
+ (sum, window) => sum + countBackfillWindows({
2189
+ fromMs: window.fromMs,
2190
+ toMs: window.toMs,
3841
2191
  batchMs,
3842
- intervalMs: window2.intervalMs
2192
+ intervalMs: window.intervalMs
3843
2193
  }),
3844
2194
  0
3845
2195
  );
@@ -3862,9 +2212,9 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
3862
2212
  `derivatives context backfill: symbols=${matches.length}, requestedSymbols=${requestedSymbols.length}, unmatched=${unmatched.length}, intervals=${intervals.join(",")}, window=${new Date(fromMs).toISOString()}..${new Date(safeEndMs).toISOString()}, testStart=${new Date(safeStartMs).toISOString()}`
3863
2213
  )
3864
2214
  );
3865
- for (const window2 of intervalWindows) {
3866
- const { interval, intervalMs } = window2;
3867
- const edgesBySymbol = edgesByInterval.get(interval) ?? await (0, import_timescale2.getDerivativesDataEdgesForSymbols)(
2215
+ for (const window of intervalWindows) {
2216
+ const { interval, intervalMs } = window;
2217
+ const edgesBySymbol = edgesByInterval.get(interval) ?? await (0, import_derivatives.getDerivativesDataEdgesForSymbols)(
3868
2218
  matches.map((item) => item.symbol),
3869
2219
  interval
3870
2220
  );
@@ -3879,9 +2229,9 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
3879
2229
  );
3880
2230
  for (let batchIdx = 0; batchIdx < symbolBatches.length; batchIdx += 1) {
3881
2231
  const batch = symbolBatches[batchIdx];
3882
- let cursor = window2.fromMs;
3883
- while (cursor < window2.toMs) {
3884
- const toMs = Math.min(window2.toMs, cursor + batchMs);
2232
+ let cursor = window.fromMs;
2233
+ while (cursor < window.toMs) {
2234
+ const toMs = Math.min(window.toMs, cursor + batchMs);
3885
2235
  const missingRanges = batch.map((item) => {
3886
2236
  const key = coverageKey({
3887
2237
  symbol: item.symbol,
@@ -3987,7 +2337,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
3987
2337
  );
3988
2338
  }
3989
2339
  if (rows.length) {
3990
- await (0, import_timescale2.upsertDerivatives)(rows);
2340
+ await (0, import_derivatives.upsertDerivatives)(rows);
3991
2341
  totalRows += rows.length;
3992
2342
  }
3993
2343
  const confirmedLiquidationWindow = (0, import_indicators.resolveCoinalyzeConfirmedIntradayCoverage)({
@@ -4015,7 +2365,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
4015
2365
  eventRowsCount
4016
2366
  };
4017
2367
  });
4018
- await (0, import_timescale2.applyDerivativesMetricCoverage)(metricCoverageRows);
2368
+ await (0, import_derivatives.applyDerivativesMetricCoverage)(metricCoverageRows);
4019
2369
  for (const coverageRow of metricCoverageRows) {
4020
2370
  const symbol = coverageRow.symbol.toUpperCase();
4021
2371
  const ranges = liquidationCoverageRangesBySymbol.get(symbol) ?? [];
@@ -4047,7 +2397,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
4047
2397
  rowsCount
4048
2398
  };
4049
2399
  });
4050
- await (0, import_timescale2.upsertDerivativesBackfillCoverage)(coverageRows);
2400
+ await (0, import_derivatives.upsertDerivativesBackfillCoverage)(coverageRows);
4051
2401
  for (const coverageRow of coverageRows) {
4052
2402
  const symbol = coverageRow.symbol.toUpperCase();
4053
2403
  edgesBySymbol.set(
@@ -4124,7 +2474,8 @@ var backfillDerivativesContextForSignals = async (params) => backfillDerivatives
4124
2474
  // src/lib/coinMarketCapContextBackfill.ts
4125
2475
  var import_chalk6 = __toESM(require("chalk"));
4126
2476
  var import_async2 = require("@tradejs/core/async");
4127
- var import_timescale3 = require("@tradejs/infra/timescale");
2477
+ var import_marketContext2 = require("@tradejs/infra/timescale/marketContext");
2478
+ var import_client3 = require("@tradejs/infra/timescale/client");
4128
2479
  var import_userSettings2 = require("@tradejs/infra/userSettings");
4129
2480
  var DAY_MS3 = 864e5;
4130
2481
  var DEFAULT_CONTEXT_MAX_AGE_MS = 48 * 60 * 6e4;
@@ -4349,27 +2700,27 @@ var createCoinMarketCapFetchStats = () => ({
4349
2700
  totalCredits: 0,
4350
2701
  byPath: /* @__PURE__ */ new Map()
4351
2702
  });
4352
- var getCoinMarketCapPathLabel = (path3) => {
4353
- if (path3.includes("global-metrics")) return "global";
4354
- if (path3.includes("cryptocurrency/quotes")) return "reference";
4355
- if (path3.includes("exchange/quotes")) return "exchangeLiquidity";
4356
- if (path3.includes("fear-and-greed")) return "fearGreed";
4357
- if (path3.includes("cmc100")) return "cmc100";
4358
- if (path3.includes("cmc20")) return "cmc20";
4359
- return path3;
4360
- };
4361
- var recordCoinMarketCapFetchStats = (stats, path3, creditCount) => {
2703
+ var getCoinMarketCapPathLabel = (path4) => {
2704
+ if (path4.includes("global-metrics")) return "global";
2705
+ if (path4.includes("cryptocurrency/quotes")) return "reference";
2706
+ if (path4.includes("exchange/quotes")) return "exchangeLiquidity";
2707
+ if (path4.includes("fear-and-greed")) return "fearGreed";
2708
+ if (path4.includes("cmc100")) return "cmc100";
2709
+ if (path4.includes("cmc20")) return "cmc20";
2710
+ return path4;
2711
+ };
2712
+ var recordCoinMarketCapFetchStats = (stats, path4, creditCount) => {
4362
2713
  if (!stats) return;
4363
- const existing = stats.byPath.get(path3) ?? { requests: 0, credits: 0 };
2714
+ const existing = stats.byPath.get(path4) ?? { requests: 0, credits: 0 };
4364
2715
  existing.requests += 1;
4365
2716
  existing.credits += creditCount ?? 0;
4366
2717
  stats.requests += 1;
4367
2718
  stats.totalCredits += creditCount ?? 0;
4368
- stats.byPath.set(path3, existing);
2719
+ stats.byPath.set(path4, existing);
4369
2720
  };
4370
2721
  var formatCoinMarketCapFetchStats = (stats) => {
4371
2722
  const byPath = [...stats.byPath.entries()].map(
4372
- ([path3, item]) => `${getCoinMarketCapPathLabel(path3)}=${item.requests}req/${item.credits}cr`
2723
+ ([path4, item]) => `${getCoinMarketCapPathLabel(path4)}=${item.requests}req/${item.credits}cr`
4373
2724
  ).join(" ");
4374
2725
  return `apiRequests=${stats.requests} apiCredits=${stats.totalCredits}${byPath ? ` ${byPath}` : ""}`;
4375
2726
  };
@@ -4388,7 +2739,7 @@ var logBackfillSourceDone = (params) => {
4388
2739
  )
4389
2740
  );
4390
2741
  };
4391
- var markBackfillCoverage = (rows) => (0, import_timescale3.upsertMarketContextBackfillCoverage)(rows);
2742
+ var markBackfillCoverage = (rows) => (0, import_marketContext2.upsertMarketContextBackfillCoverage)(rows);
4392
2743
  var coinMarketCapFetch = async (params) => {
4393
2744
  const url = new URL(`${getBaseUrl()}${params.path}`);
4394
2745
  for (const [key, value] of Object.entries(params.searchParams)) {
@@ -4717,7 +3068,7 @@ var backfillCoinMarketCapContext = async (params) => {
4717
3068
  if (toMs <= fromMs) return skippedResult();
4718
3069
  const exchangeLiquidityEnabled = isExchangeLiquidityBackfillEnabled();
4719
3070
  const fearGreedEnabled = isFearGreedBackfillEnabled();
4720
- await (0, import_timescale3.waitForDbReady)();
3071
+ await (0, import_client3.waitForDbReady)();
4721
3072
  const [
4722
3073
  globalDailyCoverage,
4723
3074
  referenceDailyCoverage,
@@ -4730,66 +3081,66 @@ var backfillCoinMarketCapContext = async (params) => {
4730
3081
  fearGreedBackfillCoverage,
4731
3082
  indexBackfillCoverage
4732
3083
  ] = await Promise.all([
4733
- (0, import_timescale3.getMarketGlobalContextCoverage)({
3084
+ (0, import_marketContext2.getMarketGlobalContextCoverage)({
4734
3085
  source: SOURCE_GLOBAL_DAILY,
4735
3086
  startMs: fromMs,
4736
3087
  endMs: toMs
4737
3088
  }),
4738
- (0, import_timescale3.getMarketReferenceAssetContextCoverage)({
3089
+ (0, import_marketContext2.getMarketReferenceAssetContextCoverage)({
4739
3090
  source: SOURCE_REFERENCE,
4740
3091
  symbols: REFERENCE_ASSETS.map((item) => item.symbol),
4741
3092
  interval: "1d",
4742
3093
  startMs: fromMs,
4743
3094
  endMs: toMs
4744
3095
  }),
4745
- exchangeLiquidityEnabled ? (0, import_timescale3.getMarketCmcExchangeLiquidityContextCoverage)({
3096
+ exchangeLiquidityEnabled ? (0, import_marketContext2.getMarketCmcExchangeLiquidityContextCoverage)({
4746
3097
  source: SOURCE_EXCHANGE_LIQUIDITY,
4747
3098
  interval: "1d",
4748
3099
  startMs: fromMs,
4749
3100
  endMs: toMs
4750
3101
  }) : Promise.resolve(null),
4751
- fearGreedEnabled ? (0, import_timescale3.getMarketCmcFearGreedContextCoverage)({
3102
+ fearGreedEnabled ? (0, import_marketContext2.getMarketCmcFearGreedContextCoverage)({
4752
3103
  source: SOURCE_FEAR_GREED,
4753
3104
  interval: "1d",
4754
3105
  startMs: fromMs,
4755
3106
  endMs: toMs
4756
3107
  }) : Promise.resolve(null),
4757
- (0, import_timescale3.getMarketCmcIndexContextCoverage)({
3108
+ (0, import_marketContext2.getMarketCmcIndexContextCoverage)({
4758
3109
  source: SOURCE_INDEX,
4759
3110
  indexSlugs: CMC_INDEXES.map((index) => index.slug),
4760
3111
  interval: "1d",
4761
3112
  startMs: fromMs,
4762
3113
  endMs: toMs
4763
3114
  }),
4764
- (0, import_timescale3.getMarketContextBackfillCoverage)({
3115
+ (0, import_marketContext2.getMarketContextBackfillCoverage)({
4765
3116
  source: SOURCE_GLOBAL_DAILY,
4766
3117
  scopes: [COVERAGE_SCOPE_ALL],
4767
3118
  interval: "1d",
4768
3119
  fromMs,
4769
3120
  toMs
4770
3121
  }),
4771
- (0, import_timescale3.getMarketContextBackfillCoverage)({
3122
+ (0, import_marketContext2.getMarketContextBackfillCoverage)({
4772
3123
  source: SOURCE_REFERENCE,
4773
3124
  scopes: REFERENCE_ASSETS.map((item) => item.symbol),
4774
3125
  interval: "1d",
4775
3126
  fromMs,
4776
3127
  toMs
4777
3128
  }),
4778
- exchangeLiquidityEnabled ? (0, import_timescale3.getMarketContextBackfillCoverage)({
3129
+ exchangeLiquidityEnabled ? (0, import_marketContext2.getMarketContextBackfillCoverage)({
4779
3130
  source: SOURCE_EXCHANGE_LIQUIDITY,
4780
3131
  scopes: [COVERAGE_SCOPE_ALL],
4781
3132
  interval: "1d",
4782
3133
  fromMs,
4783
3134
  toMs
4784
3135
  }) : Promise.resolve([]),
4785
- fearGreedEnabled ? (0, import_timescale3.getMarketContextBackfillCoverage)({
3136
+ fearGreedEnabled ? (0, import_marketContext2.getMarketContextBackfillCoverage)({
4786
3137
  source: SOURCE_FEAR_GREED,
4787
3138
  scopes: [COVERAGE_SCOPE_ALL],
4788
3139
  interval: "1d",
4789
3140
  fromMs,
4790
3141
  toMs
4791
3142
  }) : Promise.resolve([]),
4792
- (0, import_timescale3.getMarketContextBackfillCoverage)({
3143
+ (0, import_marketContext2.getMarketContextBackfillCoverage)({
4793
3144
  source: SOURCE_INDEX,
4794
3145
  scopes: CMC_INDEXES.map((index) => index.slug),
4795
3146
  interval: "1d",
@@ -4980,7 +3331,7 @@ var backfillCoinMarketCapContext = async (params) => {
4980
3331
  }
4981
3332
  });
4982
3333
  const rows = coinMarketCapGlobalPayloadToRows(payload, SOURCE_GLOBAL_DAILY);
4983
- await (0, import_timescale3.upsertMarketGlobalContextRows)(rows);
3334
+ await (0, import_marketContext2.upsertMarketGlobalContextRows)(rows);
4984
3335
  await markBackfillCoverage([
4985
3336
  {
4986
3337
  source: SOURCE_GLOBAL_DAILY,
@@ -5014,7 +3365,7 @@ var backfillCoinMarketCapContext = async (params) => {
5014
3365
  }
5015
3366
  });
5016
3367
  const rows = coinMarketCapHistoricalQuotesPayloadToRows(payload, "1d");
5017
- await (0, import_timescale3.upsertMarketReferenceAssetContextRows)(rows);
3368
+ await (0, import_marketContext2.upsertMarketReferenceAssetContextRows)(rows);
5018
3369
  await markBackfillCoverage(
5019
3370
  REFERENCE_ASSETS.map((asset) => ({
5020
3371
  source: SOURCE_REFERENCE,
@@ -5053,7 +3404,7 @@ var backfillCoinMarketCapContext = async (params) => {
5053
3404
  payload,
5054
3405
  "1d"
5055
3406
  );
5056
- await (0, import_timescale3.upsertMarketCmcExchangeLiquidityContextRows)(rows);
3407
+ await (0, import_marketContext2.upsertMarketCmcExchangeLiquidityContextRows)(rows);
5057
3408
  await markBackfillCoverage([
5058
3409
  {
5059
3410
  source: SOURCE_EXCHANGE_LIQUIDITY,
@@ -5098,7 +3449,7 @@ var backfillCoinMarketCapContext = async (params) => {
5098
3449
  const oldestPageTs = Math.min(...pageRows.map((row) => row.ts.getTime()));
5099
3450
  if (oldestPageTs < fromMs || pageRows.length < pageSize) break;
5100
3451
  }
5101
- await (0, import_timescale3.upsertMarketCmcFearGreedContextRows)(rows);
3452
+ await (0, import_marketContext2.upsertMarketCmcFearGreedContextRows)(rows);
5102
3453
  await markBackfillCoverage([
5103
3454
  {
5104
3455
  source: SOURCE_FEAR_GREED,
@@ -5132,7 +3483,7 @@ var backfillCoinMarketCapContext = async (params) => {
5132
3483
  }))
5133
3484
  );
5134
3485
  const rows = rowsByIndex.flatMap((item) => item.result.rows);
5135
- await (0, import_timescale3.upsertMarketCmcIndexContextRows)(rows);
3486
+ await (0, import_marketContext2.upsertMarketCmcIndexContextRows)(rows);
5136
3487
  await markBackfillCoverage(
5137
3488
  rowsByIndex.map(({ index, result }) => ({
5138
3489
  source: SOURCE_INDEX,
@@ -5184,7 +3535,7 @@ var backfillCoinMarketCapContextForSignals = (params) => backfillCoinMarketCapCo
5184
3535
 
5185
3536
  // src/lib/hyperliquidWhaleBackfill.ts
5186
3537
  var import_progress3 = __toESM(require("progress"));
5187
- var import_timescale4 = require("@tradejs/infra/timescale");
3538
+ var import_hyperliquidWhales = require("@tradejs/infra/timescale/hyperliquidWhales");
5188
3539
  var import_strategies2 = require("@tradejs/node/strategies");
5189
3540
 
5190
3541
  // src/lib/hyperliquidWhaleData.ts
@@ -5439,7 +3790,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
5439
3790
  };
5440
3791
  const fromMs = Math.floor(params.startMs / HYPERLIQUID_WHALE_BUCKET_MS) * HYPERLIQUID_WHALE_BUCKET_MS;
5441
3792
  const toMs = minuteCeil(params.endMs);
5442
- const cached = await (0, import_timescale4.hasHyperliquidWhaleBackfillCoverage)({
3793
+ const cached = await (0, import_hyperliquidWhales.hasHyperliquidWhaleBackfillCoverage)({
5443
3794
  fromMs,
5444
3795
  toMs,
5445
3796
  ...identity
@@ -5488,7 +3839,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
5488
3839
  items: whales.addresses,
5489
3840
  concurrency,
5490
3841
  worker: async (address) => {
5491
- const previous = await (0, import_timescale4.getHyperliquidWhaleWalletCoverage)({
3842
+ const previous = await (0, import_hyperliquidWhales.getHyperliquidWhaleWalletCoverage)({
5492
3843
  address,
5493
3844
  fromMs,
5494
3845
  toMs,
@@ -5515,8 +3866,8 @@ var backfillHyperliquidWhaleContext = async (params) => {
5515
3866
  identity
5516
3867
  })
5517
3868
  ).filter((row) => row != null);
5518
- await (0, import_timescale4.upsertHyperliquidWhaleTradeEvents)(addressEvents);
5519
- await (0, import_timescale4.upsertHyperliquidWhaleWalletCoverage)({
3869
+ await (0, import_hyperliquidWhales.upsertHyperliquidWhaleTradeEvents)(addressEvents);
3870
+ await (0, import_hyperliquidWhales.upsertHyperliquidWhaleWalletCoverage)({
5520
3871
  address,
5521
3872
  fromMs,
5522
3873
  toMs,
@@ -5534,7 +3885,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
5534
3885
  const normalizedError = error instanceof Error ? error : new Error(String(error));
5535
3886
  failures.push(normalizedError);
5536
3887
  failedWallets += 1;
5537
- await (0, import_timescale4.upsertHyperliquidWhaleWalletCoverage)({
3888
+ await (0, import_hyperliquidWhales.upsertHyperliquidWhaleWalletCoverage)({
5538
3889
  address,
5539
3890
  fromMs,
5540
3891
  toMs,
@@ -5553,7 +3904,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
5553
3904
  );
5554
3905
  }
5555
3906
  });
5556
- const buckets = await (0, import_timescale4.rebuildHyperliquidWhaleFlowRows)({
3907
+ const buckets = await (0, import_hyperliquidWhales.rebuildHyperliquidWhaleFlowRows)({
5557
3908
  fromMs,
5558
3909
  toMs,
5559
3910
  ...identity
@@ -5569,7 +3920,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
5569
3920
  }
5570
3921
  );
5571
3922
  let displayedCoverageBuckets = 0;
5572
- const coverageBuckets = await (0, import_timescale4.rebuildHyperliquidWhaleCoverageRows)({
3923
+ const coverageBuckets = await (0, import_hyperliquidWhales.rebuildHyperliquidWhaleCoverageRows)({
5573
3924
  fromMs,
5574
3925
  toMs,
5575
3926
  expectedWhales: whales.addresses.length,
@@ -5775,7 +4126,7 @@ var prepareMarketContextForRun = async (params) => {
5775
4126
  if (readableSources.length) {
5776
4127
  await timeOperation3(
5777
4128
  "market context schema ensure",
5778
- () => (0, import_timescale5.ensureMarketContextSchemas)(readableSources)
4129
+ () => (0, import_marketContext3.ensureMarketContextSchemas)(readableSources)
5779
4130
  );
5780
4131
  }
5781
4132
  if (requirements.derivatives.backfill) {
@@ -5852,11 +4203,11 @@ var markTestsStarted = () => {
5852
4203
  var setRuntimeCompareContext = ({
5853
4204
  connector,
5854
4205
  connectorName,
5855
- window: window2
4206
+ window
5856
4207
  }) => {
5857
4208
  runtimeCompareConnector = connector;
5858
4209
  runtimeCompareConnectorName = connectorName;
5859
- runtimeCompareWindow = window2;
4210
+ runtimeCompareWindow = window;
5860
4211
  };
5861
4212
  var getRuntimeCompareContext = () => ({
5862
4213
  connector: runtimeCompareConnector,
@@ -5949,6 +4300,10 @@ import_args.default.option(["f", "timeframe"], "Timeframe", 15);
5949
4300
  import_args.default.option(["d", "days"], "Run replay only for the last N days");
5950
4301
  import_args.default.option("startTime", "Explicit replay start timestamp (ms or seconds)");
5951
4302
  import_args.default.option("endTime", "Explicit replay end timestamp (ms or seconds)");
4303
+ import_args.default.option(
4304
+ "runtimeEvidence",
4305
+ "Immutable runtime evidence JSON used for offline runtime comparison"
4306
+ );
5952
4307
  import_args.default.option(["u", "updateOnly"], "Only update tickers history", false);
5953
4308
  import_args.default.option(["C", "cacheOnly"], "Do not update tickers history", false);
5954
4309
  import_args.default.option(
@@ -5974,6 +4329,7 @@ var replayFlags = import_args.default.parse(replayNormalizedArgv);
5974
4329
  var replayInterval = String(replayFlags.timeframe ?? 15);
5975
4330
  var replayUserName = String(replayFlags.user ?? "root");
5976
4331
  var replayProjectRoot = String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
4332
+ var replayRuntimeEvidencePath = typeof replayFlags.runtimeEvidence === "string" && replayFlags.runtimeEvidence.trim() ? replayFlags.runtimeEvidence.trim() : null;
5977
4333
  var isReplayUpdateOnlyRun = Boolean(replayFlags.updateOnly);
5978
4334
 
5979
4335
  // src/lib/replay/support.ts
@@ -8806,6 +7162,114 @@ var buildReplayExchangeComparisonDetails = ({
8806
7162
  };
8807
7163
  };
8808
7164
 
7165
+ // src/lib/replay/runtimeEvidenceSource.ts
7166
+ var import_promises2 = __toESM(require("fs/promises"));
7167
+ var import_node_path2 = __toESM(require("path"));
7168
+ var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
7169
+ var asFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : null;
7170
+ var unwrapRows = (value, field) => (Array.isArray(value) ? value : []).map((item) => {
7171
+ const row = asRecord(item);
7172
+ return asRecord(row?.[field]) ?? row;
7173
+ }).filter((item) => item != null);
7174
+ var buildRuntimeEvidenceLineageScopes = ({
7175
+ signals,
7176
+ evaluations
7177
+ }) => {
7178
+ const scopes = /* @__PURE__ */ new Map();
7179
+ const add = ({
7180
+ strategy,
7181
+ symbol,
7182
+ runtimeConfigId,
7183
+ timestamp,
7184
+ lineage
7185
+ }) => {
7186
+ if (!lineage || !Number.isFinite(timestamp)) {
7187
+ return;
7188
+ }
7189
+ const key = `${strategy}::${symbol}::${runtimeLineageKey(lineage)}`;
7190
+ const existing = scopes.get(key);
7191
+ scopes.set(key, {
7192
+ strategy,
7193
+ symbol,
7194
+ ...runtimeConfigId ? { runtimeConfigId } : {},
7195
+ lineage,
7196
+ firstTimestamp: existing ? Math.min(existing.firstTimestamp, timestamp) : timestamp,
7197
+ lastTimestamp: existing ? Math.max(existing.lastTimestamp, timestamp) : timestamp
7198
+ });
7199
+ };
7200
+ for (const signal of signals) {
7201
+ add({
7202
+ strategy: signal.strategy,
7203
+ symbol: signal.symbol,
7204
+ runtimeConfigId: signal.runtimeConfigId,
7205
+ timestamp: signal.timestamp,
7206
+ lineage: signal.runtimeLineage
7207
+ });
7208
+ }
7209
+ for (const evaluation of evaluations) {
7210
+ add({
7211
+ strategy: evaluation.strategy,
7212
+ symbol: evaluation.symbol,
7213
+ runtimeConfigId: evaluation.runtimeConfigId,
7214
+ timestamp: evaluation.timestamp,
7215
+ lineage: evaluation.runtimeLineage
7216
+ });
7217
+ }
7218
+ return [...scopes.values()].sort(
7219
+ (left, right) => left.strategy.localeCompare(right.strategy) || left.symbol.localeCompare(right.symbol) || left.firstTimestamp - right.firstTimestamp
7220
+ );
7221
+ };
7222
+ var loadReplayRuntimeEvidenceSource = async ({
7223
+ filePath,
7224
+ projectRoot,
7225
+ expectedUserName,
7226
+ expectedWindow
7227
+ }) => {
7228
+ const resolvedPath = import_node_path2.default.resolve(projectRoot, filePath);
7229
+ const root = asRecord(
7230
+ JSON.parse(await import_promises2.default.readFile(resolvedPath, "utf8"))
7231
+ );
7232
+ const runtime = asRecord(root?.runtime) ?? root;
7233
+ if (!root || !runtime) {
7234
+ throw new Error(`Invalid runtime evidence JSON: ${resolvedPath}`);
7235
+ }
7236
+ const rootWindow = asRecord(root.window);
7237
+ const runtimeWindow = asRecord(runtime.window);
7238
+ const startTime = asFiniteNumber(rootWindow?.startTime) ?? asFiniteNumber(runtimeWindow?.startTime);
7239
+ const endTime = asFiniteNumber(rootWindow?.endTime) ?? asFiniteNumber(runtimeWindow?.endTime);
7240
+ const userName = String(root.userName ?? runtime.userName ?? "").trim();
7241
+ if (!userName || userName !== expectedUserName) {
7242
+ throw new Error(
7243
+ `Runtime evidence user mismatch: expected=${expectedUserName}, actual=${userName || "missing"}`
7244
+ );
7245
+ }
7246
+ const endTimeMatches = endTime === expectedWindow.end || endTime === expectedWindow.end + 1;
7247
+ if (startTime !== expectedWindow.start || !endTimeMatches) {
7248
+ throw new Error(
7249
+ `Runtime evidence window mismatch: expected=${expectedWindow.start}..${expectedWindow.end}, actual=${startTime ?? "missing"}..${endTime ?? "missing"}`
7250
+ );
7251
+ }
7252
+ const trades = unwrapRows(runtime.trades, "trade");
7253
+ const signals = unwrapRows(runtime.signals, "signal");
7254
+ const evaluations = unwrapRows(
7255
+ runtime.evaluations,
7256
+ "evaluation"
7257
+ );
7258
+ return {
7259
+ path: resolvedPath,
7260
+ userName,
7261
+ startTime,
7262
+ endTime,
7263
+ trades,
7264
+ signals,
7265
+ evaluations,
7266
+ lineageScopes: buildRuntimeEvidenceLineageScopes({
7267
+ signals,
7268
+ evaluations
7269
+ })
7270
+ };
7271
+ };
7272
+
8809
7273
  // src/lib/replay/runtimeComparison.ts
8810
7274
  var getReplayEntryTimestampCompareOffsetMs = () => {
8811
7275
  const intervalMinutes = Number(replayInterval);
@@ -8908,11 +7372,11 @@ var filterReplayComparisonByLineage = ({
8908
7372
  expectedByScope
8909
7373
  });
8910
7374
  }
8911
- const window2 = deploymentWindows.get(
7375
+ const window = deploymentWindows.get(
8912
7376
  lineageScopeKey(trade.strategy, trade.symbol)
8913
7377
  );
8914
7378
  const signalTimestamp = trade.signalTimestamp ?? trade.entryTimestamp;
8915
- return window2 != null && signalTimestamp >= window2.firstTimestamp && signalTimestamp <= window2.lastTimestamp;
7379
+ return window != null && signalTimestamp >= window.firstTimestamp && signalTimestamp <= window.lastTimestamp;
8916
7380
  });
8917
7381
  for (const artifact of [
8918
7382
  ...comparableRuntimeSignals,
@@ -8926,11 +7390,11 @@ var filterReplayComparisonByLineage = ({
8926
7390
  });
8927
7391
  }
8928
7392
  const comparableBacktestEntries = backtestEntries.filter((entry) => {
8929
- const window2 = deploymentWindows.get(
7393
+ const window = deploymentWindows.get(
8930
7394
  lineageScopeKey(entry.strategy, entry.symbol)
8931
7395
  );
8932
7396
  const signalTimestamp = entry.signalTimestamp ?? entry.timestamp;
8933
- return window2 != null && signalTimestamp >= window2.firstTimestamp && signalTimestamp <= window2.lastTimestamp;
7397
+ return window != null && signalTimestamp >= window.firstTimestamp && signalTimestamp <= window.lastTimestamp;
8934
7398
  });
8935
7399
  const comparableScopeKeys = new Set(deploymentWindows.keys());
8936
7400
  return {
@@ -9342,11 +7806,11 @@ var saveAndPrintReplayExchangeComparison = async ({
9342
7806
  runtimeSignalEvaluations,
9343
7807
  lineage
9344
7808
  }) => {
9345
- const { connector, connectorName, window: window2 } = getRuntimeCompareContext();
7809
+ const { connector, connectorName, window } = getRuntimeCompareContext();
9346
7810
  const rawExchangeEntries = await loadExchangeEntriesForComparison({
9347
7811
  connector,
9348
- startTime: window2.start,
9349
- endTime: window2.end
7812
+ startTime: window.start,
7813
+ endTime: window.end
9350
7814
  });
9351
7815
  const strategyNameByOrderLinkKey = buildStrategyNameByOrderLinkKey(
9352
7816
  liveStrategySummaries.map((summary) => summary.strategyName)
@@ -9381,8 +7845,8 @@ var saveAndPrintReplayExchangeComparison = async ({
9381
7845
  console.log(
9382
7846
  import_chalk11.default.yellow(
9383
7847
  `SIGNALS REPLAY VS EXCHANGE: no lineage-linked exchange entry executions found for ${connectorName} in ${(0, import_time6.formatUnix)(
9384
- window2.start
9385
- )} -> ${(0, import_time6.formatUnix)(window2.end)}`
7848
+ window.start
7849
+ )} -> ${(0, import_time6.formatUnix)(window.end)}`
9386
7850
  )
9387
7851
  );
9388
7852
  console.log("");
@@ -9575,45 +8039,64 @@ var saveAndPrintReplayRuntimeComparison = async ({
9575
8039
  liveStrategySummaries,
9576
8040
  backtestEntries,
9577
8041
  replaySignals,
9578
- replayLineages
8042
+ replayLineages,
8043
+ runtimeEvidencePath
9579
8044
  }) => {
9580
- const { connector, connectorName, window: window2 } = getRuntimeCompareContext();
9581
- if (!connector || !window2) {
8045
+ const { connector, connectorName, window } = getRuntimeCompareContext();
8046
+ if (!connector || !window) {
9582
8047
  return null;
9583
8048
  }
9584
8049
  const relevantStrategies = new Set(
9585
8050
  liveStrategySummaries.map((summary) => summary.strategyName)
9586
8051
  );
9587
8052
  const replaySignalEvaluations = buildReplaySignalEvaluations(replaySignals);
8053
+ const runtimeEvidence = runtimeEvidencePath ? await loadReplayRuntimeEvidenceSource({
8054
+ filePath: runtimeEvidencePath,
8055
+ projectRoot: replayProjectRoot,
8056
+ expectedUserName: replayUserName,
8057
+ expectedWindow: window
8058
+ }) : null;
9588
8059
  const [
9589
8060
  rawRuntimeTrades,
9590
8061
  runtimeSignals,
9591
8062
  runtimeSignalEvaluations,
9592
8063
  runtimeLineageScopes
9593
- ] = await Promise.all([
8064
+ ] = runtimeEvidence ? [
8065
+ runtimeEvidence.trades,
8066
+ runtimeEvidence.signals,
8067
+ runtimeEvidence.evaluations,
8068
+ runtimeEvidence.lineageScopes
8069
+ ] : await Promise.all([
9594
8070
  loadRuntimeTrades(replayUserName, {
9595
- startTime: window2.start,
9596
- endTime: window2.end
8071
+ startTime: window.start,
8072
+ endTime: window.end
9597
8073
  }),
9598
8074
  loadRuntimeSignals(replayUserName, {
9599
- startTime: window2.start,
9600
- endTime: window2.end
8075
+ startTime: window.start,
8076
+ endTime: window.end
9601
8077
  }),
9602
8078
  loadRuntimeSignalEvaluations(replayUserName, {
9603
- startTime: window2.start,
9604
- endTime: window2.end
8079
+ startTime: window.start,
8080
+ endTime: window.end
9605
8081
  }),
9606
8082
  loadRuntimeLineageScopes(replayUserName, {
9607
- startTime: window2.start,
9608
- endTime: window2.end
8083
+ startTime: window.start,
8084
+ endTime: window.end
9609
8085
  })
9610
8086
  ]);
9611
- const syncedRuntimeTrades = await syncRuntimeTrades({
8087
+ if (runtimeEvidence) {
8088
+ console.log(
8089
+ import_chalk11.default.gray(
8090
+ `runtime compare: using immutable evidence ${runtimeEvidence.path}`
8091
+ )
8092
+ );
8093
+ }
8094
+ const syncedRuntimeTrades = runtimeEvidence ? rawRuntimeTrades : await syncRuntimeTrades({
9612
8095
  userName: replayUserName,
9613
8096
  connector,
9614
8097
  trades: rawRuntimeTrades,
9615
- startTime: window2.start,
9616
- endTime: window2.end,
8098
+ startTime: window.start,
8099
+ endTime: window.end,
9617
8100
  openPositionCallbacks: {
9618
8101
  onError: (error) => {
9619
8102
  console.log(
@@ -9657,15 +8140,15 @@ var saveAndPrintReplayRuntimeComparison = async ({
9657
8140
  });
9658
8141
  const comparableBacktestEntries = comparable.backtestEntries;
9659
8142
  const windowRuntimeTrades = comparable.runtimeTrades.filter(
9660
- (trade) => trade.entryTimestamp >= window2.start && trade.entryTimestamp < window2.end && relevantStrategies.has(trade.strategy)
8143
+ (trade) => trade.entryTimestamp >= window.start && trade.entryTimestamp < window.end && relevantStrategies.has(trade.strategy)
9661
8144
  );
9662
- if (!windowRuntimeTrades.length) {
8145
+ if (!windowRuntimeTrades.length && !runtimeEvidence) {
9663
8146
  console.log("");
9664
8147
  console.log(
9665
8148
  import_chalk11.default.yellow(
9666
8149
  `SIGNALS REPLAY VS RUNTIME: no local runtime trades found for ${connectorName} in ${(0, import_time6.formatUnix)(
9667
- window2.start
9668
- )} -> ${(0, import_time6.formatUnix)(window2.end)} with matching lineage; checking lineage-linked exchange executions`
8150
+ window.start
8151
+ )} -> ${(0, import_time6.formatUnix)(window.end)} with matching lineage; checking lineage-linked exchange executions`
9669
8152
  )
9670
8153
  );
9671
8154
  console.log("");
@@ -9791,8 +8274,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
9791
8274
  };
9792
8275
 
9793
8276
  // src/lib/replay/outputReport.ts
9794
- var import_promises2 = __toESM(require("fs/promises"));
9795
- var import_node_path2 = __toESM(require("path"));
8277
+ var import_promises3 = __toESM(require("fs/promises"));
8278
+ var import_node_path3 = __toESM(require("path"));
9796
8279
  var import_data = require("@tradejs/core/data");
9797
8280
  var formatMsk = (timestamp) => typeof timestamp === "number" && Number.isFinite(timestamp) ? new Intl.DateTimeFormat("ru-RU", {
9798
8281
  timeZone: "Europe/Moscow",
@@ -10090,14 +8573,14 @@ var writeReplayOutputReport = async ({
10090
8573
  connectorName,
10091
8574
  interval,
10092
8575
  tickers,
10093
- window: window2,
8576
+ window,
10094
8577
  durationSeconds,
10095
8578
  replayResult,
10096
8579
  strategySnapshot,
10097
8580
  runtimeComparison
10098
8581
  }) => {
10099
- const outputDir = import_node_path2.default.resolve(projectRoot, "data/replay/output");
10100
- await import_promises2.default.mkdir(outputDir, { recursive: true });
8582
+ const outputDir = import_node_path3.default.resolve(projectRoot, "data/replay/output");
8583
+ await import_promises3.default.mkdir(outputDir, { recursive: true });
10101
8584
  const perTradeAnalysis = buildPerTradeAnalysis(runtimeComparison);
10102
8585
  const report = {
10103
8586
  reportType: "replay-output",
@@ -10108,12 +8591,12 @@ var writeReplayOutputReport = async ({
10108
8591
  interval,
10109
8592
  command: process.argv.join(" "),
10110
8593
  window: {
10111
- startTime: window2.start,
10112
- endTime: window2.end,
10113
- startIso: new Date(window2.start).toISOString(),
10114
- endIso: new Date(window2.end).toISOString(),
10115
- startMsk: formatMsk(window2.start),
10116
- endMsk: formatMsk(window2.end)
8594
+ startTime: window.start,
8595
+ endTime: window.end,
8596
+ startIso: new Date(window.start).toISOString(),
8597
+ endIso: new Date(window.end).toISOString(),
8598
+ startMsk: formatMsk(window.start),
8599
+ endMsk: formatMsk(window.end)
10117
8600
  },
10118
8601
  durationSeconds,
10119
8602
  counts: {
@@ -10132,8 +8615,8 @@ var writeReplayOutputReport = async ({
10132
8615
  runtimeComparison,
10133
8616
  perTradeAnalysis
10134
8617
  };
10135
- const markdownPath = import_node_path2.default.join(outputDir, `${timestamp}-replay-report.md`);
10136
- const jsonPath = import_node_path2.default.join(outputDir, `${timestamp}-replay-report.json`);
8618
+ const markdownPath = import_node_path3.default.join(outputDir, `${timestamp}-replay-report.md`);
8619
+ const jsonPath = import_node_path3.default.join(outputDir, `${timestamp}-replay-report.json`);
10137
8620
  const lines = [
10138
8621
  "# Replay Report",
10139
8622
  "",
@@ -10150,7 +8633,7 @@ var writeReplayOutputReport = async ({
10150
8633
  ["Strategies", replayResult.strategies.length],
10151
8634
  ["Signals", replayResult.signals.length],
10152
8635
  ["Duration", `${durationSeconds.toFixed(2)}s`],
10153
- ["Window", `${formatMsk(window2.start)} - ${formatMsk(window2.end)} MSK`],
8636
+ ["Window", `${formatMsk(window.start)} - ${formatMsk(window.end)} MSK`],
10154
8637
  ["Runtime compare mode", runtimeComparison?.mode ?? "none"],
10155
8638
  ["Matched", runtimeComparison?.matchedCount ?? 0],
10156
8639
  ["Order failed", runtimeComparison?.orderFailedCount ?? 0],
@@ -10199,8 +8682,8 @@ var writeReplayOutputReport = async ({
10199
8682
  ""
10200
8683
  ];
10201
8684
  await Promise.all([
10202
- import_promises2.default.writeFile(markdownPath, lines.join("\n"), "utf8"),
10203
- import_promises2.default.writeFile(jsonPath, `${(0, import_data.toJson)(report, true)}
8685
+ import_promises3.default.writeFile(markdownPath, lines.join("\n"), "utf8"),
8686
+ import_promises3.default.writeFile(jsonPath, `${(0, import_data.toJson)(report, true)}
10204
8687
  `, "utf8")
10205
8688
  ]);
10206
8689
  return {
@@ -10231,7 +8714,7 @@ var finishReplay = async ({
10231
8714
  replayResult,
10232
8715
  tickers,
10233
8716
  connectorName,
10234
- window: window2
8717
+ window
10235
8718
  }) => {
10236
8719
  const replayStrategySnapshot = await saveAndPrintReplayResultsByStrategy({
10237
8720
  replayResult,
@@ -10241,7 +8724,8 @@ var finishReplay = async ({
10241
8724
  liveStrategySummaries: replayStrategySnapshot.summaries,
10242
8725
  backtestEntries: replayStrategySnapshot.backtestEntries,
10243
8726
  replaySignals: replayResult.signals,
10244
- replayLineages: replayResult.runtimeLineages
8727
+ replayLineages: replayResult.runtimeLineages,
8728
+ runtimeEvidencePath: replayRuntimeEvidencePath
10245
8729
  });
10246
8730
  const finishedAt = /* @__PURE__ */ new Date();
10247
8731
  const durationSeconds = Number(
@@ -10270,7 +8754,7 @@ var finishReplay = async ({
10270
8754
  connectorName,
10271
8755
  interval: replayInterval,
10272
8756
  tickers,
10273
- window: window2,
8757
+ window,
10274
8758
  durationSeconds,
10275
8759
  replayResult,
10276
8760
  strategySnapshot: replayStrategySnapshot,