@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.
- package/dist/cli.js +14522 -15704
- package/dist/lib/aiExport.js +15 -1608
- package/dist/lib/aiPocketSearch.js +499 -67
- package/dist/lib/aiPocketSearchCli.js +113 -0
- package/dist/lib/aiTrainCharts.js +14 -1
- package/dist/lib/aiTrainMetrics.js +4 -1
- package/dist/lib/aiTrainResearch.js +88 -54
- package/dist/lib/binanceMarketContextBackfill.js +7 -6
- package/dist/lib/coinMarketCapContextBackfill.js +19 -18
- package/dist/lib/coreResearch.js +2738 -0
- package/dist/lib/derivativesContextBackfill.js +10 -9
- package/dist/lib/executionCalibration.js +6 -3
- package/dist/lib/hyperliquidWhaleBackfill.js +8 -8
- package/dist/lib/hyperliquidWhaleStream.js +4 -4
- package/dist/lib/marketContextPrepare.js +83 -1686
- package/dist/lib/runEnvironment.js +14 -1666
- package/dist/lib/runFormatting.js +1 -1607
- package/dist/lib/runtimeDebugEvidence.js +2 -48
- package/dist/lib/runtimeLineage.js +81 -48
- package/dist/lib/runtimeRedis.js +6 -57
- package/dist/lib/runtimeScorecard.js +153 -10
- package/dist/lib/runtimeStrategyBacktest.js +2 -48
- package/dist/lib/strategyGateFingerprint.js +80 -0
- package/dist/lib/strategyRelease.js +1365 -0
- package/dist/scripts/aiExport.js +17 -1610
- package/dist/scripts/aiPocketSearch.js +1070 -1770
- package/dist/scripts/aiTrain.js +108 -1688
- package/dist/scripts/backtest.js +120 -1760
- package/dist/scripts/binanceMarketIngest.js +5 -4
- package/dist/scripts/candlesMigrateProvider.js +6 -5186
- package/dist/scripts/cleanupMarketContext.js +4 -3
- package/dist/scripts/continuity.js +4 -3
- package/dist/scripts/coreResearch.js +2830 -0
- package/dist/scripts/derivativesIngest.js +6 -4
- package/dist/scripts/derivativesIngestCoinalyzeAll.js +5 -4
- package/dist/scripts/doctor.js +2 -5184
- package/dist/scripts/executionCalibration.js +6 -3
- package/dist/scripts/hyperliquidWhaleBackfill.js +8 -8
- package/dist/scripts/hyperliquidWhaleIngest.js +4 -4
- package/dist/scripts/hyperliquidWhalesUpdate.js +1 -1
- package/dist/scripts/migration.js +3 -3
- package/dist/scripts/mlExport.js +1 -1607
- package/dist/scripts/replay.js +239 -1855
- package/dist/scripts/replayRunner.js +239 -1855
- package/dist/scripts/replayRuntimeEvidence.js +29 -62
- package/dist/scripts/researchAuto.js +3 -49
- package/dist/scripts/results.js +1 -1607
- package/dist/scripts/runtimeEvidence.js +18 -56
- package/dist/scripts/runtimeParity.js +121 -1746
- package/dist/scripts/runtimeScorecard.js +883 -29
- package/dist/scripts/signals.js +1178 -2724
- package/dist/scripts/signalsDaemon.js +1183 -2696
- package/dist/scripts/signalsSummary.js +4 -26
- package/dist/scripts/strategyRelease.js +1469 -0
- package/dist/workers/testerWorker.js +2 -2
- 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/replayRunner.ts
|
|
1637
31
|
var replayRunner_exports = {};
|
|
1638
32
|
__export(replayRunner_exports, {
|
|
@@ -1652,7 +46,7 @@ var import_redis6 = require("@tradejs/infra/redis");
|
|
|
1652
46
|
|
|
1653
47
|
// src/lib/runFormatting.ts
|
|
1654
48
|
var import_date_fns = require("date-fns");
|
|
1655
|
-
var ListIt =
|
|
49
|
+
var ListIt = require("list-it");
|
|
1656
50
|
var createListIt = () => new ListIt({
|
|
1657
51
|
autoAlign: true,
|
|
1658
52
|
headerUnderline: true
|
|
@@ -1716,20 +110,20 @@ var resolveTimeWindow = ({
|
|
|
1716
110
|
const explicitStart = toEpochMs(startTime);
|
|
1717
111
|
const explicitEnd = toEpochMs(endTime);
|
|
1718
112
|
const resolvedDays = toPositiveNumber(days);
|
|
1719
|
-
const alignToLastClosedInterval = (
|
|
113
|
+
const alignToLastClosedInterval = (window, preserveDuration) => {
|
|
1720
114
|
if (typeof closedIntervalMs !== "number" || !Number.isFinite(closedIntervalMs) || closedIntervalMs <= 0) {
|
|
1721
|
-
return
|
|
115
|
+
return window;
|
|
1722
116
|
}
|
|
1723
|
-
const alignedEnd = Math.floor(
|
|
1724
|
-
const delta =
|
|
1725
|
-
const alignedStart = preserveDuration ?
|
|
117
|
+
const alignedEnd = Math.floor(window.end / closedIntervalMs) * closedIntervalMs - 1;
|
|
118
|
+
const delta = window.end - alignedEnd;
|
|
119
|
+
const alignedStart = preserveDuration ? window.start - delta : window.start;
|
|
1726
120
|
if (alignedStart >= alignedEnd) {
|
|
1727
121
|
throw new Error(
|
|
1728
122
|
`Invalid closed-candle window: start (${alignedStart}) must be less than end (${alignedEnd})`
|
|
1729
123
|
);
|
|
1730
124
|
}
|
|
1731
125
|
return {
|
|
1732
|
-
...
|
|
126
|
+
...window,
|
|
1733
127
|
start: Math.trunc(alignedStart),
|
|
1734
128
|
end: Math.trunc(alignedEnd)
|
|
1735
129
|
};
|
|
@@ -1790,17 +184,7 @@ var import_chalk = __toESM(require("chalk"));
|
|
|
1790
184
|
// src/lib/runtimeRedis.ts
|
|
1791
185
|
var import_redis = require("@tradejs/infra/redis");
|
|
1792
186
|
var import_time = require("@tradejs/core/time");
|
|
1793
|
-
var
|
|
1794
|
-
var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
|
|
1795
|
-
var resolveStrategyConfigIdentityByKey = (userName, key) => {
|
|
1796
|
-
const parts = key.split(":");
|
|
1797
|
-
if (parts.length !== 5) return null;
|
|
1798
|
-
const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
|
|
1799
|
-
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)) {
|
|
1800
|
-
return null;
|
|
1801
|
-
}
|
|
1802
|
-
return { strategyName, configId };
|
|
1803
|
-
};
|
|
187
|
+
var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
|
|
1804
188
|
var isRuntimeStrategyEnabled = (strategyConfig) => {
|
|
1805
189
|
const enabled = strategyConfig.ENABLE;
|
|
1806
190
|
return enabled !== false;
|
|
@@ -1812,42 +196,6 @@ var isRuntimeTradeRecord = (value) => {
|
|
|
1812
196
|
const record = value;
|
|
1813
197
|
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");
|
|
1814
198
|
};
|
|
1815
|
-
var resolveStrategyNameByConfigKey = (userName, key) => {
|
|
1816
|
-
return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
|
|
1817
|
-
};
|
|
1818
|
-
var getRuntimeStrategyConfigKeys = async (userName) => {
|
|
1819
|
-
const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
|
|
1820
|
-
return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
|
|
1821
|
-
};
|
|
1822
|
-
var loadRuntimeStrategyConfigs = async (userName, {
|
|
1823
|
-
onInvalidConfig
|
|
1824
|
-
} = {}) => {
|
|
1825
|
-
const configKeys = await getRuntimeStrategyConfigKeys(userName);
|
|
1826
|
-
const strategyConfigs = await Promise.all(
|
|
1827
|
-
configKeys.map(async (key) => {
|
|
1828
|
-
const strategyName = resolveStrategyNameByConfigKey(userName, key);
|
|
1829
|
-
const identity = resolveStrategyConfigIdentityByKey(userName, key);
|
|
1830
|
-
if (!strategyName || !identity) {
|
|
1831
|
-
return null;
|
|
1832
|
-
}
|
|
1833
|
-
const strategyConfig = await (0, import_redis.getData)(
|
|
1834
|
-
key,
|
|
1835
|
-
null
|
|
1836
|
-
);
|
|
1837
|
-
if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
|
|
1838
|
-
onInvalidConfig?.(key);
|
|
1839
|
-
return null;
|
|
1840
|
-
}
|
|
1841
|
-
return {
|
|
1842
|
-
key,
|
|
1843
|
-
strategyName,
|
|
1844
|
-
configId: identity.configId,
|
|
1845
|
-
strategyConfig
|
|
1846
|
-
};
|
|
1847
|
-
})
|
|
1848
|
-
);
|
|
1849
|
-
return strategyConfigs.filter(Boolean);
|
|
1850
|
-
};
|
|
1851
199
|
var loadRuntimeTrades = async (userName, {
|
|
1852
200
|
startTime,
|
|
1853
201
|
endTime
|
|
@@ -1897,7 +245,7 @@ var toStrategyConfigGrid = (strategyConfig) => Object.fromEntries(
|
|
|
1897
245
|
Object.entries(strategyConfig).filter(([key]) => !BACKTEST_CLI_RUNTIME_CONFIG_KEYS.has(key)).map(([key, value]) => [key, [value]])
|
|
1898
246
|
);
|
|
1899
247
|
var loadRuntimeStrategyBacktestConfigs = async (userName) => {
|
|
1900
|
-
const configs = await loadRuntimeStrategyConfigs(userName, {
|
|
248
|
+
const configs = await (0, import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs)(userName, {
|
|
1901
249
|
onInvalidConfig: (key) => {
|
|
1902
250
|
console.log(import_chalk.default.yellow(`Skip invalid runtime strategy config: ${key}`));
|
|
1903
251
|
}
|
|
@@ -2280,7 +628,7 @@ var prepareRunEnvironment = async ({
|
|
|
2280
628
|
instrument
|
|
2281
629
|
])
|
|
2282
630
|
);
|
|
2283
|
-
const
|
|
631
|
+
const window = resolveTimeWindow({
|
|
2284
632
|
days,
|
|
2285
633
|
startTime,
|
|
2286
634
|
endTime,
|
|
@@ -2289,7 +637,7 @@ var prepareRunEnvironment = async ({
|
|
|
2289
637
|
closedIntervalMs
|
|
2290
638
|
});
|
|
2291
639
|
const preloadStart = (0, import_time2.getBacktestPreloadStart)(
|
|
2292
|
-
|
|
640
|
+
window.start,
|
|
2293
641
|
import_constants.BACKTEST_PRELOAD_DAYS
|
|
2294
642
|
);
|
|
2295
643
|
if (!cacheOnly) {
|
|
@@ -2309,7 +657,7 @@ var prepareRunEnvironment = async ({
|
|
|
2309
657
|
interval,
|
|
2310
658
|
symbols: loadedTickers,
|
|
2311
659
|
preloadStart,
|
|
2312
|
-
preloadEnd:
|
|
660
|
+
preloadEnd: window.end,
|
|
2313
661
|
universe,
|
|
2314
662
|
log: (message) => console.log(import_chalk3.default.gray(message))
|
|
2315
663
|
});
|
|
@@ -2325,7 +673,7 @@ var prepareRunEnvironment = async ({
|
|
|
2325
673
|
{
|
|
2326
674
|
connectorLabel: connectorName,
|
|
2327
675
|
preloadStart,
|
|
2328
|
-
preloadEnd:
|
|
676
|
+
preloadEnd: window.end,
|
|
2329
677
|
skipCovered: true
|
|
2330
678
|
}
|
|
2331
679
|
)
|
|
@@ -2337,7 +685,7 @@ var prepareRunEnvironment = async ({
|
|
|
2337
685
|
marketConnector,
|
|
2338
686
|
tickers: loadedTickers,
|
|
2339
687
|
instrumentsBySymbol,
|
|
2340
|
-
window
|
|
688
|
+
window,
|
|
2341
689
|
preloadStart,
|
|
2342
690
|
universe,
|
|
2343
691
|
accountId,
|
|
@@ -2349,7 +697,7 @@ var prepareRunEnvironment = async ({
|
|
|
2349
697
|
|
|
2350
698
|
// src/lib/marketContextPrepare.ts
|
|
2351
699
|
var import_chalk7 = __toESM(require("chalk"));
|
|
2352
|
-
var
|
|
700
|
+
var import_marketContext3 = require("@tradejs/infra/timescale/marketContext");
|
|
2353
701
|
var import_registry = require("@tradejs/node/registry");
|
|
2354
702
|
|
|
2355
703
|
// src/lib/binanceMarketContextBackfill.ts
|
|
@@ -2358,7 +706,8 @@ var import_chalk4 = __toESM(require("chalk"));
|
|
|
2358
706
|
var import_connectors4 = require("@tradejs/connectors");
|
|
2359
707
|
var import_connectors5 = require("@tradejs/node/connectors");
|
|
2360
708
|
var import_strategies = require("@tradejs/node/strategies");
|
|
2361
|
-
var
|
|
709
|
+
var import_marketContext = require("@tradejs/infra/timescale/marketContext");
|
|
710
|
+
var import_client = require("@tradejs/infra/timescale/client");
|
|
2362
711
|
|
|
2363
712
|
// src/lib/binanceMarketData.ts
|
|
2364
713
|
var MARKET_FEATURE_INTERVAL_MS = {
|
|
@@ -2866,7 +1215,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
2866
1215
|
if (endMs <= Math.min(breadthStartMs, tradeFlowStartMs)) {
|
|
2867
1216
|
return skippedBackfillResult();
|
|
2868
1217
|
}
|
|
2869
|
-
await (0,
|
|
1218
|
+
await (0, import_client.waitForDbReady)();
|
|
2870
1219
|
const connector = await getBinanceConnector({
|
|
2871
1220
|
projectRoot: params.projectRoot,
|
|
2872
1221
|
userName: params.userName
|
|
@@ -2912,7 +1261,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
2912
1261
|
)
|
|
2913
1262
|
);
|
|
2914
1263
|
if (includeTradeFlow && referenceSymbols.length) {
|
|
2915
|
-
const coverage = await (0,
|
|
1264
|
+
const coverage = await (0, import_marketContext.getMarketTradeFlowCoverage)({
|
|
2916
1265
|
symbols: referenceSymbols,
|
|
2917
1266
|
interval,
|
|
2918
1267
|
startMs: tradeFlowStartMs,
|
|
@@ -2996,7 +1345,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
2996
1345
|
const ts = row.ts.getTime();
|
|
2997
1346
|
return ts >= chunk.startMs && ts <= chunk.endMs;
|
|
2998
1347
|
});
|
|
2999
|
-
await (0,
|
|
1348
|
+
await (0, import_marketContext.upsertMarketTradeFlowRows)(boundedRows);
|
|
3000
1349
|
tradeFlowRows += boundedRows.length;
|
|
3001
1350
|
chunkBar?.tick(1, {
|
|
3002
1351
|
rows: tradeFlowRows,
|
|
@@ -3024,7 +1373,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
3024
1373
|
});
|
|
3025
1374
|
const plans = await Promise.all(
|
|
3026
1375
|
breadthUniverses.map(async (definition) => {
|
|
3027
|
-
const coverage = await (0,
|
|
1376
|
+
const coverage = await (0, import_marketContext.getMarketBreadthCoverage)({
|
|
3028
1377
|
universe: definition.universe,
|
|
3029
1378
|
interval,
|
|
3030
1379
|
startMs: breadthStartMs,
|
|
@@ -3125,7 +1474,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
3125
1474
|
const ts = row.ts.getTime();
|
|
3126
1475
|
return ts >= chunk.startMs && ts <= chunk.endMs;
|
|
3127
1476
|
});
|
|
3128
|
-
await (0,
|
|
1477
|
+
await (0, import_marketContext.upsertMarketBreadthRows)(rows);
|
|
3129
1478
|
breadthRows += rows.length;
|
|
3130
1479
|
}
|
|
3131
1480
|
}
|
|
@@ -3153,7 +1502,8 @@ var import_progress2 = __toESM(require("progress"));
|
|
|
3153
1502
|
var import_async = require("@tradejs/core/async");
|
|
3154
1503
|
var import_constants2 = require("@tradejs/core/constants");
|
|
3155
1504
|
var import_indicators = require("@tradejs/core/indicators");
|
|
3156
|
-
var
|
|
1505
|
+
var import_derivatives = require("@tradejs/infra/timescale/derivatives");
|
|
1506
|
+
var import_client2 = require("@tradejs/infra/timescale/client");
|
|
3157
1507
|
var import_userSettings = require("@tradejs/infra/userSettings");
|
|
3158
1508
|
var HOUR_MS = 60 * 60 * 1e3;
|
|
3159
1509
|
var DAY_MS2 = 24 * HOUR_MS;
|
|
@@ -3666,13 +2016,13 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3666
2016
|
if (!intervalWindows.length) {
|
|
3667
2017
|
return skippedBackfillResult2();
|
|
3668
2018
|
}
|
|
3669
|
-
await (0,
|
|
2019
|
+
await (0, import_client2.waitForDbReady)();
|
|
3670
2020
|
const edgesByInterval = /* @__PURE__ */ new Map();
|
|
3671
2021
|
await Promise.all(
|
|
3672
2022
|
intervalWindows.map(async ({ interval }) => {
|
|
3673
2023
|
edgesByInterval.set(
|
|
3674
2024
|
interval,
|
|
3675
|
-
await (0,
|
|
2025
|
+
await (0, import_derivatives.getDerivativesDataEdgesForSymbols)(symbols, interval)
|
|
3676
2026
|
);
|
|
3677
2027
|
})
|
|
3678
2028
|
);
|
|
@@ -3681,32 +2031,32 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3681
2031
|
const liquidationCoverageRangesByInterval = /* @__PURE__ */ new Map();
|
|
3682
2032
|
const coverageNowMs = Date.now();
|
|
3683
2033
|
await Promise.all(
|
|
3684
|
-
intervalWindows.map(async (
|
|
2034
|
+
intervalWindows.map(async (window) => {
|
|
3685
2035
|
const confirmedLiquidationWindow = (0, import_indicators.resolveCoinalyzeConfirmedIntradayCoverage)({
|
|
3686
|
-
interval:
|
|
3687
|
-
fromMs:
|
|
3688
|
-
toMs:
|
|
2036
|
+
interval: window.interval,
|
|
2037
|
+
fromMs: window.fromMs,
|
|
2038
|
+
toMs: window.toMs,
|
|
3689
2039
|
nowMs: coverageNowMs
|
|
3690
2040
|
});
|
|
3691
2041
|
const [coverageRows, liquidationCoverageRows] = await Promise.all([
|
|
3692
|
-
(0,
|
|
2042
|
+
(0, import_derivatives.getDerivativesBackfillCoverage)({
|
|
3693
2043
|
source: "coinalyze",
|
|
3694
2044
|
symbols,
|
|
3695
|
-
interval:
|
|
3696
|
-
fromMs:
|
|
3697
|
-
toMs:
|
|
2045
|
+
interval: window.interval,
|
|
2046
|
+
fromMs: window.fromMs,
|
|
2047
|
+
toMs: window.toMs
|
|
3698
2048
|
}),
|
|
3699
|
-
confirmedLiquidationWindow ? (0,
|
|
2049
|
+
confirmedLiquidationWindow ? (0, import_derivatives.getDerivativesMetricCoverage)({
|
|
3700
2050
|
source: "coinalyze",
|
|
3701
2051
|
metric: "liquidation",
|
|
3702
2052
|
symbols,
|
|
3703
|
-
interval:
|
|
2053
|
+
interval: window.interval,
|
|
3704
2054
|
fromMs: confirmedLiquidationWindow.fromMs,
|
|
3705
2055
|
toMs: confirmedLiquidationWindow.toMs
|
|
3706
2056
|
}) : Promise.resolve([])
|
|
3707
2057
|
]);
|
|
3708
2058
|
coverageKeysByInterval.set(
|
|
3709
|
-
|
|
2059
|
+
window.interval,
|
|
3710
2060
|
new Set(
|
|
3711
2061
|
coverageRows.map(
|
|
3712
2062
|
(row) => coverageKey({
|
|
@@ -3725,7 +2075,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3725
2075
|
ranges.push({ fromMs: row.fromMs, toMs: row.toMs });
|
|
3726
2076
|
rangesBySymbol.set(symbol, ranges);
|
|
3727
2077
|
}
|
|
3728
|
-
coverageRangesByInterval.set(
|
|
2078
|
+
coverageRangesByInterval.set(window.interval, rangesBySymbol);
|
|
3729
2079
|
const liquidationRangesBySymbol = /* @__PURE__ */ new Map();
|
|
3730
2080
|
for (const row of liquidationCoverageRows) {
|
|
3731
2081
|
const symbol = row.symbol.toUpperCase();
|
|
@@ -3734,33 +2084,33 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3734
2084
|
liquidationRangesBySymbol.set(symbol, ranges);
|
|
3735
2085
|
}
|
|
3736
2086
|
liquidationCoverageRangesByInterval.set(
|
|
3737
|
-
|
|
2087
|
+
window.interval,
|
|
3738
2088
|
liquidationRangesBySymbol
|
|
3739
2089
|
);
|
|
3740
2090
|
})
|
|
3741
2091
|
);
|
|
3742
2092
|
const cachedWindows = intervalWindows.reduce(
|
|
3743
|
-
(sum,
|
|
3744
|
-
fromMs:
|
|
3745
|
-
toMs:
|
|
2093
|
+
(sum, window) => sum + countBackfillWindows({
|
|
2094
|
+
fromMs: window.fromMs,
|
|
2095
|
+
toMs: window.toMs,
|
|
3746
2096
|
batchMs,
|
|
3747
|
-
intervalMs:
|
|
2097
|
+
intervalMs: window.intervalMs
|
|
3748
2098
|
}),
|
|
3749
2099
|
0
|
|
3750
2100
|
);
|
|
3751
|
-
const allBackfillWindowsCached = mode !== "signals" && intervalWindows.every((
|
|
3752
|
-
const edgesBySymbol = edgesByInterval.get(
|
|
3753
|
-
const coverageKeys = coverageKeysByInterval.get(
|
|
2101
|
+
const allBackfillWindowsCached = mode !== "signals" && intervalWindows.every((window) => {
|
|
2102
|
+
const edgesBySymbol = edgesByInterval.get(window.interval);
|
|
2103
|
+
const coverageKeys = coverageKeysByInterval.get(window.interval);
|
|
3754
2104
|
const backfillWindows = buildBackfillWindows({
|
|
3755
|
-
fromMs:
|
|
3756
|
-
toMs:
|
|
2105
|
+
fromMs: window.fromMs,
|
|
2106
|
+
toMs: window.toMs,
|
|
3757
2107
|
batchMs,
|
|
3758
|
-
intervalMs:
|
|
2108
|
+
intervalMs: window.intervalMs
|
|
3759
2109
|
});
|
|
3760
2110
|
return symbols.every(
|
|
3761
2111
|
(symbol) => backfillWindows.every((backfillWindow) => {
|
|
3762
2112
|
const normalizedSymbol = symbol.toUpperCase();
|
|
3763
|
-
const coverageRanges = coverageRangesByInterval.get(
|
|
2113
|
+
const coverageRanges = coverageRangesByInterval.get(window.interval)?.get(normalizedSymbol) ?? [];
|
|
3764
2114
|
const dataCovered = hasDerivativesWindowCoverage({
|
|
3765
2115
|
edges: edgesBySymbol?.get(normalizedSymbol),
|
|
3766
2116
|
fromMs: backfillWindow.fromMs,
|
|
@@ -3769,26 +2119,26 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3769
2119
|
ranges: coverageRanges,
|
|
3770
2120
|
fromMs: backfillWindow.fromMs,
|
|
3771
2121
|
toMs: backfillWindow.toMs,
|
|
3772
|
-
intervalMs:
|
|
2122
|
+
intervalMs: window.intervalMs
|
|
3773
2123
|
}) == null || coverageKeys?.has(
|
|
3774
2124
|
coverageKey({
|
|
3775
2125
|
symbol: normalizedSymbol,
|
|
3776
|
-
interval:
|
|
2126
|
+
interval: window.interval,
|
|
3777
2127
|
fromMs: backfillWindow.fromMs,
|
|
3778
2128
|
toMs: backfillWindow.toMs
|
|
3779
2129
|
})
|
|
3780
2130
|
);
|
|
3781
2131
|
const confirmedLiquidationWindow = (0, import_indicators.resolveCoinalyzeConfirmedIntradayCoverage)({
|
|
3782
|
-
interval:
|
|
2132
|
+
interval: window.interval,
|
|
3783
2133
|
fromMs: backfillWindow.fromMs,
|
|
3784
2134
|
toMs: backfillWindow.toMs,
|
|
3785
2135
|
nowMs: coverageNowMs
|
|
3786
2136
|
});
|
|
3787
2137
|
const liquidationCovered = confirmedLiquidationWindow == null || resolveDerivativesContextMissingCoverageFetchFromMs({
|
|
3788
|
-
ranges: liquidationCoverageRangesByInterval.get(
|
|
2138
|
+
ranges: liquidationCoverageRangesByInterval.get(window.interval)?.get(normalizedSymbol) ?? [],
|
|
3789
2139
|
fromMs: confirmedLiquidationWindow.fromMs,
|
|
3790
2140
|
toMs: confirmedLiquidationWindow.toMs,
|
|
3791
|
-
intervalMs:
|
|
2141
|
+
intervalMs: window.intervalMs
|
|
3792
2142
|
}) == null;
|
|
3793
2143
|
return dataCovered && liquidationCovered;
|
|
3794
2144
|
})
|
|
@@ -3838,11 +2188,11 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3838
2188
|
);
|
|
3839
2189
|
const symbolBatches = chunkArray(matches, symbolBatchSize);
|
|
3840
2190
|
const windowsPerPair = intervalWindows.reduce(
|
|
3841
|
-
(sum,
|
|
3842
|
-
fromMs:
|
|
3843
|
-
toMs:
|
|
2191
|
+
(sum, window) => sum + countBackfillWindows({
|
|
2192
|
+
fromMs: window.fromMs,
|
|
2193
|
+
toMs: window.toMs,
|
|
3844
2194
|
batchMs,
|
|
3845
|
-
intervalMs:
|
|
2195
|
+
intervalMs: window.intervalMs
|
|
3846
2196
|
}),
|
|
3847
2197
|
0
|
|
3848
2198
|
);
|
|
@@ -3865,9 +2215,9 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3865
2215
|
`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()}`
|
|
3866
2216
|
)
|
|
3867
2217
|
);
|
|
3868
|
-
for (const
|
|
3869
|
-
const { interval, intervalMs } =
|
|
3870
|
-
const edgesBySymbol = edgesByInterval.get(interval) ?? await (0,
|
|
2218
|
+
for (const window of intervalWindows) {
|
|
2219
|
+
const { interval, intervalMs } = window;
|
|
2220
|
+
const edgesBySymbol = edgesByInterval.get(interval) ?? await (0, import_derivatives.getDerivativesDataEdgesForSymbols)(
|
|
3871
2221
|
matches.map((item) => item.symbol),
|
|
3872
2222
|
interval
|
|
3873
2223
|
);
|
|
@@ -3882,9 +2232,9 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3882
2232
|
);
|
|
3883
2233
|
for (let batchIdx = 0; batchIdx < symbolBatches.length; batchIdx += 1) {
|
|
3884
2234
|
const batch = symbolBatches[batchIdx];
|
|
3885
|
-
let cursor =
|
|
3886
|
-
while (cursor <
|
|
3887
|
-
const toMs = Math.min(
|
|
2235
|
+
let cursor = window.fromMs;
|
|
2236
|
+
while (cursor < window.toMs) {
|
|
2237
|
+
const toMs = Math.min(window.toMs, cursor + batchMs);
|
|
3888
2238
|
const missingRanges = batch.map((item) => {
|
|
3889
2239
|
const key = coverageKey({
|
|
3890
2240
|
symbol: item.symbol,
|
|
@@ -3990,7 +2340,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3990
2340
|
);
|
|
3991
2341
|
}
|
|
3992
2342
|
if (rows.length) {
|
|
3993
|
-
await (0,
|
|
2343
|
+
await (0, import_derivatives.upsertDerivatives)(rows);
|
|
3994
2344
|
totalRows += rows.length;
|
|
3995
2345
|
}
|
|
3996
2346
|
const confirmedLiquidationWindow = (0, import_indicators.resolveCoinalyzeConfirmedIntradayCoverage)({
|
|
@@ -4018,7 +2368,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
4018
2368
|
eventRowsCount
|
|
4019
2369
|
};
|
|
4020
2370
|
});
|
|
4021
|
-
await (0,
|
|
2371
|
+
await (0, import_derivatives.applyDerivativesMetricCoverage)(metricCoverageRows);
|
|
4022
2372
|
for (const coverageRow of metricCoverageRows) {
|
|
4023
2373
|
const symbol = coverageRow.symbol.toUpperCase();
|
|
4024
2374
|
const ranges = liquidationCoverageRangesBySymbol.get(symbol) ?? [];
|
|
@@ -4050,7 +2400,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
4050
2400
|
rowsCount
|
|
4051
2401
|
};
|
|
4052
2402
|
});
|
|
4053
|
-
await (0,
|
|
2403
|
+
await (0, import_derivatives.upsertDerivativesBackfillCoverage)(coverageRows);
|
|
4054
2404
|
for (const coverageRow of coverageRows) {
|
|
4055
2405
|
const symbol = coverageRow.symbol.toUpperCase();
|
|
4056
2406
|
edgesBySymbol.set(
|
|
@@ -4127,7 +2477,8 @@ var backfillDerivativesContextForSignals = async (params) => backfillDerivatives
|
|
|
4127
2477
|
// src/lib/coinMarketCapContextBackfill.ts
|
|
4128
2478
|
var import_chalk6 = __toESM(require("chalk"));
|
|
4129
2479
|
var import_async2 = require("@tradejs/core/async");
|
|
4130
|
-
var
|
|
2480
|
+
var import_marketContext2 = require("@tradejs/infra/timescale/marketContext");
|
|
2481
|
+
var import_client3 = require("@tradejs/infra/timescale/client");
|
|
4131
2482
|
var import_userSettings2 = require("@tradejs/infra/userSettings");
|
|
4132
2483
|
var DAY_MS3 = 864e5;
|
|
4133
2484
|
var DEFAULT_CONTEXT_MAX_AGE_MS = 48 * 60 * 6e4;
|
|
@@ -4352,27 +2703,27 @@ var createCoinMarketCapFetchStats = () => ({
|
|
|
4352
2703
|
totalCredits: 0,
|
|
4353
2704
|
byPath: /* @__PURE__ */ new Map()
|
|
4354
2705
|
});
|
|
4355
|
-
var getCoinMarketCapPathLabel = (
|
|
4356
|
-
if (
|
|
4357
|
-
if (
|
|
4358
|
-
if (
|
|
4359
|
-
if (
|
|
4360
|
-
if (
|
|
4361
|
-
if (
|
|
4362
|
-
return
|
|
4363
|
-
};
|
|
4364
|
-
var recordCoinMarketCapFetchStats = (stats,
|
|
2706
|
+
var getCoinMarketCapPathLabel = (path5) => {
|
|
2707
|
+
if (path5.includes("global-metrics")) return "global";
|
|
2708
|
+
if (path5.includes("cryptocurrency/quotes")) return "reference";
|
|
2709
|
+
if (path5.includes("exchange/quotes")) return "exchangeLiquidity";
|
|
2710
|
+
if (path5.includes("fear-and-greed")) return "fearGreed";
|
|
2711
|
+
if (path5.includes("cmc100")) return "cmc100";
|
|
2712
|
+
if (path5.includes("cmc20")) return "cmc20";
|
|
2713
|
+
return path5;
|
|
2714
|
+
};
|
|
2715
|
+
var recordCoinMarketCapFetchStats = (stats, path5, creditCount) => {
|
|
4365
2716
|
if (!stats) return;
|
|
4366
|
-
const existing = stats.byPath.get(
|
|
2717
|
+
const existing = stats.byPath.get(path5) ?? { requests: 0, credits: 0 };
|
|
4367
2718
|
existing.requests += 1;
|
|
4368
2719
|
existing.credits += creditCount ?? 0;
|
|
4369
2720
|
stats.requests += 1;
|
|
4370
2721
|
stats.totalCredits += creditCount ?? 0;
|
|
4371
|
-
stats.byPath.set(
|
|
2722
|
+
stats.byPath.set(path5, existing);
|
|
4372
2723
|
};
|
|
4373
2724
|
var formatCoinMarketCapFetchStats = (stats) => {
|
|
4374
2725
|
const byPath = [...stats.byPath.entries()].map(
|
|
4375
|
-
([
|
|
2726
|
+
([path5, item]) => `${getCoinMarketCapPathLabel(path5)}=${item.requests}req/${item.credits}cr`
|
|
4376
2727
|
).join(" ");
|
|
4377
2728
|
return `apiRequests=${stats.requests} apiCredits=${stats.totalCredits}${byPath ? ` ${byPath}` : ""}`;
|
|
4378
2729
|
};
|
|
@@ -4391,7 +2742,7 @@ var logBackfillSourceDone = (params) => {
|
|
|
4391
2742
|
)
|
|
4392
2743
|
);
|
|
4393
2744
|
};
|
|
4394
|
-
var markBackfillCoverage = (rows) => (0,
|
|
2745
|
+
var markBackfillCoverage = (rows) => (0, import_marketContext2.upsertMarketContextBackfillCoverage)(rows);
|
|
4395
2746
|
var coinMarketCapFetch = async (params) => {
|
|
4396
2747
|
const url = new URL(`${getBaseUrl()}${params.path}`);
|
|
4397
2748
|
for (const [key, value] of Object.entries(params.searchParams)) {
|
|
@@ -4720,7 +3071,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
4720
3071
|
if (toMs <= fromMs) return skippedResult();
|
|
4721
3072
|
const exchangeLiquidityEnabled = isExchangeLiquidityBackfillEnabled();
|
|
4722
3073
|
const fearGreedEnabled = isFearGreedBackfillEnabled();
|
|
4723
|
-
await (0,
|
|
3074
|
+
await (0, import_client3.waitForDbReady)();
|
|
4724
3075
|
const [
|
|
4725
3076
|
globalDailyCoverage,
|
|
4726
3077
|
referenceDailyCoverage,
|
|
@@ -4733,66 +3084,66 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
4733
3084
|
fearGreedBackfillCoverage,
|
|
4734
3085
|
indexBackfillCoverage
|
|
4735
3086
|
] = await Promise.all([
|
|
4736
|
-
(0,
|
|
3087
|
+
(0, import_marketContext2.getMarketGlobalContextCoverage)({
|
|
4737
3088
|
source: SOURCE_GLOBAL_DAILY,
|
|
4738
3089
|
startMs: fromMs,
|
|
4739
3090
|
endMs: toMs
|
|
4740
3091
|
}),
|
|
4741
|
-
(0,
|
|
3092
|
+
(0, import_marketContext2.getMarketReferenceAssetContextCoverage)({
|
|
4742
3093
|
source: SOURCE_REFERENCE,
|
|
4743
3094
|
symbols: REFERENCE_ASSETS.map((item) => item.symbol),
|
|
4744
3095
|
interval: "1d",
|
|
4745
3096
|
startMs: fromMs,
|
|
4746
3097
|
endMs: toMs
|
|
4747
3098
|
}),
|
|
4748
|
-
exchangeLiquidityEnabled ? (0,
|
|
3099
|
+
exchangeLiquidityEnabled ? (0, import_marketContext2.getMarketCmcExchangeLiquidityContextCoverage)({
|
|
4749
3100
|
source: SOURCE_EXCHANGE_LIQUIDITY,
|
|
4750
3101
|
interval: "1d",
|
|
4751
3102
|
startMs: fromMs,
|
|
4752
3103
|
endMs: toMs
|
|
4753
3104
|
}) : Promise.resolve(null),
|
|
4754
|
-
fearGreedEnabled ? (0,
|
|
3105
|
+
fearGreedEnabled ? (0, import_marketContext2.getMarketCmcFearGreedContextCoverage)({
|
|
4755
3106
|
source: SOURCE_FEAR_GREED,
|
|
4756
3107
|
interval: "1d",
|
|
4757
3108
|
startMs: fromMs,
|
|
4758
3109
|
endMs: toMs
|
|
4759
3110
|
}) : Promise.resolve(null),
|
|
4760
|
-
(0,
|
|
3111
|
+
(0, import_marketContext2.getMarketCmcIndexContextCoverage)({
|
|
4761
3112
|
source: SOURCE_INDEX,
|
|
4762
3113
|
indexSlugs: CMC_INDEXES.map((index) => index.slug),
|
|
4763
3114
|
interval: "1d",
|
|
4764
3115
|
startMs: fromMs,
|
|
4765
3116
|
endMs: toMs
|
|
4766
3117
|
}),
|
|
4767
|
-
(0,
|
|
3118
|
+
(0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4768
3119
|
source: SOURCE_GLOBAL_DAILY,
|
|
4769
3120
|
scopes: [COVERAGE_SCOPE_ALL],
|
|
4770
3121
|
interval: "1d",
|
|
4771
3122
|
fromMs,
|
|
4772
3123
|
toMs
|
|
4773
3124
|
}),
|
|
4774
|
-
(0,
|
|
3125
|
+
(0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4775
3126
|
source: SOURCE_REFERENCE,
|
|
4776
3127
|
scopes: REFERENCE_ASSETS.map((item) => item.symbol),
|
|
4777
3128
|
interval: "1d",
|
|
4778
3129
|
fromMs,
|
|
4779
3130
|
toMs
|
|
4780
3131
|
}),
|
|
4781
|
-
exchangeLiquidityEnabled ? (0,
|
|
3132
|
+
exchangeLiquidityEnabled ? (0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4782
3133
|
source: SOURCE_EXCHANGE_LIQUIDITY,
|
|
4783
3134
|
scopes: [COVERAGE_SCOPE_ALL],
|
|
4784
3135
|
interval: "1d",
|
|
4785
3136
|
fromMs,
|
|
4786
3137
|
toMs
|
|
4787
3138
|
}) : Promise.resolve([]),
|
|
4788
|
-
fearGreedEnabled ? (0,
|
|
3139
|
+
fearGreedEnabled ? (0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4789
3140
|
source: SOURCE_FEAR_GREED,
|
|
4790
3141
|
scopes: [COVERAGE_SCOPE_ALL],
|
|
4791
3142
|
interval: "1d",
|
|
4792
3143
|
fromMs,
|
|
4793
3144
|
toMs
|
|
4794
3145
|
}) : Promise.resolve([]),
|
|
4795
|
-
(0,
|
|
3146
|
+
(0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4796
3147
|
source: SOURCE_INDEX,
|
|
4797
3148
|
scopes: CMC_INDEXES.map((index) => index.slug),
|
|
4798
3149
|
interval: "1d",
|
|
@@ -4983,7 +3334,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
4983
3334
|
}
|
|
4984
3335
|
});
|
|
4985
3336
|
const rows = coinMarketCapGlobalPayloadToRows(payload, SOURCE_GLOBAL_DAILY);
|
|
4986
|
-
await (0,
|
|
3337
|
+
await (0, import_marketContext2.upsertMarketGlobalContextRows)(rows);
|
|
4987
3338
|
await markBackfillCoverage([
|
|
4988
3339
|
{
|
|
4989
3340
|
source: SOURCE_GLOBAL_DAILY,
|
|
@@ -5017,7 +3368,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
5017
3368
|
}
|
|
5018
3369
|
});
|
|
5019
3370
|
const rows = coinMarketCapHistoricalQuotesPayloadToRows(payload, "1d");
|
|
5020
|
-
await (0,
|
|
3371
|
+
await (0, import_marketContext2.upsertMarketReferenceAssetContextRows)(rows);
|
|
5021
3372
|
await markBackfillCoverage(
|
|
5022
3373
|
REFERENCE_ASSETS.map((asset) => ({
|
|
5023
3374
|
source: SOURCE_REFERENCE,
|
|
@@ -5056,7 +3407,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
5056
3407
|
payload,
|
|
5057
3408
|
"1d"
|
|
5058
3409
|
);
|
|
5059
|
-
await (0,
|
|
3410
|
+
await (0, import_marketContext2.upsertMarketCmcExchangeLiquidityContextRows)(rows);
|
|
5060
3411
|
await markBackfillCoverage([
|
|
5061
3412
|
{
|
|
5062
3413
|
source: SOURCE_EXCHANGE_LIQUIDITY,
|
|
@@ -5101,7 +3452,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
5101
3452
|
const oldestPageTs = Math.min(...pageRows.map((row) => row.ts.getTime()));
|
|
5102
3453
|
if (oldestPageTs < fromMs || pageRows.length < pageSize) break;
|
|
5103
3454
|
}
|
|
5104
|
-
await (0,
|
|
3455
|
+
await (0, import_marketContext2.upsertMarketCmcFearGreedContextRows)(rows);
|
|
5105
3456
|
await markBackfillCoverage([
|
|
5106
3457
|
{
|
|
5107
3458
|
source: SOURCE_FEAR_GREED,
|
|
@@ -5135,7 +3486,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
5135
3486
|
}))
|
|
5136
3487
|
);
|
|
5137
3488
|
const rows = rowsByIndex.flatMap((item) => item.result.rows);
|
|
5138
|
-
await (0,
|
|
3489
|
+
await (0, import_marketContext2.upsertMarketCmcIndexContextRows)(rows);
|
|
5139
3490
|
await markBackfillCoverage(
|
|
5140
3491
|
rowsByIndex.map(({ index, result }) => ({
|
|
5141
3492
|
source: SOURCE_INDEX,
|
|
@@ -5187,7 +3538,7 @@ var backfillCoinMarketCapContextForSignals = (params) => backfillCoinMarketCapCo
|
|
|
5187
3538
|
|
|
5188
3539
|
// src/lib/hyperliquidWhaleBackfill.ts
|
|
5189
3540
|
var import_progress3 = __toESM(require("progress"));
|
|
5190
|
-
var
|
|
3541
|
+
var import_hyperliquidWhales = require("@tradejs/infra/timescale/hyperliquidWhales");
|
|
5191
3542
|
var import_strategies2 = require("@tradejs/node/strategies");
|
|
5192
3543
|
|
|
5193
3544
|
// src/lib/hyperliquidWhaleData.ts
|
|
@@ -5442,7 +3793,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5442
3793
|
};
|
|
5443
3794
|
const fromMs = Math.floor(params.startMs / HYPERLIQUID_WHALE_BUCKET_MS) * HYPERLIQUID_WHALE_BUCKET_MS;
|
|
5444
3795
|
const toMs = minuteCeil(params.endMs);
|
|
5445
|
-
const cached = await (0,
|
|
3796
|
+
const cached = await (0, import_hyperliquidWhales.hasHyperliquidWhaleBackfillCoverage)({
|
|
5446
3797
|
fromMs,
|
|
5447
3798
|
toMs,
|
|
5448
3799
|
...identity
|
|
@@ -5491,7 +3842,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5491
3842
|
items: whales.addresses,
|
|
5492
3843
|
concurrency,
|
|
5493
3844
|
worker: async (address) => {
|
|
5494
|
-
const previous = await (0,
|
|
3845
|
+
const previous = await (0, import_hyperliquidWhales.getHyperliquidWhaleWalletCoverage)({
|
|
5495
3846
|
address,
|
|
5496
3847
|
fromMs,
|
|
5497
3848
|
toMs,
|
|
@@ -5518,8 +3869,8 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5518
3869
|
identity
|
|
5519
3870
|
})
|
|
5520
3871
|
).filter((row) => row != null);
|
|
5521
|
-
await (0,
|
|
5522
|
-
await (0,
|
|
3872
|
+
await (0, import_hyperliquidWhales.upsertHyperliquidWhaleTradeEvents)(addressEvents);
|
|
3873
|
+
await (0, import_hyperliquidWhales.upsertHyperliquidWhaleWalletCoverage)({
|
|
5523
3874
|
address,
|
|
5524
3875
|
fromMs,
|
|
5525
3876
|
toMs,
|
|
@@ -5537,7 +3888,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5537
3888
|
const normalizedError = error instanceof Error ? error : new Error(String(error));
|
|
5538
3889
|
failures.push(normalizedError);
|
|
5539
3890
|
failedWallets += 1;
|
|
5540
|
-
await (0,
|
|
3891
|
+
await (0, import_hyperliquidWhales.upsertHyperliquidWhaleWalletCoverage)({
|
|
5541
3892
|
address,
|
|
5542
3893
|
fromMs,
|
|
5543
3894
|
toMs,
|
|
@@ -5556,7 +3907,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5556
3907
|
);
|
|
5557
3908
|
}
|
|
5558
3909
|
});
|
|
5559
|
-
const buckets = await (0,
|
|
3910
|
+
const buckets = await (0, import_hyperliquidWhales.rebuildHyperliquidWhaleFlowRows)({
|
|
5560
3911
|
fromMs,
|
|
5561
3912
|
toMs,
|
|
5562
3913
|
...identity
|
|
@@ -5572,7 +3923,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5572
3923
|
}
|
|
5573
3924
|
);
|
|
5574
3925
|
let displayedCoverageBuckets = 0;
|
|
5575
|
-
const coverageBuckets = await (0,
|
|
3926
|
+
const coverageBuckets = await (0, import_hyperliquidWhales.rebuildHyperliquidWhaleCoverageRows)({
|
|
5576
3927
|
fromMs,
|
|
5577
3928
|
toMs,
|
|
5578
3929
|
expectedWhales: whales.addresses.length,
|
|
@@ -5778,7 +4129,7 @@ var prepareMarketContextForRun = async (params) => {
|
|
|
5778
4129
|
if (readableSources.length) {
|
|
5779
4130
|
await timeOperation3(
|
|
5780
4131
|
"market context schema ensure",
|
|
5781
|
-
() => (0,
|
|
4132
|
+
() => (0, import_marketContext3.ensureMarketContextSchemas)(readableSources)
|
|
5782
4133
|
);
|
|
5783
4134
|
}
|
|
5784
4135
|
if (requirements.derivatives.backfill) {
|
|
@@ -5855,11 +4206,11 @@ var markTestsStarted = () => {
|
|
|
5855
4206
|
var setRuntimeCompareContext = ({
|
|
5856
4207
|
connector,
|
|
5857
4208
|
connectorName,
|
|
5858
|
-
window
|
|
4209
|
+
window
|
|
5859
4210
|
}) => {
|
|
5860
4211
|
runtimeCompareConnector = connector;
|
|
5861
4212
|
runtimeCompareConnectorName = connectorName;
|
|
5862
|
-
runtimeCompareWindow =
|
|
4213
|
+
runtimeCompareWindow = window;
|
|
5863
4214
|
};
|
|
5864
4215
|
var getRuntimeCompareContext = () => ({
|
|
5865
4216
|
connector: runtimeCompareConnector,
|
|
@@ -6553,11 +4904,56 @@ var invokeAfterSignalsHooks = async (hooks, params) => {
|
|
|
6553
4904
|
|
|
6554
4905
|
// src/lib/runtimeLineage.ts
|
|
6555
4906
|
var import_node_child_process = require("child_process");
|
|
4907
|
+
var import_node_crypto2 = require("crypto");
|
|
4908
|
+
var import_promises2 = __toESM(require("fs/promises"));
|
|
4909
|
+
var import_node_path2 = __toESM(require("path"));
|
|
4910
|
+
var import_types2 = require("@tradejs/types");
|
|
4911
|
+
var import_strategies3 = require("@tradejs/node/strategies");
|
|
4912
|
+
|
|
4913
|
+
// src/lib/strategyGateFingerprint.ts
|
|
6556
4914
|
var import_node_crypto = require("crypto");
|
|
6557
4915
|
var import_promises = __toESM(require("fs/promises"));
|
|
6558
4916
|
var import_node_path = __toESM(require("path"));
|
|
6559
|
-
var
|
|
6560
|
-
|
|
4917
|
+
var gateFingerprintRelativePaths = (strategyName) => [
|
|
4918
|
+
`packages/strategies/src/${strategyName}/adapters/ai.ts`,
|
|
4919
|
+
`packages/strategies/src/${strategyName}/guardrails.ts`,
|
|
4920
|
+
`packages/strategies/src/${strategyName}/pockets.ts`,
|
|
4921
|
+
`packages/strategies/src/${strategyName}/config.ts`,
|
|
4922
|
+
"packages/strategies/src/shared/localAiGate.ts",
|
|
4923
|
+
"packages/node/src/ai.ts",
|
|
4924
|
+
"packages/core/src/utils/strategyHelpers/signalBuilders.ts"
|
|
4925
|
+
];
|
|
4926
|
+
var resolveStrategyGateFingerprint = async ({
|
|
4927
|
+
projectRoot,
|
|
4928
|
+
strategyName,
|
|
4929
|
+
gitSha
|
|
4930
|
+
}) => {
|
|
4931
|
+
const candidates = await Promise.all(
|
|
4932
|
+
gateFingerprintRelativePaths(strategyName).map(async (relativePath) => {
|
|
4933
|
+
const content = await import_promises.default.readFile(import_node_path.default.join(projectRoot, relativePath)).catch(() => null);
|
|
4934
|
+
return content == null ? null : { relativePath, content };
|
|
4935
|
+
})
|
|
4936
|
+
);
|
|
4937
|
+
const sourceEntries = candidates.filter(
|
|
4938
|
+
(entry) => entry != null
|
|
4939
|
+
);
|
|
4940
|
+
const hash = (0, import_node_crypto.createHash)("sha256");
|
|
4941
|
+
hash.update(strategyName);
|
|
4942
|
+
if (sourceEntries.length) {
|
|
4943
|
+
for (const entry of sourceEntries) {
|
|
4944
|
+
hash.update(entry.relativePath);
|
|
4945
|
+
hash.update(entry.content);
|
|
4946
|
+
}
|
|
4947
|
+
} else {
|
|
4948
|
+
hash.update(gitSha ?? "unknown-git-sha");
|
|
4949
|
+
}
|
|
4950
|
+
return {
|
|
4951
|
+
gateFingerprint: hash.digest("hex").slice(0, 16),
|
|
4952
|
+
gateFingerprintFiles: sourceEntries.map((entry) => entry.relativePath)
|
|
4953
|
+
};
|
|
4954
|
+
};
|
|
4955
|
+
|
|
4956
|
+
// src/lib/runtimeLineage.ts
|
|
6561
4957
|
var RUNTIME_CONTEXT_ENV_KEYS = [
|
|
6562
4958
|
"AI_MODE",
|
|
6563
4959
|
"MIN_AI_QUALITY",
|
|
@@ -6607,6 +5003,17 @@ var normalizeForStableJson = (value) => {
|
|
|
6607
5003
|
}
|
|
6608
5004
|
return value;
|
|
6609
5005
|
};
|
|
5006
|
+
var normalizeRuntimeLogicConfig = (value) => {
|
|
5007
|
+
if (Array.isArray(value)) {
|
|
5008
|
+
return value.map(normalizeRuntimeLogicConfig);
|
|
5009
|
+
}
|
|
5010
|
+
if (value && typeof value === "object") {
|
|
5011
|
+
return Object.fromEntries(
|
|
5012
|
+
Object.entries(value).filter(([key]) => key !== "MAX_LOSS_VALUE").sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, normalizeRuntimeLogicConfig(entry)])
|
|
5013
|
+
);
|
|
5014
|
+
}
|
|
5015
|
+
return value;
|
|
5016
|
+
};
|
|
6610
5017
|
var resolveRuntimeMaxLossValue = (config) => {
|
|
6611
5018
|
if (!config || typeof config !== "object" || Array.isArray(config)) {
|
|
6612
5019
|
return null;
|
|
@@ -6620,7 +5027,7 @@ var resolveRuntimeMaxLossValue = (config) => {
|
|
|
6620
5027
|
);
|
|
6621
5028
|
return Number.isFinite(maxLossValue) ? maxLossValue : null;
|
|
6622
5029
|
};
|
|
6623
|
-
var fingerprintRuntimeValue = (value) => (0,
|
|
5030
|
+
var fingerprintRuntimeValue = (value) => (0, import_node_crypto2.createHash)("sha256").update(JSON.stringify(normalizeForStableJson(value))).digest("hex").slice(0, 16);
|
|
6624
5031
|
var gitLineageCache = /* @__PURE__ */ new Map();
|
|
6625
5032
|
var gateFingerprintCache = /* @__PURE__ */ new Map();
|
|
6626
5033
|
var binanceBreadthFingerprintCache = /* @__PURE__ */ new Map();
|
|
@@ -6671,7 +5078,7 @@ var resolveGitLineage = (projectRoot) => {
|
|
|
6671
5078
|
};
|
|
6672
5079
|
var readOptionalFile = async (filePath) => {
|
|
6673
5080
|
try {
|
|
6674
|
-
return await
|
|
5081
|
+
return await import_promises2.default.readFile(filePath);
|
|
6675
5082
|
} catch {
|
|
6676
5083
|
return null;
|
|
6677
5084
|
}
|
|
@@ -6681,7 +5088,7 @@ var resolveBinanceBreadthFingerprint = async (projectRoot) => {
|
|
|
6681
5088
|
return binanceBreadthFingerprintCache.get(projectRoot) ?? null;
|
|
6682
5089
|
}
|
|
6683
5090
|
const content = await readOptionalFile(
|
|
6684
|
-
|
|
5091
|
+
import_node_path2.default.join(
|
|
6685
5092
|
projectRoot,
|
|
6686
5093
|
"packages/node/src/config/binanceBreadthUniverses.json"
|
|
6687
5094
|
)
|
|
@@ -6703,7 +5110,7 @@ var resolveSnapshotFingerprint = async (projectRoot, relativePath) => {
|
|
|
6703
5110
|
if (snapshotFingerprintCache.has(cacheKey)) {
|
|
6704
5111
|
return snapshotFingerprintCache.get(cacheKey) ?? null;
|
|
6705
5112
|
}
|
|
6706
|
-
const content = await readOptionalFile(
|
|
5113
|
+
const content = await readOptionalFile(import_node_path2.default.join(projectRoot, relativePath));
|
|
6707
5114
|
let result = null;
|
|
6708
5115
|
if (content) {
|
|
6709
5116
|
try {
|
|
@@ -6716,55 +5123,26 @@ var resolveSnapshotFingerprint = async (projectRoot, relativePath) => {
|
|
|
6716
5123
|
snapshotFingerprintCache.set(cacheKey, result);
|
|
6717
5124
|
return result;
|
|
6718
5125
|
};
|
|
6719
|
-
var
|
|
5126
|
+
var resolveRuntimeGateFingerprint = async ({
|
|
6720
5127
|
projectRoot,
|
|
6721
5128
|
strategyName,
|
|
6722
5129
|
gitSha
|
|
6723
5130
|
}) => {
|
|
6724
5131
|
const cacheKey = `${projectRoot}:${strategyName}:${gitSha ?? "unknown"}`;
|
|
6725
5132
|
const cached = gateFingerprintCache.get(cacheKey);
|
|
6726
|
-
if (cached)
|
|
6727
|
-
|
|
6728
|
-
|
|
6729
|
-
|
|
6730
|
-
|
|
6731
|
-
|
|
6732
|
-
|
|
6733
|
-
|
|
6734
|
-
"packages/node/src/ai.ts",
|
|
6735
|
-
"packages/core/src/utils/strategyHelpers/signalBuilders.ts"
|
|
6736
|
-
];
|
|
6737
|
-
const optionalEntries = await Promise.all(
|
|
6738
|
-
relativeCandidates.map(async (relativePath) => {
|
|
6739
|
-
const content = await readOptionalFile(
|
|
6740
|
-
import_node_path.default.join(projectRoot, relativePath)
|
|
6741
|
-
);
|
|
6742
|
-
return content == null ? null : { relativePath, content };
|
|
6743
|
-
})
|
|
6744
|
-
);
|
|
6745
|
-
const sourceEntries = [];
|
|
6746
|
-
for (const entry of optionalEntries) {
|
|
6747
|
-
if (entry != null) {
|
|
6748
|
-
sourceEntries.push(entry);
|
|
6749
|
-
}
|
|
6750
|
-
}
|
|
6751
|
-
const hash = (0, import_node_crypto.createHash)("sha256");
|
|
6752
|
-
hash.update(strategyName);
|
|
6753
|
-
if (sourceEntries.length) {
|
|
6754
|
-
for (const entry of sourceEntries) {
|
|
6755
|
-
hash.update(entry.relativePath);
|
|
6756
|
-
hash.update(entry.content);
|
|
6757
|
-
}
|
|
6758
|
-
} else {
|
|
6759
|
-
hash.update(gitSha ?? "unknown-git-sha");
|
|
6760
|
-
}
|
|
6761
|
-
const fingerprint = hash.digest("hex").slice(0, 16);
|
|
6762
|
-
gateFingerprintCache.set(cacheKey, fingerprint);
|
|
6763
|
-
return fingerprint;
|
|
5133
|
+
if (cached) return cached;
|
|
5134
|
+
const result = await resolveStrategyGateFingerprint({
|
|
5135
|
+
projectRoot,
|
|
5136
|
+
strategyName,
|
|
5137
|
+
gitSha
|
|
5138
|
+
});
|
|
5139
|
+
gateFingerprintCache.set(cacheKey, result);
|
|
5140
|
+
return result;
|
|
6764
5141
|
};
|
|
6765
5142
|
var buildRuntimeLineage = async ({
|
|
6766
5143
|
projectRoot,
|
|
6767
5144
|
strategyName,
|
|
5145
|
+
compositionId,
|
|
6768
5146
|
config,
|
|
6769
5147
|
runContext,
|
|
6770
5148
|
env = process.env
|
|
@@ -6790,19 +5168,25 @@ var buildRuntimeLineage = async ({
|
|
|
6790
5168
|
};
|
|
6791
5169
|
return {
|
|
6792
5170
|
schemaVersion: 1,
|
|
5171
|
+
compositionId: compositionId?.trim() || null,
|
|
6793
5172
|
...git,
|
|
6794
|
-
gateFingerprint: await
|
|
5173
|
+
gateFingerprint: (await resolveRuntimeGateFingerprint({
|
|
6795
5174
|
projectRoot,
|
|
6796
5175
|
strategyName,
|
|
6797
5176
|
gitSha: git.gitSha
|
|
6798
|
-
}),
|
|
6799
|
-
|
|
5177
|
+
})).gateFingerprint,
|
|
5178
|
+
// Position risk is tracked separately so changing trade size does not
|
|
5179
|
+
// masquerade as a change to the core + gate decision logic.
|
|
5180
|
+
configFingerprint: fingerprintRuntimeValue(
|
|
5181
|
+
normalizeRuntimeLogicConfig(config)
|
|
5182
|
+
),
|
|
6800
5183
|
contextFingerprint: fingerprintRuntimeValue(context),
|
|
6801
5184
|
maxLossValue: resolveRuntimeMaxLossValue(config)
|
|
6802
5185
|
};
|
|
6803
5186
|
};
|
|
6804
5187
|
var runtimeLineageKey = (lineage) => [
|
|
6805
5188
|
lineage.schemaVersion,
|
|
5189
|
+
lineage.compositionId ?? "unbound-composition",
|
|
6806
5190
|
lineage.gitSha ?? "unknown",
|
|
6807
5191
|
lineage.gitDirty == null ? "unknown" : lineage.gitDirty ? "dirty" : "clean",
|
|
6808
5192
|
lineage.gateFingerprint,
|
|
@@ -8815,8 +7199,8 @@ var buildReplayExchangeComparisonDetails = ({
|
|
|
8815
7199
|
};
|
|
8816
7200
|
|
|
8817
7201
|
// src/lib/replay/runtimeEvidenceSource.ts
|
|
8818
|
-
var
|
|
8819
|
-
var
|
|
7202
|
+
var import_promises3 = __toESM(require("fs/promises"));
|
|
7203
|
+
var import_node_path3 = __toESM(require("path"));
|
|
8820
7204
|
var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
8821
7205
|
var asFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
8822
7206
|
var unwrapRows = (value, field) => (Array.isArray(value) ? value : []).map((item) => {
|
|
@@ -8877,9 +7261,9 @@ var loadReplayRuntimeEvidenceSource = async ({
|
|
|
8877
7261
|
expectedUserName,
|
|
8878
7262
|
expectedWindow
|
|
8879
7263
|
}) => {
|
|
8880
|
-
const resolvedPath =
|
|
7264
|
+
const resolvedPath = import_node_path3.default.resolve(projectRoot, filePath);
|
|
8881
7265
|
const root = asRecord(
|
|
8882
|
-
JSON.parse(await
|
|
7266
|
+
JSON.parse(await import_promises3.default.readFile(resolvedPath, "utf8"))
|
|
8883
7267
|
);
|
|
8884
7268
|
const runtime = asRecord(root?.runtime) ?? root;
|
|
8885
7269
|
if (!root || !runtime) {
|
|
@@ -9024,11 +7408,11 @@ var filterReplayComparisonByLineage = ({
|
|
|
9024
7408
|
expectedByScope
|
|
9025
7409
|
});
|
|
9026
7410
|
}
|
|
9027
|
-
const
|
|
7411
|
+
const window = deploymentWindows.get(
|
|
9028
7412
|
lineageScopeKey(trade.strategy, trade.symbol)
|
|
9029
7413
|
);
|
|
9030
7414
|
const signalTimestamp = trade.signalTimestamp ?? trade.entryTimestamp;
|
|
9031
|
-
return
|
|
7415
|
+
return window != null && signalTimestamp >= window.firstTimestamp && signalTimestamp <= window.lastTimestamp;
|
|
9032
7416
|
});
|
|
9033
7417
|
for (const artifact of [
|
|
9034
7418
|
...comparableRuntimeSignals,
|
|
@@ -9042,11 +7426,11 @@ var filterReplayComparisonByLineage = ({
|
|
|
9042
7426
|
});
|
|
9043
7427
|
}
|
|
9044
7428
|
const comparableBacktestEntries = backtestEntries.filter((entry) => {
|
|
9045
|
-
const
|
|
7429
|
+
const window = deploymentWindows.get(
|
|
9046
7430
|
lineageScopeKey(entry.strategy, entry.symbol)
|
|
9047
7431
|
);
|
|
9048
7432
|
const signalTimestamp = entry.signalTimestamp ?? entry.timestamp;
|
|
9049
|
-
return
|
|
7433
|
+
return window != null && signalTimestamp >= window.firstTimestamp && signalTimestamp <= window.lastTimestamp;
|
|
9050
7434
|
});
|
|
9051
7435
|
const comparableScopeKeys = new Set(deploymentWindows.keys());
|
|
9052
7436
|
return {
|
|
@@ -9458,11 +7842,11 @@ var saveAndPrintReplayExchangeComparison = async ({
|
|
|
9458
7842
|
runtimeSignalEvaluations,
|
|
9459
7843
|
lineage
|
|
9460
7844
|
}) => {
|
|
9461
|
-
const { connector, connectorName, window
|
|
7845
|
+
const { connector, connectorName, window } = getRuntimeCompareContext();
|
|
9462
7846
|
const rawExchangeEntries = await loadExchangeEntriesForComparison({
|
|
9463
7847
|
connector,
|
|
9464
|
-
startTime:
|
|
9465
|
-
endTime:
|
|
7848
|
+
startTime: window.start,
|
|
7849
|
+
endTime: window.end
|
|
9466
7850
|
});
|
|
9467
7851
|
const strategyNameByOrderLinkKey = buildStrategyNameByOrderLinkKey(
|
|
9468
7852
|
liveStrategySummaries.map((summary) => summary.strategyName)
|
|
@@ -9497,8 +7881,8 @@ var saveAndPrintReplayExchangeComparison = async ({
|
|
|
9497
7881
|
console.log(
|
|
9498
7882
|
import_chalk11.default.yellow(
|
|
9499
7883
|
`SIGNALS REPLAY VS EXCHANGE: no lineage-linked exchange entry executions found for ${connectorName} in ${(0, import_time6.formatUnix)(
|
|
9500
|
-
|
|
9501
|
-
)} -> ${(0, import_time6.formatUnix)(
|
|
7884
|
+
window.start
|
|
7885
|
+
)} -> ${(0, import_time6.formatUnix)(window.end)}`
|
|
9502
7886
|
)
|
|
9503
7887
|
);
|
|
9504
7888
|
console.log("");
|
|
@@ -9694,8 +8078,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9694
8078
|
replayLineages,
|
|
9695
8079
|
runtimeEvidencePath
|
|
9696
8080
|
}) => {
|
|
9697
|
-
const { connector, connectorName, window
|
|
9698
|
-
if (!connector || !
|
|
8081
|
+
const { connector, connectorName, window } = getRuntimeCompareContext();
|
|
8082
|
+
if (!connector || !window) {
|
|
9699
8083
|
return null;
|
|
9700
8084
|
}
|
|
9701
8085
|
const relevantStrategies = new Set(
|
|
@@ -9706,7 +8090,7 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9706
8090
|
filePath: runtimeEvidencePath,
|
|
9707
8091
|
projectRoot: replayProjectRoot,
|
|
9708
8092
|
expectedUserName: replayUserName,
|
|
9709
|
-
expectedWindow:
|
|
8093
|
+
expectedWindow: window
|
|
9710
8094
|
}) : null;
|
|
9711
8095
|
const [
|
|
9712
8096
|
rawRuntimeTrades,
|
|
@@ -9720,20 +8104,20 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9720
8104
|
runtimeEvidence.lineageScopes
|
|
9721
8105
|
] : await Promise.all([
|
|
9722
8106
|
loadRuntimeTrades(replayUserName, {
|
|
9723
|
-
startTime:
|
|
9724
|
-
endTime:
|
|
8107
|
+
startTime: window.start,
|
|
8108
|
+
endTime: window.end
|
|
9725
8109
|
}),
|
|
9726
8110
|
loadRuntimeSignals(replayUserName, {
|
|
9727
|
-
startTime:
|
|
9728
|
-
endTime:
|
|
8111
|
+
startTime: window.start,
|
|
8112
|
+
endTime: window.end
|
|
9729
8113
|
}),
|
|
9730
8114
|
loadRuntimeSignalEvaluations(replayUserName, {
|
|
9731
|
-
startTime:
|
|
9732
|
-
endTime:
|
|
8115
|
+
startTime: window.start,
|
|
8116
|
+
endTime: window.end
|
|
9733
8117
|
}),
|
|
9734
8118
|
loadRuntimeLineageScopes(replayUserName, {
|
|
9735
|
-
startTime:
|
|
9736
|
-
endTime:
|
|
8119
|
+
startTime: window.start,
|
|
8120
|
+
endTime: window.end
|
|
9737
8121
|
})
|
|
9738
8122
|
]);
|
|
9739
8123
|
if (runtimeEvidence) {
|
|
@@ -9747,8 +8131,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9747
8131
|
userName: replayUserName,
|
|
9748
8132
|
connector,
|
|
9749
8133
|
trades: rawRuntimeTrades,
|
|
9750
|
-
startTime:
|
|
9751
|
-
endTime:
|
|
8134
|
+
startTime: window.start,
|
|
8135
|
+
endTime: window.end,
|
|
9752
8136
|
openPositionCallbacks: {
|
|
9753
8137
|
onError: (error) => {
|
|
9754
8138
|
console.log(
|
|
@@ -9792,15 +8176,15 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9792
8176
|
});
|
|
9793
8177
|
const comparableBacktestEntries = comparable.backtestEntries;
|
|
9794
8178
|
const windowRuntimeTrades = comparable.runtimeTrades.filter(
|
|
9795
|
-
(trade) => trade.entryTimestamp >=
|
|
8179
|
+
(trade) => trade.entryTimestamp >= window.start && trade.entryTimestamp < window.end && relevantStrategies.has(trade.strategy)
|
|
9796
8180
|
);
|
|
9797
8181
|
if (!windowRuntimeTrades.length && !runtimeEvidence) {
|
|
9798
8182
|
console.log("");
|
|
9799
8183
|
console.log(
|
|
9800
8184
|
import_chalk11.default.yellow(
|
|
9801
8185
|
`SIGNALS REPLAY VS RUNTIME: no local runtime trades found for ${connectorName} in ${(0, import_time6.formatUnix)(
|
|
9802
|
-
|
|
9803
|
-
)} -> ${(0, import_time6.formatUnix)(
|
|
8186
|
+
window.start
|
|
8187
|
+
)} -> ${(0, import_time6.formatUnix)(window.end)} with matching lineage; checking lineage-linked exchange executions`
|
|
9804
8188
|
)
|
|
9805
8189
|
);
|
|
9806
8190
|
console.log("");
|
|
@@ -9926,8 +8310,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9926
8310
|
};
|
|
9927
8311
|
|
|
9928
8312
|
// src/lib/replay/outputReport.ts
|
|
9929
|
-
var
|
|
9930
|
-
var
|
|
8313
|
+
var import_promises4 = __toESM(require("fs/promises"));
|
|
8314
|
+
var import_node_path4 = __toESM(require("path"));
|
|
9931
8315
|
var import_data = require("@tradejs/core/data");
|
|
9932
8316
|
var formatMsk = (timestamp) => typeof timestamp === "number" && Number.isFinite(timestamp) ? new Intl.DateTimeFormat("ru-RU", {
|
|
9933
8317
|
timeZone: "Europe/Moscow",
|
|
@@ -10225,14 +8609,14 @@ var writeReplayOutputReport = async ({
|
|
|
10225
8609
|
connectorName,
|
|
10226
8610
|
interval,
|
|
10227
8611
|
tickers,
|
|
10228
|
-
window
|
|
8612
|
+
window,
|
|
10229
8613
|
durationSeconds,
|
|
10230
8614
|
replayResult,
|
|
10231
8615
|
strategySnapshot,
|
|
10232
8616
|
runtimeComparison
|
|
10233
8617
|
}) => {
|
|
10234
|
-
const outputDir =
|
|
10235
|
-
await
|
|
8618
|
+
const outputDir = import_node_path4.default.resolve(projectRoot, "data/replay/output");
|
|
8619
|
+
await import_promises4.default.mkdir(outputDir, { recursive: true });
|
|
10236
8620
|
const perTradeAnalysis = buildPerTradeAnalysis(runtimeComparison);
|
|
10237
8621
|
const report = {
|
|
10238
8622
|
reportType: "replay-output",
|
|
@@ -10243,12 +8627,12 @@ var writeReplayOutputReport = async ({
|
|
|
10243
8627
|
interval,
|
|
10244
8628
|
command: process.argv.join(" "),
|
|
10245
8629
|
window: {
|
|
10246
|
-
startTime:
|
|
10247
|
-
endTime:
|
|
10248
|
-
startIso: new Date(
|
|
10249
|
-
endIso: new Date(
|
|
10250
|
-
startMsk: formatMsk(
|
|
10251
|
-
endMsk: formatMsk(
|
|
8630
|
+
startTime: window.start,
|
|
8631
|
+
endTime: window.end,
|
|
8632
|
+
startIso: new Date(window.start).toISOString(),
|
|
8633
|
+
endIso: new Date(window.end).toISOString(),
|
|
8634
|
+
startMsk: formatMsk(window.start),
|
|
8635
|
+
endMsk: formatMsk(window.end)
|
|
10252
8636
|
},
|
|
10253
8637
|
durationSeconds,
|
|
10254
8638
|
counts: {
|
|
@@ -10267,8 +8651,8 @@ var writeReplayOutputReport = async ({
|
|
|
10267
8651
|
runtimeComparison,
|
|
10268
8652
|
perTradeAnalysis
|
|
10269
8653
|
};
|
|
10270
|
-
const markdownPath =
|
|
10271
|
-
const jsonPath =
|
|
8654
|
+
const markdownPath = import_node_path4.default.join(outputDir, `${timestamp}-replay-report.md`);
|
|
8655
|
+
const jsonPath = import_node_path4.default.join(outputDir, `${timestamp}-replay-report.json`);
|
|
10272
8656
|
const lines = [
|
|
10273
8657
|
"# Replay Report",
|
|
10274
8658
|
"",
|
|
@@ -10285,7 +8669,7 @@ var writeReplayOutputReport = async ({
|
|
|
10285
8669
|
["Strategies", replayResult.strategies.length],
|
|
10286
8670
|
["Signals", replayResult.signals.length],
|
|
10287
8671
|
["Duration", `${durationSeconds.toFixed(2)}s`],
|
|
10288
|
-
["Window", `${formatMsk(
|
|
8672
|
+
["Window", `${formatMsk(window.start)} - ${formatMsk(window.end)} MSK`],
|
|
10289
8673
|
["Runtime compare mode", runtimeComparison?.mode ?? "none"],
|
|
10290
8674
|
["Matched", runtimeComparison?.matchedCount ?? 0],
|
|
10291
8675
|
["Order failed", runtimeComparison?.orderFailedCount ?? 0],
|
|
@@ -10334,8 +8718,8 @@ var writeReplayOutputReport = async ({
|
|
|
10334
8718
|
""
|
|
10335
8719
|
];
|
|
10336
8720
|
await Promise.all([
|
|
10337
|
-
|
|
10338
|
-
|
|
8721
|
+
import_promises4.default.writeFile(markdownPath, lines.join("\n"), "utf8"),
|
|
8722
|
+
import_promises4.default.writeFile(jsonPath, `${(0, import_data.toJson)(report, true)}
|
|
10339
8723
|
`, "utf8")
|
|
10340
8724
|
]);
|
|
10341
8725
|
return {
|
|
@@ -10366,7 +8750,7 @@ var finishReplay = async ({
|
|
|
10366
8750
|
replayResult,
|
|
10367
8751
|
tickers,
|
|
10368
8752
|
connectorName,
|
|
10369
|
-
window
|
|
8753
|
+
window
|
|
10370
8754
|
}) => {
|
|
10371
8755
|
const replayStrategySnapshot = await saveAndPrintReplayResultsByStrategy({
|
|
10372
8756
|
replayResult,
|
|
@@ -10406,7 +8790,7 @@ var finishReplay = async ({
|
|
|
10406
8790
|
connectorName,
|
|
10407
8791
|
interval: replayInterval,
|
|
10408
8792
|
tickers,
|
|
10409
|
-
window
|
|
8793
|
+
window,
|
|
10410
8794
|
durationSeconds,
|
|
10411
8795
|
replayResult,
|
|
10412
8796
|
strategySnapshot: replayStrategySnapshot,
|