@tradejs/cli 2.0.18 → 2.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/cli.js +14522 -15704
  2. package/dist/lib/aiExport.js +15 -1608
  3. package/dist/lib/aiPocketSearch.js +499 -67
  4. package/dist/lib/aiPocketSearchCli.js +113 -0
  5. package/dist/lib/aiTrainCharts.js +14 -1
  6. package/dist/lib/aiTrainMetrics.js +4 -1
  7. package/dist/lib/aiTrainResearch.js +88 -54
  8. package/dist/lib/binanceMarketContextBackfill.js +7 -6
  9. package/dist/lib/coinMarketCapContextBackfill.js +19 -18
  10. package/dist/lib/coreResearch.js +2738 -0
  11. package/dist/lib/derivativesContextBackfill.js +10 -9
  12. package/dist/lib/executionCalibration.js +6 -3
  13. package/dist/lib/hyperliquidWhaleBackfill.js +8 -8
  14. package/dist/lib/hyperliquidWhaleStream.js +4 -4
  15. package/dist/lib/marketContextPrepare.js +83 -1686
  16. package/dist/lib/runEnvironment.js +14 -1666
  17. package/dist/lib/runFormatting.js +1 -1607
  18. package/dist/lib/runtimeDebugEvidence.js +2 -48
  19. package/dist/lib/runtimeLineage.js +81 -48
  20. package/dist/lib/runtimeRedis.js +6 -57
  21. package/dist/lib/runtimeScorecard.js +153 -10
  22. package/dist/lib/runtimeStrategyBacktest.js +2 -48
  23. package/dist/lib/strategyGateFingerprint.js +80 -0
  24. package/dist/lib/strategyRelease.js +1365 -0
  25. package/dist/scripts/aiExport.js +17 -1610
  26. package/dist/scripts/aiPocketSearch.js +1070 -1770
  27. package/dist/scripts/aiTrain.js +108 -1688
  28. package/dist/scripts/backtest.js +120 -1760
  29. package/dist/scripts/binanceMarketIngest.js +5 -4
  30. package/dist/scripts/candlesMigrateProvider.js +6 -5186
  31. package/dist/scripts/cleanupMarketContext.js +4 -3
  32. package/dist/scripts/continuity.js +4 -3
  33. package/dist/scripts/coreResearch.js +2830 -0
  34. package/dist/scripts/derivativesIngest.js +6 -4
  35. package/dist/scripts/derivativesIngestCoinalyzeAll.js +5 -4
  36. package/dist/scripts/doctor.js +2 -5184
  37. package/dist/scripts/executionCalibration.js +6 -3
  38. package/dist/scripts/hyperliquidWhaleBackfill.js +8 -8
  39. package/dist/scripts/hyperliquidWhaleIngest.js +4 -4
  40. package/dist/scripts/hyperliquidWhalesUpdate.js +1 -1
  41. package/dist/scripts/migration.js +3 -3
  42. package/dist/scripts/mlExport.js +1 -1607
  43. package/dist/scripts/replay.js +239 -1855
  44. package/dist/scripts/replayRunner.js +239 -1855
  45. package/dist/scripts/replayRuntimeEvidence.js +29 -62
  46. package/dist/scripts/researchAuto.js +3 -49
  47. package/dist/scripts/results.js +1 -1607
  48. package/dist/scripts/runtimeEvidence.js +18 -56
  49. package/dist/scripts/runtimeParity.js +121 -1746
  50. package/dist/scripts/runtimeScorecard.js +883 -29
  51. package/dist/scripts/signals.js +1178 -2724
  52. package/dist/scripts/signalsDaemon.js +1183 -2696
  53. package/dist/scripts/signalsSummary.js +4 -26
  54. package/dist/scripts/strategyRelease.js +1469 -0
  55. package/dist/workers/testerWorker.js +2 -2
  56. package/package.json +13 -9
@@ -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 = (path4) => {
4353
- if (path4.includes("global-metrics")) return "global";
4354
- if (path4.includes("cryptocurrency/quotes")) return "reference";
4355
- if (path4.includes("exchange/quotes")) return "exchangeLiquidity";
4356
- if (path4.includes("fear-and-greed")) return "fearGreed";
4357
- if (path4.includes("cmc100")) return "cmc100";
4358
- if (path4.includes("cmc20")) return "cmc20";
4359
- return path4;
4360
- };
4361
- var recordCoinMarketCapFetchStats = (stats, path4, creditCount) => {
2703
+ var getCoinMarketCapPathLabel = (path5) => {
2704
+ if (path5.includes("global-metrics")) return "global";
2705
+ if (path5.includes("cryptocurrency/quotes")) return "reference";
2706
+ if (path5.includes("exchange/quotes")) return "exchangeLiquidity";
2707
+ if (path5.includes("fear-and-greed")) return "fearGreed";
2708
+ if (path5.includes("cmc100")) return "cmc100";
2709
+ if (path5.includes("cmc20")) return "cmc20";
2710
+ return path5;
2711
+ };
2712
+ var recordCoinMarketCapFetchStats = (stats, path5, creditCount) => {
4362
2713
  if (!stats) return;
4363
- const existing = stats.byPath.get(path4) ?? { requests: 0, credits: 0 };
2714
+ const existing = stats.byPath.get(path5) ?? { 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(path4, existing);
2719
+ stats.byPath.set(path5, existing);
4369
2720
  };
4370
2721
  var formatCoinMarketCapFetchStats = (stats) => {
4371
2722
  const byPath = [...stats.byPath.entries()].map(
4372
- ([path4, item]) => `${getCoinMarketCapPathLabel(path4)}=${item.requests}req/${item.credits}cr`
2723
+ ([path5, item]) => `${getCoinMarketCapPathLabel(path5)}=${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,
@@ -6550,11 +4901,56 @@ var invokeAfterSignalsHooks = async (hooks, params) => {
6550
4901
 
6551
4902
  // src/lib/runtimeLineage.ts
6552
4903
  var import_node_child_process = require("child_process");
4904
+ var import_node_crypto2 = require("crypto");
4905
+ var import_promises2 = __toESM(require("fs/promises"));
4906
+ var import_node_path2 = __toESM(require("path"));
4907
+ var import_types2 = require("@tradejs/types");
4908
+ var import_strategies3 = require("@tradejs/node/strategies");
4909
+
4910
+ // src/lib/strategyGateFingerprint.ts
6553
4911
  var import_node_crypto = require("crypto");
6554
4912
  var import_promises = __toESM(require("fs/promises"));
6555
4913
  var import_node_path = __toESM(require("path"));
6556
- var import_types2 = require("@tradejs/types");
6557
- var import_strategies3 = require("@tradejs/node/strategies");
4914
+ var gateFingerprintRelativePaths = (strategyName) => [
4915
+ `packages/strategies/src/${strategyName}/adapters/ai.ts`,
4916
+ `packages/strategies/src/${strategyName}/guardrails.ts`,
4917
+ `packages/strategies/src/${strategyName}/pockets.ts`,
4918
+ `packages/strategies/src/${strategyName}/config.ts`,
4919
+ "packages/strategies/src/shared/localAiGate.ts",
4920
+ "packages/node/src/ai.ts",
4921
+ "packages/core/src/utils/strategyHelpers/signalBuilders.ts"
4922
+ ];
4923
+ var resolveStrategyGateFingerprint = async ({
4924
+ projectRoot,
4925
+ strategyName,
4926
+ gitSha
4927
+ }) => {
4928
+ const candidates = await Promise.all(
4929
+ gateFingerprintRelativePaths(strategyName).map(async (relativePath) => {
4930
+ const content = await import_promises.default.readFile(import_node_path.default.join(projectRoot, relativePath)).catch(() => null);
4931
+ return content == null ? null : { relativePath, content };
4932
+ })
4933
+ );
4934
+ const sourceEntries = candidates.filter(
4935
+ (entry) => entry != null
4936
+ );
4937
+ const hash = (0, import_node_crypto.createHash)("sha256");
4938
+ hash.update(strategyName);
4939
+ if (sourceEntries.length) {
4940
+ for (const entry of sourceEntries) {
4941
+ hash.update(entry.relativePath);
4942
+ hash.update(entry.content);
4943
+ }
4944
+ } else {
4945
+ hash.update(gitSha ?? "unknown-git-sha");
4946
+ }
4947
+ return {
4948
+ gateFingerprint: hash.digest("hex").slice(0, 16),
4949
+ gateFingerprintFiles: sourceEntries.map((entry) => entry.relativePath)
4950
+ };
4951
+ };
4952
+
4953
+ // src/lib/runtimeLineage.ts
6558
4954
  var RUNTIME_CONTEXT_ENV_KEYS = [
6559
4955
  "AI_MODE",
6560
4956
  "MIN_AI_QUALITY",
@@ -6604,6 +5000,17 @@ var normalizeForStableJson = (value) => {
6604
5000
  }
6605
5001
  return value;
6606
5002
  };
5003
+ var normalizeRuntimeLogicConfig = (value) => {
5004
+ if (Array.isArray(value)) {
5005
+ return value.map(normalizeRuntimeLogicConfig);
5006
+ }
5007
+ if (value && typeof value === "object") {
5008
+ return Object.fromEntries(
5009
+ Object.entries(value).filter(([key]) => key !== "MAX_LOSS_VALUE").sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, normalizeRuntimeLogicConfig(entry)])
5010
+ );
5011
+ }
5012
+ return value;
5013
+ };
6607
5014
  var resolveRuntimeMaxLossValue = (config) => {
6608
5015
  if (!config || typeof config !== "object" || Array.isArray(config)) {
6609
5016
  return null;
@@ -6617,7 +5024,7 @@ var resolveRuntimeMaxLossValue = (config) => {
6617
5024
  );
6618
5025
  return Number.isFinite(maxLossValue) ? maxLossValue : null;
6619
5026
  };
6620
- var fingerprintRuntimeValue = (value) => (0, import_node_crypto.createHash)("sha256").update(JSON.stringify(normalizeForStableJson(value))).digest("hex").slice(0, 16);
5027
+ var fingerprintRuntimeValue = (value) => (0, import_node_crypto2.createHash)("sha256").update(JSON.stringify(normalizeForStableJson(value))).digest("hex").slice(0, 16);
6621
5028
  var gitLineageCache = /* @__PURE__ */ new Map();
6622
5029
  var gateFingerprintCache = /* @__PURE__ */ new Map();
6623
5030
  var binanceBreadthFingerprintCache = /* @__PURE__ */ new Map();
@@ -6668,7 +5075,7 @@ var resolveGitLineage = (projectRoot) => {
6668
5075
  };
6669
5076
  var readOptionalFile = async (filePath) => {
6670
5077
  try {
6671
- return await import_promises.default.readFile(filePath);
5078
+ return await import_promises2.default.readFile(filePath);
6672
5079
  } catch {
6673
5080
  return null;
6674
5081
  }
@@ -6678,7 +5085,7 @@ var resolveBinanceBreadthFingerprint = async (projectRoot) => {
6678
5085
  return binanceBreadthFingerprintCache.get(projectRoot) ?? null;
6679
5086
  }
6680
5087
  const content = await readOptionalFile(
6681
- import_node_path.default.join(
5088
+ import_node_path2.default.join(
6682
5089
  projectRoot,
6683
5090
  "packages/node/src/config/binanceBreadthUniverses.json"
6684
5091
  )
@@ -6700,7 +5107,7 @@ var resolveSnapshotFingerprint = async (projectRoot, relativePath) => {
6700
5107
  if (snapshotFingerprintCache.has(cacheKey)) {
6701
5108
  return snapshotFingerprintCache.get(cacheKey) ?? null;
6702
5109
  }
6703
- const content = await readOptionalFile(import_node_path.default.join(projectRoot, relativePath));
5110
+ const content = await readOptionalFile(import_node_path2.default.join(projectRoot, relativePath));
6704
5111
  let result = null;
6705
5112
  if (content) {
6706
5113
  try {
@@ -6713,55 +5120,26 @@ var resolveSnapshotFingerprint = async (projectRoot, relativePath) => {
6713
5120
  snapshotFingerprintCache.set(cacheKey, result);
6714
5121
  return result;
6715
5122
  };
6716
- var resolveGateFingerprint = async ({
5123
+ var resolveRuntimeGateFingerprint = async ({
6717
5124
  projectRoot,
6718
5125
  strategyName,
6719
5126
  gitSha
6720
5127
  }) => {
6721
5128
  const cacheKey = `${projectRoot}:${strategyName}:${gitSha ?? "unknown"}`;
6722
5129
  const cached = gateFingerprintCache.get(cacheKey);
6723
- if (cached) {
6724
- return cached;
6725
- }
6726
- const relativeCandidates = [
6727
- `packages/strategies/src/${strategyName}/adapters/ai.ts`,
6728
- `packages/strategies/src/${strategyName}/guardrails.ts`,
6729
- `packages/strategies/src/${strategyName}/pockets.ts`,
6730
- `packages/strategies/src/${strategyName}/config.ts`,
6731
- "packages/node/src/ai.ts",
6732
- "packages/core/src/utils/strategyHelpers/signalBuilders.ts"
6733
- ];
6734
- const optionalEntries = await Promise.all(
6735
- relativeCandidates.map(async (relativePath) => {
6736
- const content = await readOptionalFile(
6737
- import_node_path.default.join(projectRoot, relativePath)
6738
- );
6739
- return content == null ? null : { relativePath, content };
6740
- })
6741
- );
6742
- const sourceEntries = [];
6743
- for (const entry of optionalEntries) {
6744
- if (entry != null) {
6745
- sourceEntries.push(entry);
6746
- }
6747
- }
6748
- const hash = (0, import_node_crypto.createHash)("sha256");
6749
- hash.update(strategyName);
6750
- if (sourceEntries.length) {
6751
- for (const entry of sourceEntries) {
6752
- hash.update(entry.relativePath);
6753
- hash.update(entry.content);
6754
- }
6755
- } else {
6756
- hash.update(gitSha ?? "unknown-git-sha");
6757
- }
6758
- const fingerprint = hash.digest("hex").slice(0, 16);
6759
- gateFingerprintCache.set(cacheKey, fingerprint);
6760
- return fingerprint;
5130
+ if (cached) return cached;
5131
+ const result = await resolveStrategyGateFingerprint({
5132
+ projectRoot,
5133
+ strategyName,
5134
+ gitSha
5135
+ });
5136
+ gateFingerprintCache.set(cacheKey, result);
5137
+ return result;
6761
5138
  };
6762
5139
  var buildRuntimeLineage = async ({
6763
5140
  projectRoot,
6764
5141
  strategyName,
5142
+ compositionId,
6765
5143
  config,
6766
5144
  runContext,
6767
5145
  env = process.env
@@ -6787,19 +5165,25 @@ var buildRuntimeLineage = async ({
6787
5165
  };
6788
5166
  return {
6789
5167
  schemaVersion: 1,
5168
+ compositionId: compositionId?.trim() || null,
6790
5169
  ...git,
6791
- gateFingerprint: await resolveGateFingerprint({
5170
+ gateFingerprint: (await resolveRuntimeGateFingerprint({
6792
5171
  projectRoot,
6793
5172
  strategyName,
6794
5173
  gitSha: git.gitSha
6795
- }),
6796
- configFingerprint: fingerprintRuntimeValue(config),
5174
+ })).gateFingerprint,
5175
+ // Position risk is tracked separately so changing trade size does not
5176
+ // masquerade as a change to the core + gate decision logic.
5177
+ configFingerprint: fingerprintRuntimeValue(
5178
+ normalizeRuntimeLogicConfig(config)
5179
+ ),
6797
5180
  contextFingerprint: fingerprintRuntimeValue(context),
6798
5181
  maxLossValue: resolveRuntimeMaxLossValue(config)
6799
5182
  };
6800
5183
  };
6801
5184
  var runtimeLineageKey = (lineage) => [
6802
5185
  lineage.schemaVersion,
5186
+ lineage.compositionId ?? "unbound-composition",
6803
5187
  lineage.gitSha ?? "unknown",
6804
5188
  lineage.gitDirty == null ? "unknown" : lineage.gitDirty ? "dirty" : "clean",
6805
5189
  lineage.gateFingerprint,
@@ -8812,8 +7196,8 @@ var buildReplayExchangeComparisonDetails = ({
8812
7196
  };
8813
7197
 
8814
7198
  // src/lib/replay/runtimeEvidenceSource.ts
8815
- var import_promises2 = __toESM(require("fs/promises"));
8816
- var import_node_path2 = __toESM(require("path"));
7199
+ var import_promises3 = __toESM(require("fs/promises"));
7200
+ var import_node_path3 = __toESM(require("path"));
8817
7201
  var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
8818
7202
  var asFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : null;
8819
7203
  var unwrapRows = (value, field) => (Array.isArray(value) ? value : []).map((item) => {
@@ -8874,9 +7258,9 @@ var loadReplayRuntimeEvidenceSource = async ({
8874
7258
  expectedUserName,
8875
7259
  expectedWindow
8876
7260
  }) => {
8877
- const resolvedPath = import_node_path2.default.resolve(projectRoot, filePath);
7261
+ const resolvedPath = import_node_path3.default.resolve(projectRoot, filePath);
8878
7262
  const root = asRecord(
8879
- JSON.parse(await import_promises2.default.readFile(resolvedPath, "utf8"))
7263
+ JSON.parse(await import_promises3.default.readFile(resolvedPath, "utf8"))
8880
7264
  );
8881
7265
  const runtime = asRecord(root?.runtime) ?? root;
8882
7266
  if (!root || !runtime) {
@@ -9021,11 +7405,11 @@ var filterReplayComparisonByLineage = ({
9021
7405
  expectedByScope
9022
7406
  });
9023
7407
  }
9024
- const window2 = deploymentWindows.get(
7408
+ const window = deploymentWindows.get(
9025
7409
  lineageScopeKey(trade.strategy, trade.symbol)
9026
7410
  );
9027
7411
  const signalTimestamp = trade.signalTimestamp ?? trade.entryTimestamp;
9028
- return window2 != null && signalTimestamp >= window2.firstTimestamp && signalTimestamp <= window2.lastTimestamp;
7412
+ return window != null && signalTimestamp >= window.firstTimestamp && signalTimestamp <= window.lastTimestamp;
9029
7413
  });
9030
7414
  for (const artifact of [
9031
7415
  ...comparableRuntimeSignals,
@@ -9039,11 +7423,11 @@ var filterReplayComparisonByLineage = ({
9039
7423
  });
9040
7424
  }
9041
7425
  const comparableBacktestEntries = backtestEntries.filter((entry) => {
9042
- const window2 = deploymentWindows.get(
7426
+ const window = deploymentWindows.get(
9043
7427
  lineageScopeKey(entry.strategy, entry.symbol)
9044
7428
  );
9045
7429
  const signalTimestamp = entry.signalTimestamp ?? entry.timestamp;
9046
- return window2 != null && signalTimestamp >= window2.firstTimestamp && signalTimestamp <= window2.lastTimestamp;
7430
+ return window != null && signalTimestamp >= window.firstTimestamp && signalTimestamp <= window.lastTimestamp;
9047
7431
  });
9048
7432
  const comparableScopeKeys = new Set(deploymentWindows.keys());
9049
7433
  return {
@@ -9455,11 +7839,11 @@ var saveAndPrintReplayExchangeComparison = async ({
9455
7839
  runtimeSignalEvaluations,
9456
7840
  lineage
9457
7841
  }) => {
9458
- const { connector, connectorName, window: window2 } = getRuntimeCompareContext();
7842
+ const { connector, connectorName, window } = getRuntimeCompareContext();
9459
7843
  const rawExchangeEntries = await loadExchangeEntriesForComparison({
9460
7844
  connector,
9461
- startTime: window2.start,
9462
- endTime: window2.end
7845
+ startTime: window.start,
7846
+ endTime: window.end
9463
7847
  });
9464
7848
  const strategyNameByOrderLinkKey = buildStrategyNameByOrderLinkKey(
9465
7849
  liveStrategySummaries.map((summary) => summary.strategyName)
@@ -9494,8 +7878,8 @@ var saveAndPrintReplayExchangeComparison = async ({
9494
7878
  console.log(
9495
7879
  import_chalk11.default.yellow(
9496
7880
  `SIGNALS REPLAY VS EXCHANGE: no lineage-linked exchange entry executions found for ${connectorName} in ${(0, import_time6.formatUnix)(
9497
- window2.start
9498
- )} -> ${(0, import_time6.formatUnix)(window2.end)}`
7881
+ window.start
7882
+ )} -> ${(0, import_time6.formatUnix)(window.end)}`
9499
7883
  )
9500
7884
  );
9501
7885
  console.log("");
@@ -9691,8 +8075,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
9691
8075
  replayLineages,
9692
8076
  runtimeEvidencePath
9693
8077
  }) => {
9694
- const { connector, connectorName, window: window2 } = getRuntimeCompareContext();
9695
- if (!connector || !window2) {
8078
+ const { connector, connectorName, window } = getRuntimeCompareContext();
8079
+ if (!connector || !window) {
9696
8080
  return null;
9697
8081
  }
9698
8082
  const relevantStrategies = new Set(
@@ -9703,7 +8087,7 @@ var saveAndPrintReplayRuntimeComparison = async ({
9703
8087
  filePath: runtimeEvidencePath,
9704
8088
  projectRoot: replayProjectRoot,
9705
8089
  expectedUserName: replayUserName,
9706
- expectedWindow: window2
8090
+ expectedWindow: window
9707
8091
  }) : null;
9708
8092
  const [
9709
8093
  rawRuntimeTrades,
@@ -9717,20 +8101,20 @@ var saveAndPrintReplayRuntimeComparison = async ({
9717
8101
  runtimeEvidence.lineageScopes
9718
8102
  ] : await Promise.all([
9719
8103
  loadRuntimeTrades(replayUserName, {
9720
- startTime: window2.start,
9721
- endTime: window2.end
8104
+ startTime: window.start,
8105
+ endTime: window.end
9722
8106
  }),
9723
8107
  loadRuntimeSignals(replayUserName, {
9724
- startTime: window2.start,
9725
- endTime: window2.end
8108
+ startTime: window.start,
8109
+ endTime: window.end
9726
8110
  }),
9727
8111
  loadRuntimeSignalEvaluations(replayUserName, {
9728
- startTime: window2.start,
9729
- endTime: window2.end
8112
+ startTime: window.start,
8113
+ endTime: window.end
9730
8114
  }),
9731
8115
  loadRuntimeLineageScopes(replayUserName, {
9732
- startTime: window2.start,
9733
- endTime: window2.end
8116
+ startTime: window.start,
8117
+ endTime: window.end
9734
8118
  })
9735
8119
  ]);
9736
8120
  if (runtimeEvidence) {
@@ -9744,8 +8128,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
9744
8128
  userName: replayUserName,
9745
8129
  connector,
9746
8130
  trades: rawRuntimeTrades,
9747
- startTime: window2.start,
9748
- endTime: window2.end,
8131
+ startTime: window.start,
8132
+ endTime: window.end,
9749
8133
  openPositionCallbacks: {
9750
8134
  onError: (error) => {
9751
8135
  console.log(
@@ -9789,15 +8173,15 @@ var saveAndPrintReplayRuntimeComparison = async ({
9789
8173
  });
9790
8174
  const comparableBacktestEntries = comparable.backtestEntries;
9791
8175
  const windowRuntimeTrades = comparable.runtimeTrades.filter(
9792
- (trade) => trade.entryTimestamp >= window2.start && trade.entryTimestamp < window2.end && relevantStrategies.has(trade.strategy)
8176
+ (trade) => trade.entryTimestamp >= window.start && trade.entryTimestamp < window.end && relevantStrategies.has(trade.strategy)
9793
8177
  );
9794
8178
  if (!windowRuntimeTrades.length && !runtimeEvidence) {
9795
8179
  console.log("");
9796
8180
  console.log(
9797
8181
  import_chalk11.default.yellow(
9798
8182
  `SIGNALS REPLAY VS RUNTIME: no local runtime trades found for ${connectorName} in ${(0, import_time6.formatUnix)(
9799
- window2.start
9800
- )} -> ${(0, import_time6.formatUnix)(window2.end)} with matching lineage; checking lineage-linked exchange executions`
8183
+ window.start
8184
+ )} -> ${(0, import_time6.formatUnix)(window.end)} with matching lineage; checking lineage-linked exchange executions`
9801
8185
  )
9802
8186
  );
9803
8187
  console.log("");
@@ -9923,8 +8307,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
9923
8307
  };
9924
8308
 
9925
8309
  // src/lib/replay/outputReport.ts
9926
- var import_promises3 = __toESM(require("fs/promises"));
9927
- var import_node_path3 = __toESM(require("path"));
8310
+ var import_promises4 = __toESM(require("fs/promises"));
8311
+ var import_node_path4 = __toESM(require("path"));
9928
8312
  var import_data = require("@tradejs/core/data");
9929
8313
  var formatMsk = (timestamp) => typeof timestamp === "number" && Number.isFinite(timestamp) ? new Intl.DateTimeFormat("ru-RU", {
9930
8314
  timeZone: "Europe/Moscow",
@@ -10222,14 +8606,14 @@ var writeReplayOutputReport = async ({
10222
8606
  connectorName,
10223
8607
  interval,
10224
8608
  tickers,
10225
- window: window2,
8609
+ window,
10226
8610
  durationSeconds,
10227
8611
  replayResult,
10228
8612
  strategySnapshot,
10229
8613
  runtimeComparison
10230
8614
  }) => {
10231
- const outputDir = import_node_path3.default.resolve(projectRoot, "data/replay/output");
10232
- await import_promises3.default.mkdir(outputDir, { recursive: true });
8615
+ const outputDir = import_node_path4.default.resolve(projectRoot, "data/replay/output");
8616
+ await import_promises4.default.mkdir(outputDir, { recursive: true });
10233
8617
  const perTradeAnalysis = buildPerTradeAnalysis(runtimeComparison);
10234
8618
  const report = {
10235
8619
  reportType: "replay-output",
@@ -10240,12 +8624,12 @@ var writeReplayOutputReport = async ({
10240
8624
  interval,
10241
8625
  command: process.argv.join(" "),
10242
8626
  window: {
10243
- startTime: window2.start,
10244
- endTime: window2.end,
10245
- startIso: new Date(window2.start).toISOString(),
10246
- endIso: new Date(window2.end).toISOString(),
10247
- startMsk: formatMsk(window2.start),
10248
- endMsk: formatMsk(window2.end)
8627
+ startTime: window.start,
8628
+ endTime: window.end,
8629
+ startIso: new Date(window.start).toISOString(),
8630
+ endIso: new Date(window.end).toISOString(),
8631
+ startMsk: formatMsk(window.start),
8632
+ endMsk: formatMsk(window.end)
10249
8633
  },
10250
8634
  durationSeconds,
10251
8635
  counts: {
@@ -10264,8 +8648,8 @@ var writeReplayOutputReport = async ({
10264
8648
  runtimeComparison,
10265
8649
  perTradeAnalysis
10266
8650
  };
10267
- const markdownPath = import_node_path3.default.join(outputDir, `${timestamp}-replay-report.md`);
10268
- const jsonPath = import_node_path3.default.join(outputDir, `${timestamp}-replay-report.json`);
8651
+ const markdownPath = import_node_path4.default.join(outputDir, `${timestamp}-replay-report.md`);
8652
+ const jsonPath = import_node_path4.default.join(outputDir, `${timestamp}-replay-report.json`);
10269
8653
  const lines = [
10270
8654
  "# Replay Report",
10271
8655
  "",
@@ -10282,7 +8666,7 @@ var writeReplayOutputReport = async ({
10282
8666
  ["Strategies", replayResult.strategies.length],
10283
8667
  ["Signals", replayResult.signals.length],
10284
8668
  ["Duration", `${durationSeconds.toFixed(2)}s`],
10285
- ["Window", `${formatMsk(window2.start)} - ${formatMsk(window2.end)} MSK`],
8669
+ ["Window", `${formatMsk(window.start)} - ${formatMsk(window.end)} MSK`],
10286
8670
  ["Runtime compare mode", runtimeComparison?.mode ?? "none"],
10287
8671
  ["Matched", runtimeComparison?.matchedCount ?? 0],
10288
8672
  ["Order failed", runtimeComparison?.orderFailedCount ?? 0],
@@ -10331,8 +8715,8 @@ var writeReplayOutputReport = async ({
10331
8715
  ""
10332
8716
  ];
10333
8717
  await Promise.all([
10334
- import_promises3.default.writeFile(markdownPath, lines.join("\n"), "utf8"),
10335
- import_promises3.default.writeFile(jsonPath, `${(0, import_data.toJson)(report, true)}
8718
+ import_promises4.default.writeFile(markdownPath, lines.join("\n"), "utf8"),
8719
+ import_promises4.default.writeFile(jsonPath, `${(0, import_data.toJson)(report, true)}
10336
8720
  `, "utf8")
10337
8721
  ]);
10338
8722
  return {
@@ -10363,7 +8747,7 @@ var finishReplay = async ({
10363
8747
  replayResult,
10364
8748
  tickers,
10365
8749
  connectorName,
10366
- window: window2
8750
+ window
10367
8751
  }) => {
10368
8752
  const replayStrategySnapshot = await saveAndPrintReplayResultsByStrategy({
10369
8753
  replayResult,
@@ -10403,7 +8787,7 @@ var finishReplay = async ({
10403
8787
  connectorName,
10404
8788
  interval: replayInterval,
10405
8789
  tickers,
10406
- window: window2,
8790
+ window,
10407
8791
  durationSeconds,
10408
8792
  replayResult,
10409
8793
  strategySnapshot: replayStrategySnapshot,