@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
package/dist/scripts/replay.js
CHANGED
|
@@ -5,13 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __commonJS = (cb, mod) => function __require() {
|
|
9
|
-
try {
|
|
10
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
11
|
-
} catch (e) {
|
|
12
|
-
throw mod = 0, e;
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
8
|
var __export = (target, all) => {
|
|
16
9
|
for (var name in all)
|
|
17
10
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -34,1605 +27,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
34
27
|
));
|
|
35
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
36
29
|
|
|
37
|
-
// ../../node_modules/ms/index.js
|
|
38
|
-
var require_ms = __commonJS({
|
|
39
|
-
"../../node_modules/ms/index.js"(exports2, module2) {
|
|
40
|
-
"use strict";
|
|
41
|
-
var s = 1e3;
|
|
42
|
-
var m = s * 60;
|
|
43
|
-
var h = m * 60;
|
|
44
|
-
var d = h * 24;
|
|
45
|
-
var w = d * 7;
|
|
46
|
-
var y = d * 365.25;
|
|
47
|
-
module2.exports = function(val, options) {
|
|
48
|
-
options = options || {};
|
|
49
|
-
var type = typeof val;
|
|
50
|
-
if (type === "string" && val.length > 0) {
|
|
51
|
-
return parse(val);
|
|
52
|
-
} else if (type === "number" && isFinite(val)) {
|
|
53
|
-
return options.long ? fmtLong(val) : fmtShort(val);
|
|
54
|
-
}
|
|
55
|
-
throw new Error(
|
|
56
|
-
"val is not a non-empty string or a valid number. val=" + JSON.stringify(val)
|
|
57
|
-
);
|
|
58
|
-
};
|
|
59
|
-
function parse(str) {
|
|
60
|
-
str = String(str);
|
|
61
|
-
if (str.length > 100) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
|
|
65
|
-
str
|
|
66
|
-
);
|
|
67
|
-
if (!match) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
var n = parseFloat(match[1]);
|
|
71
|
-
var type = (match[2] || "ms").toLowerCase();
|
|
72
|
-
switch (type) {
|
|
73
|
-
case "years":
|
|
74
|
-
case "year":
|
|
75
|
-
case "yrs":
|
|
76
|
-
case "yr":
|
|
77
|
-
case "y":
|
|
78
|
-
return n * y;
|
|
79
|
-
case "weeks":
|
|
80
|
-
case "week":
|
|
81
|
-
case "w":
|
|
82
|
-
return n * w;
|
|
83
|
-
case "days":
|
|
84
|
-
case "day":
|
|
85
|
-
case "d":
|
|
86
|
-
return n * d;
|
|
87
|
-
case "hours":
|
|
88
|
-
case "hour":
|
|
89
|
-
case "hrs":
|
|
90
|
-
case "hr":
|
|
91
|
-
case "h":
|
|
92
|
-
return n * h;
|
|
93
|
-
case "minutes":
|
|
94
|
-
case "minute":
|
|
95
|
-
case "mins":
|
|
96
|
-
case "min":
|
|
97
|
-
case "m":
|
|
98
|
-
return n * m;
|
|
99
|
-
case "seconds":
|
|
100
|
-
case "second":
|
|
101
|
-
case "secs":
|
|
102
|
-
case "sec":
|
|
103
|
-
case "s":
|
|
104
|
-
return n * s;
|
|
105
|
-
case "milliseconds":
|
|
106
|
-
case "millisecond":
|
|
107
|
-
case "msecs":
|
|
108
|
-
case "msec":
|
|
109
|
-
case "ms":
|
|
110
|
-
return n;
|
|
111
|
-
default:
|
|
112
|
-
return void 0;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
function fmtShort(ms) {
|
|
116
|
-
var msAbs = Math.abs(ms);
|
|
117
|
-
if (msAbs >= d) {
|
|
118
|
-
return Math.round(ms / d) + "d";
|
|
119
|
-
}
|
|
120
|
-
if (msAbs >= h) {
|
|
121
|
-
return Math.round(ms / h) + "h";
|
|
122
|
-
}
|
|
123
|
-
if (msAbs >= m) {
|
|
124
|
-
return Math.round(ms / m) + "m";
|
|
125
|
-
}
|
|
126
|
-
if (msAbs >= s) {
|
|
127
|
-
return Math.round(ms / s) + "s";
|
|
128
|
-
}
|
|
129
|
-
return ms + "ms";
|
|
130
|
-
}
|
|
131
|
-
function fmtLong(ms) {
|
|
132
|
-
var msAbs = Math.abs(ms);
|
|
133
|
-
if (msAbs >= d) {
|
|
134
|
-
return plural(ms, msAbs, d, "day");
|
|
135
|
-
}
|
|
136
|
-
if (msAbs >= h) {
|
|
137
|
-
return plural(ms, msAbs, h, "hour");
|
|
138
|
-
}
|
|
139
|
-
if (msAbs >= m) {
|
|
140
|
-
return plural(ms, msAbs, m, "minute");
|
|
141
|
-
}
|
|
142
|
-
if (msAbs >= s) {
|
|
143
|
-
return plural(ms, msAbs, s, "second");
|
|
144
|
-
}
|
|
145
|
-
return ms + " ms";
|
|
146
|
-
}
|
|
147
|
-
function plural(ms, msAbs, n, name) {
|
|
148
|
-
var isPlural = msAbs >= n * 1.5;
|
|
149
|
-
return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// ../../node_modules/list-it/node_modules/debug/src/common.js
|
|
155
|
-
var require_common = __commonJS({
|
|
156
|
-
"../../node_modules/list-it/node_modules/debug/src/common.js"(exports2, module2) {
|
|
157
|
-
"use strict";
|
|
158
|
-
function setup(env) {
|
|
159
|
-
createDebug.debug = createDebug;
|
|
160
|
-
createDebug.default = createDebug;
|
|
161
|
-
createDebug.coerce = coerce;
|
|
162
|
-
createDebug.disable = disable;
|
|
163
|
-
createDebug.enable = enable;
|
|
164
|
-
createDebug.enabled = enabled;
|
|
165
|
-
createDebug.humanize = require_ms();
|
|
166
|
-
createDebug.destroy = destroy;
|
|
167
|
-
Object.keys(env).forEach((key) => {
|
|
168
|
-
createDebug[key] = env[key];
|
|
169
|
-
});
|
|
170
|
-
createDebug.names = [];
|
|
171
|
-
createDebug.skips = [];
|
|
172
|
-
createDebug.formatters = {};
|
|
173
|
-
function selectColor(namespace) {
|
|
174
|
-
let hash = 0;
|
|
175
|
-
for (let i = 0; i < namespace.length; i++) {
|
|
176
|
-
hash = (hash << 5) - hash + namespace.charCodeAt(i);
|
|
177
|
-
hash |= 0;
|
|
178
|
-
}
|
|
179
|
-
return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
|
|
180
|
-
}
|
|
181
|
-
createDebug.selectColor = selectColor;
|
|
182
|
-
function createDebug(namespace) {
|
|
183
|
-
let prevTime;
|
|
184
|
-
let enableOverride = null;
|
|
185
|
-
let namespacesCache;
|
|
186
|
-
let enabledCache;
|
|
187
|
-
function debug(...args2) {
|
|
188
|
-
if (!debug.enabled) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
const self = debug;
|
|
192
|
-
const curr = Number(/* @__PURE__ */ new Date());
|
|
193
|
-
const ms = curr - (prevTime || curr);
|
|
194
|
-
self.diff = ms;
|
|
195
|
-
self.prev = prevTime;
|
|
196
|
-
self.curr = curr;
|
|
197
|
-
prevTime = curr;
|
|
198
|
-
args2[0] = createDebug.coerce(args2[0]);
|
|
199
|
-
if (typeof args2[0] !== "string") {
|
|
200
|
-
args2.unshift("%O");
|
|
201
|
-
}
|
|
202
|
-
let index = 0;
|
|
203
|
-
args2[0] = args2[0].replace(/%([a-zA-Z%])/g, (match, format2) => {
|
|
204
|
-
if (match === "%%") {
|
|
205
|
-
return "%";
|
|
206
|
-
}
|
|
207
|
-
index++;
|
|
208
|
-
const formatter = createDebug.formatters[format2];
|
|
209
|
-
if (typeof formatter === "function") {
|
|
210
|
-
const val = args2[index];
|
|
211
|
-
match = formatter.call(self, val);
|
|
212
|
-
args2.splice(index, 1);
|
|
213
|
-
index--;
|
|
214
|
-
}
|
|
215
|
-
return match;
|
|
216
|
-
});
|
|
217
|
-
createDebug.formatArgs.call(self, args2);
|
|
218
|
-
const logFn = self.log || createDebug.log;
|
|
219
|
-
logFn.apply(self, args2);
|
|
220
|
-
}
|
|
221
|
-
debug.namespace = namespace;
|
|
222
|
-
debug.useColors = createDebug.useColors();
|
|
223
|
-
debug.color = createDebug.selectColor(namespace);
|
|
224
|
-
debug.extend = extend;
|
|
225
|
-
debug.destroy = createDebug.destroy;
|
|
226
|
-
Object.defineProperty(debug, "enabled", {
|
|
227
|
-
enumerable: true,
|
|
228
|
-
configurable: false,
|
|
229
|
-
get: () => {
|
|
230
|
-
if (enableOverride !== null) {
|
|
231
|
-
return enableOverride;
|
|
232
|
-
}
|
|
233
|
-
if (namespacesCache !== createDebug.namespaces) {
|
|
234
|
-
namespacesCache = createDebug.namespaces;
|
|
235
|
-
enabledCache = createDebug.enabled(namespace);
|
|
236
|
-
}
|
|
237
|
-
return enabledCache;
|
|
238
|
-
},
|
|
239
|
-
set: (v) => {
|
|
240
|
-
enableOverride = v;
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
if (typeof createDebug.init === "function") {
|
|
244
|
-
createDebug.init(debug);
|
|
245
|
-
}
|
|
246
|
-
return debug;
|
|
247
|
-
}
|
|
248
|
-
function extend(namespace, delimiter) {
|
|
249
|
-
const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace);
|
|
250
|
-
newDebug.log = this.log;
|
|
251
|
-
return newDebug;
|
|
252
|
-
}
|
|
253
|
-
function enable(namespaces) {
|
|
254
|
-
createDebug.save(namespaces);
|
|
255
|
-
createDebug.namespaces = namespaces;
|
|
256
|
-
createDebug.names = [];
|
|
257
|
-
createDebug.skips = [];
|
|
258
|
-
const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(/\s+/g, ",").split(",").filter(Boolean);
|
|
259
|
-
for (const ns of split) {
|
|
260
|
-
if (ns[0] === "-") {
|
|
261
|
-
createDebug.skips.push(ns.slice(1));
|
|
262
|
-
} else {
|
|
263
|
-
createDebug.names.push(ns);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
function matchesTemplate(search, template) {
|
|
268
|
-
let searchIndex = 0;
|
|
269
|
-
let templateIndex = 0;
|
|
270
|
-
let starIndex = -1;
|
|
271
|
-
let matchIndex = 0;
|
|
272
|
-
while (searchIndex < search.length) {
|
|
273
|
-
if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === "*")) {
|
|
274
|
-
if (template[templateIndex] === "*") {
|
|
275
|
-
starIndex = templateIndex;
|
|
276
|
-
matchIndex = searchIndex;
|
|
277
|
-
templateIndex++;
|
|
278
|
-
} else {
|
|
279
|
-
searchIndex++;
|
|
280
|
-
templateIndex++;
|
|
281
|
-
}
|
|
282
|
-
} else if (starIndex !== -1) {
|
|
283
|
-
templateIndex = starIndex + 1;
|
|
284
|
-
matchIndex++;
|
|
285
|
-
searchIndex = matchIndex;
|
|
286
|
-
} else {
|
|
287
|
-
return false;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
while (templateIndex < template.length && template[templateIndex] === "*") {
|
|
291
|
-
templateIndex++;
|
|
292
|
-
}
|
|
293
|
-
return templateIndex === template.length;
|
|
294
|
-
}
|
|
295
|
-
function disable() {
|
|
296
|
-
const namespaces = [
|
|
297
|
-
...createDebug.names,
|
|
298
|
-
...createDebug.skips.map((namespace) => "-" + namespace)
|
|
299
|
-
].join(",");
|
|
300
|
-
createDebug.enable("");
|
|
301
|
-
return namespaces;
|
|
302
|
-
}
|
|
303
|
-
function enabled(name) {
|
|
304
|
-
for (const skip of createDebug.skips) {
|
|
305
|
-
if (matchesTemplate(name, skip)) {
|
|
306
|
-
return false;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
for (const ns of createDebug.names) {
|
|
310
|
-
if (matchesTemplate(name, ns)) {
|
|
311
|
-
return true;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
return false;
|
|
315
|
-
}
|
|
316
|
-
function coerce(val) {
|
|
317
|
-
if (val instanceof Error) {
|
|
318
|
-
return val.stack || val.message;
|
|
319
|
-
}
|
|
320
|
-
return val;
|
|
321
|
-
}
|
|
322
|
-
function destroy() {
|
|
323
|
-
console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
|
|
324
|
-
}
|
|
325
|
-
createDebug.enable(createDebug.load());
|
|
326
|
-
return createDebug;
|
|
327
|
-
}
|
|
328
|
-
module2.exports = setup;
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
// ../../node_modules/list-it/node_modules/debug/src/browser.js
|
|
333
|
-
var require_browser = __commonJS({
|
|
334
|
-
"../../node_modules/list-it/node_modules/debug/src/browser.js"(exports2, module2) {
|
|
335
|
-
"use strict";
|
|
336
|
-
exports2.formatArgs = formatArgs;
|
|
337
|
-
exports2.save = save;
|
|
338
|
-
exports2.load = load;
|
|
339
|
-
exports2.useColors = useColors;
|
|
340
|
-
exports2.storage = localstorage();
|
|
341
|
-
exports2.destroy = /* @__PURE__ */ (() => {
|
|
342
|
-
let warned = false;
|
|
343
|
-
return () => {
|
|
344
|
-
if (!warned) {
|
|
345
|
-
warned = true;
|
|
346
|
-
console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
|
|
347
|
-
}
|
|
348
|
-
};
|
|
349
|
-
})();
|
|
350
|
-
exports2.colors = [
|
|
351
|
-
"#0000CC",
|
|
352
|
-
"#0000FF",
|
|
353
|
-
"#0033CC",
|
|
354
|
-
"#0033FF",
|
|
355
|
-
"#0066CC",
|
|
356
|
-
"#0066FF",
|
|
357
|
-
"#0099CC",
|
|
358
|
-
"#0099FF",
|
|
359
|
-
"#00CC00",
|
|
360
|
-
"#00CC33",
|
|
361
|
-
"#00CC66",
|
|
362
|
-
"#00CC99",
|
|
363
|
-
"#00CCCC",
|
|
364
|
-
"#00CCFF",
|
|
365
|
-
"#3300CC",
|
|
366
|
-
"#3300FF",
|
|
367
|
-
"#3333CC",
|
|
368
|
-
"#3333FF",
|
|
369
|
-
"#3366CC",
|
|
370
|
-
"#3366FF",
|
|
371
|
-
"#3399CC",
|
|
372
|
-
"#3399FF",
|
|
373
|
-
"#33CC00",
|
|
374
|
-
"#33CC33",
|
|
375
|
-
"#33CC66",
|
|
376
|
-
"#33CC99",
|
|
377
|
-
"#33CCCC",
|
|
378
|
-
"#33CCFF",
|
|
379
|
-
"#6600CC",
|
|
380
|
-
"#6600FF",
|
|
381
|
-
"#6633CC",
|
|
382
|
-
"#6633FF",
|
|
383
|
-
"#66CC00",
|
|
384
|
-
"#66CC33",
|
|
385
|
-
"#9900CC",
|
|
386
|
-
"#9900FF",
|
|
387
|
-
"#9933CC",
|
|
388
|
-
"#9933FF",
|
|
389
|
-
"#99CC00",
|
|
390
|
-
"#99CC33",
|
|
391
|
-
"#CC0000",
|
|
392
|
-
"#CC0033",
|
|
393
|
-
"#CC0066",
|
|
394
|
-
"#CC0099",
|
|
395
|
-
"#CC00CC",
|
|
396
|
-
"#CC00FF",
|
|
397
|
-
"#CC3300",
|
|
398
|
-
"#CC3333",
|
|
399
|
-
"#CC3366",
|
|
400
|
-
"#CC3399",
|
|
401
|
-
"#CC33CC",
|
|
402
|
-
"#CC33FF",
|
|
403
|
-
"#CC6600",
|
|
404
|
-
"#CC6633",
|
|
405
|
-
"#CC9900",
|
|
406
|
-
"#CC9933",
|
|
407
|
-
"#CCCC00",
|
|
408
|
-
"#CCCC33",
|
|
409
|
-
"#FF0000",
|
|
410
|
-
"#FF0033",
|
|
411
|
-
"#FF0066",
|
|
412
|
-
"#FF0099",
|
|
413
|
-
"#FF00CC",
|
|
414
|
-
"#FF00FF",
|
|
415
|
-
"#FF3300",
|
|
416
|
-
"#FF3333",
|
|
417
|
-
"#FF3366",
|
|
418
|
-
"#FF3399",
|
|
419
|
-
"#FF33CC",
|
|
420
|
-
"#FF33FF",
|
|
421
|
-
"#FF6600",
|
|
422
|
-
"#FF6633",
|
|
423
|
-
"#FF9900",
|
|
424
|
-
"#FF9933",
|
|
425
|
-
"#FFCC00",
|
|
426
|
-
"#FFCC33"
|
|
427
|
-
];
|
|
428
|
-
function useColors() {
|
|
429
|
-
if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) {
|
|
430
|
-
return true;
|
|
431
|
-
}
|
|
432
|
-
if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
|
|
433
|
-
return false;
|
|
434
|
-
}
|
|
435
|
-
let m;
|
|
436
|
-
return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
|
|
437
|
-
typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
|
|
438
|
-
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
|
|
439
|
-
typeof navigator !== "undefined" && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
|
|
440
|
-
typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
|
|
441
|
-
}
|
|
442
|
-
function formatArgs(args2) {
|
|
443
|
-
args2[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args2[0] + (this.useColors ? "%c " : " ") + "+" + module2.exports.humanize(this.diff);
|
|
444
|
-
if (!this.useColors) {
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
const c = "color: " + this.color;
|
|
448
|
-
args2.splice(1, 0, c, "color: inherit");
|
|
449
|
-
let index = 0;
|
|
450
|
-
let lastC = 0;
|
|
451
|
-
args2[0].replace(/%[a-zA-Z%]/g, (match) => {
|
|
452
|
-
if (match === "%%") {
|
|
453
|
-
return;
|
|
454
|
-
}
|
|
455
|
-
index++;
|
|
456
|
-
if (match === "%c") {
|
|
457
|
-
lastC = index;
|
|
458
|
-
}
|
|
459
|
-
});
|
|
460
|
-
args2.splice(lastC, 0, c);
|
|
461
|
-
}
|
|
462
|
-
exports2.log = console.debug || console.log || (() => {
|
|
463
|
-
});
|
|
464
|
-
function save(namespaces) {
|
|
465
|
-
try {
|
|
466
|
-
if (namespaces) {
|
|
467
|
-
exports2.storage.setItem("debug", namespaces);
|
|
468
|
-
} else {
|
|
469
|
-
exports2.storage.removeItem("debug");
|
|
470
|
-
}
|
|
471
|
-
} catch (error) {
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
function load() {
|
|
475
|
-
let r;
|
|
476
|
-
try {
|
|
477
|
-
r = exports2.storage.getItem("debug") || exports2.storage.getItem("DEBUG");
|
|
478
|
-
} catch (error) {
|
|
479
|
-
}
|
|
480
|
-
if (!r && typeof process !== "undefined" && "env" in process) {
|
|
481
|
-
r = process.env.DEBUG;
|
|
482
|
-
}
|
|
483
|
-
return r;
|
|
484
|
-
}
|
|
485
|
-
function localstorage() {
|
|
486
|
-
try {
|
|
487
|
-
return localStorage;
|
|
488
|
-
} catch (error) {
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
module2.exports = require_common()(exports2);
|
|
492
|
-
var { formatters } = module2.exports;
|
|
493
|
-
formatters.j = function(v) {
|
|
494
|
-
try {
|
|
495
|
-
return JSON.stringify(v);
|
|
496
|
-
} catch (error) {
|
|
497
|
-
return "[UnexpectedJSONParseError]: " + error.message;
|
|
498
|
-
}
|
|
499
|
-
};
|
|
500
|
-
}
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
// ../../node_modules/has-flag/index.js
|
|
504
|
-
var require_has_flag = __commonJS({
|
|
505
|
-
"../../node_modules/has-flag/index.js"(exports2, module2) {
|
|
506
|
-
"use strict";
|
|
507
|
-
module2.exports = (flag, argv = process.argv) => {
|
|
508
|
-
const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--";
|
|
509
|
-
const position = argv.indexOf(prefix + flag);
|
|
510
|
-
const terminatorPosition = argv.indexOf("--");
|
|
511
|
-
return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
});
|
|
515
|
-
|
|
516
|
-
// ../../node_modules/supports-color/index.js
|
|
517
|
-
var require_supports_color = __commonJS({
|
|
518
|
-
"../../node_modules/supports-color/index.js"(exports2, module2) {
|
|
519
|
-
"use strict";
|
|
520
|
-
var os = require("os");
|
|
521
|
-
var tty = require("tty");
|
|
522
|
-
var hasFlag = require_has_flag();
|
|
523
|
-
var { env } = process;
|
|
524
|
-
var forceColor;
|
|
525
|
-
if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) {
|
|
526
|
-
forceColor = 0;
|
|
527
|
-
} else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) {
|
|
528
|
-
forceColor = 1;
|
|
529
|
-
}
|
|
530
|
-
if ("FORCE_COLOR" in env) {
|
|
531
|
-
if (env.FORCE_COLOR === "true") {
|
|
532
|
-
forceColor = 1;
|
|
533
|
-
} else if (env.FORCE_COLOR === "false") {
|
|
534
|
-
forceColor = 0;
|
|
535
|
-
} else {
|
|
536
|
-
forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
function translateLevel(level) {
|
|
540
|
-
if (level === 0) {
|
|
541
|
-
return false;
|
|
542
|
-
}
|
|
543
|
-
return {
|
|
544
|
-
level,
|
|
545
|
-
hasBasic: true,
|
|
546
|
-
has256: level >= 2,
|
|
547
|
-
has16m: level >= 3
|
|
548
|
-
};
|
|
549
|
-
}
|
|
550
|
-
function supportsColor(haveStream, streamIsTTY) {
|
|
551
|
-
if (forceColor === 0) {
|
|
552
|
-
return 0;
|
|
553
|
-
}
|
|
554
|
-
if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) {
|
|
555
|
-
return 3;
|
|
556
|
-
}
|
|
557
|
-
if (hasFlag("color=256")) {
|
|
558
|
-
return 2;
|
|
559
|
-
}
|
|
560
|
-
if (haveStream && !streamIsTTY && forceColor === void 0) {
|
|
561
|
-
return 0;
|
|
562
|
-
}
|
|
563
|
-
const min = forceColor || 0;
|
|
564
|
-
if (env.TERM === "dumb") {
|
|
565
|
-
return min;
|
|
566
|
-
}
|
|
567
|
-
if (process.platform === "win32") {
|
|
568
|
-
const osRelease = os.release().split(".");
|
|
569
|
-
if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
|
|
570
|
-
return Number(osRelease[2]) >= 14931 ? 3 : 2;
|
|
571
|
-
}
|
|
572
|
-
return 1;
|
|
573
|
-
}
|
|
574
|
-
if ("CI" in env) {
|
|
575
|
-
if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((sign) => sign in env) || env.CI_NAME === "codeship") {
|
|
576
|
-
return 1;
|
|
577
|
-
}
|
|
578
|
-
return min;
|
|
579
|
-
}
|
|
580
|
-
if ("TEAMCITY_VERSION" in env) {
|
|
581
|
-
return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
|
|
582
|
-
}
|
|
583
|
-
if (env.COLORTERM === "truecolor") {
|
|
584
|
-
return 3;
|
|
585
|
-
}
|
|
586
|
-
if ("TERM_PROGRAM" in env) {
|
|
587
|
-
const version = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
|
|
588
|
-
switch (env.TERM_PROGRAM) {
|
|
589
|
-
case "iTerm.app":
|
|
590
|
-
return version >= 3 ? 3 : 2;
|
|
591
|
-
case "Apple_Terminal":
|
|
592
|
-
return 2;
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
if (/-256(color)?$/i.test(env.TERM)) {
|
|
596
|
-
return 2;
|
|
597
|
-
}
|
|
598
|
-
if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
|
|
599
|
-
return 1;
|
|
600
|
-
}
|
|
601
|
-
if ("COLORTERM" in env) {
|
|
602
|
-
return 1;
|
|
603
|
-
}
|
|
604
|
-
return min;
|
|
605
|
-
}
|
|
606
|
-
function getSupportLevel(stream) {
|
|
607
|
-
const level = supportsColor(stream, stream && stream.isTTY);
|
|
608
|
-
return translateLevel(level);
|
|
609
|
-
}
|
|
610
|
-
module2.exports = {
|
|
611
|
-
supportsColor: getSupportLevel,
|
|
612
|
-
stdout: translateLevel(supportsColor(true, tty.isatty(1))),
|
|
613
|
-
stderr: translateLevel(supportsColor(true, tty.isatty(2)))
|
|
614
|
-
};
|
|
615
|
-
}
|
|
616
|
-
});
|
|
617
|
-
|
|
618
|
-
// ../../node_modules/list-it/node_modules/debug/src/node.js
|
|
619
|
-
var require_node = __commonJS({
|
|
620
|
-
"../../node_modules/list-it/node_modules/debug/src/node.js"(exports2, module2) {
|
|
621
|
-
"use strict";
|
|
622
|
-
var tty = require("tty");
|
|
623
|
-
var util = require("util");
|
|
624
|
-
exports2.init = init;
|
|
625
|
-
exports2.log = log;
|
|
626
|
-
exports2.formatArgs = formatArgs;
|
|
627
|
-
exports2.save = save;
|
|
628
|
-
exports2.load = load;
|
|
629
|
-
exports2.useColors = useColors;
|
|
630
|
-
exports2.destroy = util.deprecate(
|
|
631
|
-
() => {
|
|
632
|
-
},
|
|
633
|
-
"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."
|
|
634
|
-
);
|
|
635
|
-
exports2.colors = [6, 2, 3, 4, 5, 1];
|
|
636
|
-
try {
|
|
637
|
-
const supportsColor = require_supports_color();
|
|
638
|
-
if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
|
|
639
|
-
exports2.colors = [
|
|
640
|
-
20,
|
|
641
|
-
21,
|
|
642
|
-
26,
|
|
643
|
-
27,
|
|
644
|
-
32,
|
|
645
|
-
33,
|
|
646
|
-
38,
|
|
647
|
-
39,
|
|
648
|
-
40,
|
|
649
|
-
41,
|
|
650
|
-
42,
|
|
651
|
-
43,
|
|
652
|
-
44,
|
|
653
|
-
45,
|
|
654
|
-
56,
|
|
655
|
-
57,
|
|
656
|
-
62,
|
|
657
|
-
63,
|
|
658
|
-
68,
|
|
659
|
-
69,
|
|
660
|
-
74,
|
|
661
|
-
75,
|
|
662
|
-
76,
|
|
663
|
-
77,
|
|
664
|
-
78,
|
|
665
|
-
79,
|
|
666
|
-
80,
|
|
667
|
-
81,
|
|
668
|
-
92,
|
|
669
|
-
93,
|
|
670
|
-
98,
|
|
671
|
-
99,
|
|
672
|
-
112,
|
|
673
|
-
113,
|
|
674
|
-
128,
|
|
675
|
-
129,
|
|
676
|
-
134,
|
|
677
|
-
135,
|
|
678
|
-
148,
|
|
679
|
-
149,
|
|
680
|
-
160,
|
|
681
|
-
161,
|
|
682
|
-
162,
|
|
683
|
-
163,
|
|
684
|
-
164,
|
|
685
|
-
165,
|
|
686
|
-
166,
|
|
687
|
-
167,
|
|
688
|
-
168,
|
|
689
|
-
169,
|
|
690
|
-
170,
|
|
691
|
-
171,
|
|
692
|
-
172,
|
|
693
|
-
173,
|
|
694
|
-
178,
|
|
695
|
-
179,
|
|
696
|
-
184,
|
|
697
|
-
185,
|
|
698
|
-
196,
|
|
699
|
-
197,
|
|
700
|
-
198,
|
|
701
|
-
199,
|
|
702
|
-
200,
|
|
703
|
-
201,
|
|
704
|
-
202,
|
|
705
|
-
203,
|
|
706
|
-
204,
|
|
707
|
-
205,
|
|
708
|
-
206,
|
|
709
|
-
207,
|
|
710
|
-
208,
|
|
711
|
-
209,
|
|
712
|
-
214,
|
|
713
|
-
215,
|
|
714
|
-
220,
|
|
715
|
-
221
|
|
716
|
-
];
|
|
717
|
-
}
|
|
718
|
-
} catch (error) {
|
|
719
|
-
}
|
|
720
|
-
exports2.inspectOpts = Object.keys(process.env).filter((key) => {
|
|
721
|
-
return /^debug_/i.test(key);
|
|
722
|
-
}).reduce((obj, key) => {
|
|
723
|
-
const prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, (_, k) => {
|
|
724
|
-
return k.toUpperCase();
|
|
725
|
-
});
|
|
726
|
-
let val = process.env[key];
|
|
727
|
-
if (/^(yes|on|true|enabled)$/i.test(val)) {
|
|
728
|
-
val = true;
|
|
729
|
-
} else if (/^(no|off|false|disabled)$/i.test(val)) {
|
|
730
|
-
val = false;
|
|
731
|
-
} else if (val === "null") {
|
|
732
|
-
val = null;
|
|
733
|
-
} else {
|
|
734
|
-
val = Number(val);
|
|
735
|
-
}
|
|
736
|
-
obj[prop] = val;
|
|
737
|
-
return obj;
|
|
738
|
-
}, {});
|
|
739
|
-
function useColors() {
|
|
740
|
-
return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty.isatty(process.stderr.fd);
|
|
741
|
-
}
|
|
742
|
-
function formatArgs(args2) {
|
|
743
|
-
const { namespace: name, useColors: useColors2 } = this;
|
|
744
|
-
if (useColors2) {
|
|
745
|
-
const c = this.color;
|
|
746
|
-
const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c);
|
|
747
|
-
const prefix = ` ${colorCode};1m${name} \x1B[0m`;
|
|
748
|
-
args2[0] = prefix + args2[0].split("\n").join("\n" + prefix);
|
|
749
|
-
args2.push(colorCode + "m+" + module2.exports.humanize(this.diff) + "\x1B[0m");
|
|
750
|
-
} else {
|
|
751
|
-
args2[0] = getDate() + name + " " + args2[0];
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
function getDate() {
|
|
755
|
-
if (exports2.inspectOpts.hideDate) {
|
|
756
|
-
return "";
|
|
757
|
-
}
|
|
758
|
-
return (/* @__PURE__ */ new Date()).toISOString() + " ";
|
|
759
|
-
}
|
|
760
|
-
function log(...args2) {
|
|
761
|
-
return process.stderr.write(util.formatWithOptions(exports2.inspectOpts, ...args2) + "\n");
|
|
762
|
-
}
|
|
763
|
-
function save(namespaces) {
|
|
764
|
-
if (namespaces) {
|
|
765
|
-
process.env.DEBUG = namespaces;
|
|
766
|
-
} else {
|
|
767
|
-
delete process.env.DEBUG;
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
function load() {
|
|
771
|
-
return process.env.DEBUG;
|
|
772
|
-
}
|
|
773
|
-
function init(debug) {
|
|
774
|
-
debug.inspectOpts = {};
|
|
775
|
-
const keys = Object.keys(exports2.inspectOpts);
|
|
776
|
-
for (let i = 0; i < keys.length; i++) {
|
|
777
|
-
debug.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]];
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
module2.exports = require_common()(exports2);
|
|
781
|
-
var { formatters } = module2.exports;
|
|
782
|
-
formatters.o = function(v) {
|
|
783
|
-
this.inspectOpts.colors = this.useColors;
|
|
784
|
-
return util.inspect(v, this.inspectOpts).split("\n").map((str) => str.trim()).join(" ");
|
|
785
|
-
};
|
|
786
|
-
formatters.O = function(v) {
|
|
787
|
-
this.inspectOpts.colors = this.useColors;
|
|
788
|
-
return util.inspect(v, this.inspectOpts);
|
|
789
|
-
};
|
|
790
|
-
}
|
|
791
|
-
});
|
|
792
|
-
|
|
793
|
-
// ../../node_modules/list-it/node_modules/debug/src/index.js
|
|
794
|
-
var require_src = __commonJS({
|
|
795
|
-
"../../node_modules/list-it/node_modules/debug/src/index.js"(exports2, module2) {
|
|
796
|
-
"use strict";
|
|
797
|
-
if (typeof process === "undefined" || process.type === "renderer" || process.browser === true || process.__nwjs) {
|
|
798
|
-
module2.exports = require_browser();
|
|
799
|
-
} else {
|
|
800
|
-
module2.exports = require_node();
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
});
|
|
804
|
-
|
|
805
|
-
// ../../node_modules/eastasianwidth/eastasianwidth.js
|
|
806
|
-
var require_eastasianwidth = __commonJS({
|
|
807
|
-
"../../node_modules/eastasianwidth/eastasianwidth.js"(exports2, module2) {
|
|
808
|
-
"use strict";
|
|
809
|
-
var eaw = {};
|
|
810
|
-
if ("undefined" == typeof module2) {
|
|
811
|
-
window.eastasianwidth = eaw;
|
|
812
|
-
} else {
|
|
813
|
-
module2.exports = eaw;
|
|
814
|
-
}
|
|
815
|
-
eaw.eastAsianWidth = function(character) {
|
|
816
|
-
var x = character.charCodeAt(0);
|
|
817
|
-
var y = character.length == 2 ? character.charCodeAt(1) : 0;
|
|
818
|
-
var codePoint = x;
|
|
819
|
-
if (55296 <= x && x <= 56319 && (56320 <= y && y <= 57343)) {
|
|
820
|
-
x &= 1023;
|
|
821
|
-
y &= 1023;
|
|
822
|
-
codePoint = x << 10 | y;
|
|
823
|
-
codePoint += 65536;
|
|
824
|
-
}
|
|
825
|
-
if (12288 == codePoint || 65281 <= codePoint && codePoint <= 65376 || 65504 <= codePoint && codePoint <= 65510) {
|
|
826
|
-
return "F";
|
|
827
|
-
}
|
|
828
|
-
if (8361 == codePoint || 65377 <= codePoint && codePoint <= 65470 || 65474 <= codePoint && codePoint <= 65479 || 65482 <= codePoint && codePoint <= 65487 || 65490 <= codePoint && codePoint <= 65495 || 65498 <= codePoint && codePoint <= 65500 || 65512 <= codePoint && codePoint <= 65518) {
|
|
829
|
-
return "H";
|
|
830
|
-
}
|
|
831
|
-
if (4352 <= codePoint && codePoint <= 4447 || 4515 <= codePoint && codePoint <= 4519 || 4602 <= codePoint && codePoint <= 4607 || 9001 <= codePoint && codePoint <= 9002 || 11904 <= codePoint && codePoint <= 11929 || 11931 <= codePoint && codePoint <= 12019 || 12032 <= codePoint && codePoint <= 12245 || 12272 <= codePoint && codePoint <= 12283 || 12289 <= codePoint && codePoint <= 12350 || 12353 <= codePoint && codePoint <= 12438 || 12441 <= codePoint && codePoint <= 12543 || 12549 <= codePoint && codePoint <= 12589 || 12593 <= codePoint && codePoint <= 12686 || 12688 <= codePoint && codePoint <= 12730 || 12736 <= codePoint && codePoint <= 12771 || 12784 <= codePoint && codePoint <= 12830 || 12832 <= codePoint && codePoint <= 12871 || 12880 <= codePoint && codePoint <= 13054 || 13056 <= codePoint && codePoint <= 19903 || 19968 <= codePoint && codePoint <= 42124 || 42128 <= codePoint && codePoint <= 42182 || 43360 <= codePoint && codePoint <= 43388 || 44032 <= codePoint && codePoint <= 55203 || 55216 <= codePoint && codePoint <= 55238 || 55243 <= codePoint && codePoint <= 55291 || 63744 <= codePoint && codePoint <= 64255 || 65040 <= codePoint && codePoint <= 65049 || 65072 <= codePoint && codePoint <= 65106 || 65108 <= codePoint && codePoint <= 65126 || 65128 <= codePoint && codePoint <= 65131 || 110592 <= codePoint && codePoint <= 110593 || 127488 <= codePoint && codePoint <= 127490 || 127504 <= codePoint && codePoint <= 127546 || 127552 <= codePoint && codePoint <= 127560 || 127568 <= codePoint && codePoint <= 127569 || 131072 <= codePoint && codePoint <= 194367 || 177984 <= codePoint && codePoint <= 196605 || 196608 <= codePoint && codePoint <= 262141) {
|
|
832
|
-
return "W";
|
|
833
|
-
}
|
|
834
|
-
if (32 <= codePoint && codePoint <= 126 || 162 <= codePoint && codePoint <= 163 || 165 <= codePoint && codePoint <= 166 || 172 == codePoint || 175 == codePoint || 10214 <= codePoint && codePoint <= 10221 || 10629 <= codePoint && codePoint <= 10630) {
|
|
835
|
-
return "Na";
|
|
836
|
-
}
|
|
837
|
-
if (161 == codePoint || 164 == codePoint || 167 <= codePoint && codePoint <= 168 || 170 == codePoint || 173 <= codePoint && codePoint <= 174 || 176 <= codePoint && codePoint <= 180 || 182 <= codePoint && codePoint <= 186 || 188 <= codePoint && codePoint <= 191 || 198 == codePoint || 208 == codePoint || 215 <= codePoint && codePoint <= 216 || 222 <= codePoint && codePoint <= 225 || 230 == codePoint || 232 <= codePoint && codePoint <= 234 || 236 <= codePoint && codePoint <= 237 || 240 == codePoint || 242 <= codePoint && codePoint <= 243 || 247 <= codePoint && codePoint <= 250 || 252 == codePoint || 254 == codePoint || 257 == codePoint || 273 == codePoint || 275 == codePoint || 283 == codePoint || 294 <= codePoint && codePoint <= 295 || 299 == codePoint || 305 <= codePoint && codePoint <= 307 || 312 == codePoint || 319 <= codePoint && codePoint <= 322 || 324 == codePoint || 328 <= codePoint && codePoint <= 331 || 333 == codePoint || 338 <= codePoint && codePoint <= 339 || 358 <= codePoint && codePoint <= 359 || 363 == codePoint || 462 == codePoint || 464 == codePoint || 466 == codePoint || 468 == codePoint || 470 == codePoint || 472 == codePoint || 474 == codePoint || 476 == codePoint || 593 == codePoint || 609 == codePoint || 708 == codePoint || 711 == codePoint || 713 <= codePoint && codePoint <= 715 || 717 == codePoint || 720 == codePoint || 728 <= codePoint && codePoint <= 731 || 733 == codePoint || 735 == codePoint || 768 <= codePoint && codePoint <= 879 || 913 <= codePoint && codePoint <= 929 || 931 <= codePoint && codePoint <= 937 || 945 <= codePoint && codePoint <= 961 || 963 <= codePoint && codePoint <= 969 || 1025 == codePoint || 1040 <= codePoint && codePoint <= 1103 || 1105 == codePoint || 8208 == codePoint || 8211 <= codePoint && codePoint <= 8214 || 8216 <= codePoint && codePoint <= 8217 || 8220 <= codePoint && codePoint <= 8221 || 8224 <= codePoint && codePoint <= 8226 || 8228 <= codePoint && codePoint <= 8231 || 8240 == codePoint || 8242 <= codePoint && codePoint <= 8243 || 8245 == codePoint || 8251 == codePoint || 8254 == codePoint || 8308 == codePoint || 8319 == codePoint || 8321 <= codePoint && codePoint <= 8324 || 8364 == codePoint || 8451 == codePoint || 8453 == codePoint || 8457 == codePoint || 8467 == codePoint || 8470 == codePoint || 8481 <= codePoint && codePoint <= 8482 || 8486 == codePoint || 8491 == codePoint || 8531 <= codePoint && codePoint <= 8532 || 8539 <= codePoint && codePoint <= 8542 || 8544 <= codePoint && codePoint <= 8555 || 8560 <= codePoint && codePoint <= 8569 || 8585 == codePoint || 8592 <= codePoint && codePoint <= 8601 || 8632 <= codePoint && codePoint <= 8633 || 8658 == codePoint || 8660 == codePoint || 8679 == codePoint || 8704 == codePoint || 8706 <= codePoint && codePoint <= 8707 || 8711 <= codePoint && codePoint <= 8712 || 8715 == codePoint || 8719 == codePoint || 8721 == codePoint || 8725 == codePoint || 8730 == codePoint || 8733 <= codePoint && codePoint <= 8736 || 8739 == codePoint || 8741 == codePoint || 8743 <= codePoint && codePoint <= 8748 || 8750 == codePoint || 8756 <= codePoint && codePoint <= 8759 || 8764 <= codePoint && codePoint <= 8765 || 8776 == codePoint || 8780 == codePoint || 8786 == codePoint || 8800 <= codePoint && codePoint <= 8801 || 8804 <= codePoint && codePoint <= 8807 || 8810 <= codePoint && codePoint <= 8811 || 8814 <= codePoint && codePoint <= 8815 || 8834 <= codePoint && codePoint <= 8835 || 8838 <= codePoint && codePoint <= 8839 || 8853 == codePoint || 8857 == codePoint || 8869 == codePoint || 8895 == codePoint || 8978 == codePoint || 9312 <= codePoint && codePoint <= 9449 || 9451 <= codePoint && codePoint <= 9547 || 9552 <= codePoint && codePoint <= 9587 || 9600 <= codePoint && codePoint <= 9615 || 9618 <= codePoint && codePoint <= 9621 || 9632 <= codePoint && codePoint <= 9633 || 9635 <= codePoint && codePoint <= 9641 || 9650 <= codePoint && codePoint <= 9651 || 9654 <= codePoint && codePoint <= 9655 || 9660 <= codePoint && codePoint <= 9661 || 9664 <= codePoint && codePoint <= 9665 || 9670 <= codePoint && codePoint <= 9672 || 9675 == codePoint || 9678 <= codePoint && codePoint <= 9681 || 9698 <= codePoint && codePoint <= 9701 || 9711 == codePoint || 9733 <= codePoint && codePoint <= 9734 || 9737 == codePoint || 9742 <= codePoint && codePoint <= 9743 || 9748 <= codePoint && codePoint <= 9749 || 9756 == codePoint || 9758 == codePoint || 9792 == codePoint || 9794 == codePoint || 9824 <= codePoint && codePoint <= 9825 || 9827 <= codePoint && codePoint <= 9829 || 9831 <= codePoint && codePoint <= 9834 || 9836 <= codePoint && codePoint <= 9837 || 9839 == codePoint || 9886 <= codePoint && codePoint <= 9887 || 9918 <= codePoint && codePoint <= 9919 || 9924 <= codePoint && codePoint <= 9933 || 9935 <= codePoint && codePoint <= 9953 || 9955 == codePoint || 9960 <= codePoint && codePoint <= 9983 || 10045 == codePoint || 10071 == codePoint || 10102 <= codePoint && codePoint <= 10111 || 11093 <= codePoint && codePoint <= 11097 || 12872 <= codePoint && codePoint <= 12879 || 57344 <= codePoint && codePoint <= 63743 || 65024 <= codePoint && codePoint <= 65039 || 65533 == codePoint || 127232 <= codePoint && codePoint <= 127242 || 127248 <= codePoint && codePoint <= 127277 || 127280 <= codePoint && codePoint <= 127337 || 127344 <= codePoint && codePoint <= 127386 || 917760 <= codePoint && codePoint <= 917999 || 983040 <= codePoint && codePoint <= 1048573 || 1048576 <= codePoint && codePoint <= 1114109) {
|
|
838
|
-
return "A";
|
|
839
|
-
}
|
|
840
|
-
return "N";
|
|
841
|
-
};
|
|
842
|
-
eaw.characterLength = function(character) {
|
|
843
|
-
var code = this.eastAsianWidth(character);
|
|
844
|
-
if (code == "F" || code == "W" || code == "A") {
|
|
845
|
-
return 2;
|
|
846
|
-
} else {
|
|
847
|
-
return 1;
|
|
848
|
-
}
|
|
849
|
-
};
|
|
850
|
-
function stringToArray(string) {
|
|
851
|
-
return string.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
|
|
852
|
-
}
|
|
853
|
-
eaw.length = function(string) {
|
|
854
|
-
var characters = stringToArray(string);
|
|
855
|
-
var len = 0;
|
|
856
|
-
for (var i = 0; i < characters.length; i++) {
|
|
857
|
-
len = len + this.characterLength(characters[i]);
|
|
858
|
-
}
|
|
859
|
-
return len;
|
|
860
|
-
};
|
|
861
|
-
eaw.slice = function(text, start, end) {
|
|
862
|
-
textLen = eaw.length(text);
|
|
863
|
-
start = start ? start : 0;
|
|
864
|
-
end = end ? end : 1;
|
|
865
|
-
if (start < 0) {
|
|
866
|
-
start = textLen + start;
|
|
867
|
-
}
|
|
868
|
-
if (end < 0) {
|
|
869
|
-
end = textLen + end;
|
|
870
|
-
}
|
|
871
|
-
var result = "";
|
|
872
|
-
var eawLen = 0;
|
|
873
|
-
var chars = stringToArray(text);
|
|
874
|
-
for (var i = 0; i < chars.length; i++) {
|
|
875
|
-
var char = chars[i];
|
|
876
|
-
var charLen = eaw.length(char);
|
|
877
|
-
if (eawLen >= start - (charLen == 2 ? 1 : 0)) {
|
|
878
|
-
if (eawLen + charLen <= end) {
|
|
879
|
-
result += char;
|
|
880
|
-
} else {
|
|
881
|
-
break;
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
eawLen += charLen;
|
|
885
|
-
}
|
|
886
|
-
return result;
|
|
887
|
-
};
|
|
888
|
-
}
|
|
889
|
-
});
|
|
890
|
-
|
|
891
|
-
// ../../node_modules/list-it/lib/data-cell.js
|
|
892
|
-
var require_data_cell = __commonJS({
|
|
893
|
-
"../../node_modules/list-it/lib/data-cell.js"(exports2, module2) {
|
|
894
|
-
"use strict";
|
|
895
|
-
var eaw = require_eastasianwidth();
|
|
896
|
-
function DataCell() {
|
|
897
|
-
this.data = "";
|
|
898
|
-
}
|
|
899
|
-
module2.exports = DataCell;
|
|
900
|
-
DataCell.prototype.getData = function() {
|
|
901
|
-
return this.data;
|
|
902
|
-
};
|
|
903
|
-
DataCell.prototype.setData = function(data) {
|
|
904
|
-
this.data = data;
|
|
905
|
-
};
|
|
906
|
-
DataCell.prototype.visibleLength = function() {
|
|
907
|
-
if (typeof this.data != "string") {
|
|
908
|
-
return ("" + this.data).length;
|
|
909
|
-
}
|
|
910
|
-
return DataCell.visibleLength(this.data);
|
|
911
|
-
};
|
|
912
|
-
DataCell.visibleLength = function(data) {
|
|
913
|
-
const s = data.replace(/\x1b[^m]*m/g, "");
|
|
914
|
-
return eaw.length(s);
|
|
915
|
-
};
|
|
916
|
-
}
|
|
917
|
-
});
|
|
918
|
-
|
|
919
|
-
// ../../node_modules/list-it/lib/row.js
|
|
920
|
-
var require_row = __commonJS({
|
|
921
|
-
"../../node_modules/list-it/lib/row.js"(exports2, module2) {
|
|
922
|
-
"use strict";
|
|
923
|
-
function Row() {
|
|
924
|
-
this.cells = [];
|
|
925
|
-
this.empty = true;
|
|
926
|
-
this.fixed = false;
|
|
927
|
-
}
|
|
928
|
-
module2.exports = Row;
|
|
929
|
-
Row.prototype.getCellLength = function() {
|
|
930
|
-
return this.cells.length;
|
|
931
|
-
};
|
|
932
|
-
Row.prototype.getCell = function(idx) {
|
|
933
|
-
return this.cells[idx];
|
|
934
|
-
};
|
|
935
|
-
Row.prototype.pushCell = function(cell) {
|
|
936
|
-
if (this.isFixed()) {
|
|
937
|
-
throw "pushCell Fail, The row was already fixed.";
|
|
938
|
-
}
|
|
939
|
-
this.empty = false;
|
|
940
|
-
return this.cells.push(cell);
|
|
941
|
-
};
|
|
942
|
-
Row.prototype.fix = function() {
|
|
943
|
-
this.fixed = true;
|
|
944
|
-
};
|
|
945
|
-
Row.prototype.isEmpty = function() {
|
|
946
|
-
return this.empty;
|
|
947
|
-
};
|
|
948
|
-
Row.prototype.isFixed = function() {
|
|
949
|
-
return this.fixed;
|
|
950
|
-
};
|
|
951
|
-
}
|
|
952
|
-
});
|
|
953
|
-
|
|
954
|
-
// ../../node_modules/list-it/lib/column.js
|
|
955
|
-
var require_column = __commonJS({
|
|
956
|
-
"../../node_modules/list-it/lib/column.js"(exports2, module2) {
|
|
957
|
-
"use strict";
|
|
958
|
-
var DataCell = require_data_cell();
|
|
959
|
-
function Column() {
|
|
960
|
-
this.opt = {
|
|
961
|
-
"autoAlign": false
|
|
962
|
-
};
|
|
963
|
-
this.width = 0;
|
|
964
|
-
this.textWidth = null;
|
|
965
|
-
this.intLen = 0;
|
|
966
|
-
this.fracLen = 0;
|
|
967
|
-
this.expLen = 0;
|
|
968
|
-
this.cellAtRow = {};
|
|
969
|
-
this.header = null;
|
|
970
|
-
}
|
|
971
|
-
module2.exports = Column;
|
|
972
|
-
Column.prototype.getWidth = function() {
|
|
973
|
-
return this.width;
|
|
974
|
-
};
|
|
975
|
-
Column.prototype.setTextWidth = function(textWidth) {
|
|
976
|
-
this.textWidth = textWidth;
|
|
977
|
-
};
|
|
978
|
-
Column.prototype.setCellAt = function(row, cell) {
|
|
979
|
-
this.cellAtRow[row] = cell;
|
|
980
|
-
};
|
|
981
|
-
Column.prototype.setHeader = function(header) {
|
|
982
|
-
this.header = header;
|
|
983
|
-
};
|
|
984
|
-
Column.prototype.hasHeader = function() {
|
|
985
|
-
return this.header != null;
|
|
986
|
-
};
|
|
987
|
-
Column.prototype.updateWidth = function() {
|
|
988
|
-
const headerWidth = !this.hasHeader() ? 0 : DataCell.visibleLength("" + this.header);
|
|
989
|
-
this.width = headerWidth;
|
|
990
|
-
Object.keys(this.cellAtRow).forEach((key) => {
|
|
991
|
-
const cell = this.cellAtRow[key];
|
|
992
|
-
const data = cell.getData();
|
|
993
|
-
let width = cell.visibleLength();
|
|
994
|
-
if (typeof data == "number") {
|
|
995
|
-
if (this.opt.autoAlign) {
|
|
996
|
-
this.updateNumWidth(data);
|
|
997
|
-
width = this.getNumMaxWidth();
|
|
998
|
-
}
|
|
999
|
-
}
|
|
1000
|
-
if (width > this.width) {
|
|
1001
|
-
this.width = width;
|
|
1002
|
-
}
|
|
1003
|
-
if (typeof data == "string") {
|
|
1004
|
-
if (this.textWidth && this.textWidth > headerWidth) {
|
|
1005
|
-
if (this.width > this.textWidth) {
|
|
1006
|
-
this.width = this.textWidth;
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
});
|
|
1011
|
-
};
|
|
1012
|
-
Column.prototype.formatColumnHeader = function() {
|
|
1013
|
-
if (!this.hasHeader()) {
|
|
1014
|
-
return null;
|
|
1015
|
-
}
|
|
1016
|
-
const width = this.getWidth();
|
|
1017
|
-
const header = this.header;
|
|
1018
|
-
const headerWidth = DataCell.visibleLength("" + header);
|
|
1019
|
-
if (header.length == headerWidth && width - headerWidth <= 0) {
|
|
1020
|
-
return ("" + header).substring(0, width);
|
|
1021
|
-
}
|
|
1022
|
-
return "" + header + " ".repeat(width - headerWidth);
|
|
1023
|
-
};
|
|
1024
|
-
Column.prototype.formatCell = function(data) {
|
|
1025
|
-
const width = this.getWidth();
|
|
1026
|
-
if (this.opt.autoAlign) {
|
|
1027
|
-
if (typeof data == "number") {
|
|
1028
|
-
return this.makeAutoAlignNum(data).padStart(width, " ");
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
const dataWidth = DataCell.visibleLength("" + data);
|
|
1032
|
-
if (data.length == dataWidth && width - dataWidth <= 0) {
|
|
1033
|
-
return ("" + data).substring(0, width);
|
|
1034
|
-
}
|
|
1035
|
-
return "" + data + " ".repeat(width - dataWidth);
|
|
1036
|
-
};
|
|
1037
|
-
Column.prototype.setAutoAlign = function(autoAlign) {
|
|
1038
|
-
this.opt.autoAlign = autoAlign;
|
|
1039
|
-
};
|
|
1040
|
-
Column.prototype.updateNumWidth = function(num) {
|
|
1041
|
-
const numInfo = this.analyzeNumber(num);
|
|
1042
|
-
const intLen = numInfo.intStr.length;
|
|
1043
|
-
const fracLen = numInfo.fracStr.length;
|
|
1044
|
-
const expLen = numInfo.expStr.length;
|
|
1045
|
-
if (intLen > this.intLen) {
|
|
1046
|
-
this.intLen = intLen;
|
|
1047
|
-
}
|
|
1048
|
-
if (fracLen > this.fracLen) {
|
|
1049
|
-
this.fracLen = fracLen;
|
|
1050
|
-
}
|
|
1051
|
-
if (expLen > this.expLen) {
|
|
1052
|
-
this.expLen = expLen;
|
|
1053
|
-
}
|
|
1054
|
-
};
|
|
1055
|
-
Column.prototype.getNumMaxWidth = function() {
|
|
1056
|
-
return this.intLen + this.fracLen + (this.fracLen > 0 ? 1 : 0) + this.expLen + (this.expLen > 0 ? 1 : 0);
|
|
1057
|
-
};
|
|
1058
|
-
Column.prototype.makeAutoAlignNum = function(num) {
|
|
1059
|
-
const numInfo = this.analyzeNumber(num);
|
|
1060
|
-
const intStr = numInfo.intStr.padStart(this.intLen, " ");
|
|
1061
|
-
const fracStr = numInfo.expStr != "" ? numInfo.fracStr.padEnd(this.fracLen, "0") : numInfo.fracStr.padEnd(this.fracLen, " ");
|
|
1062
|
-
const expStr = numInfo.expStr.padEnd(this.expLen, " ");
|
|
1063
|
-
if (numInfo.expStr != "") {
|
|
1064
|
-
return [intStr, ".", fracStr, "e", expStr].join("");
|
|
1065
|
-
}
|
|
1066
|
-
if (numInfo.pointPos >= 0) {
|
|
1067
|
-
if (this.expLen > 0) {
|
|
1068
|
-
return [intStr, ".", fracStr, " ", expStr].join("");
|
|
1069
|
-
}
|
|
1070
|
-
return [intStr, ".", fracStr].join("");
|
|
1071
|
-
} else if (this.fracLen == 0) {
|
|
1072
|
-
return intStr;
|
|
1073
|
-
}
|
|
1074
|
-
if (this.expLen > 0) {
|
|
1075
|
-
return [intStr, ".0", fracStr.substr(1), " ", expStr].join("");
|
|
1076
|
-
}
|
|
1077
|
-
return [intStr, ".0", fracStr.substr(1)].join("");
|
|
1078
|
-
};
|
|
1079
|
-
Column.prototype.analyzeNumber = function(num) {
|
|
1080
|
-
const s = "" + num;
|
|
1081
|
-
let intStr = "";
|
|
1082
|
-
let fracStr = "";
|
|
1083
|
-
const pointPos = s.indexOf(".");
|
|
1084
|
-
const expIndex = s.indexOf("e");
|
|
1085
|
-
if (expIndex >= 0) {
|
|
1086
|
-
if (pointPos < 0) {
|
|
1087
|
-
return {
|
|
1088
|
-
pointPos: expIndex,
|
|
1089
|
-
intStr: s.substr(0, expIndex),
|
|
1090
|
-
fracStr: "0",
|
|
1091
|
-
expStr: s.substr(expIndex + 1)
|
|
1092
|
-
};
|
|
1093
|
-
}
|
|
1094
|
-
return {
|
|
1095
|
-
pointPos,
|
|
1096
|
-
intStr: s.substr(0, pointPos),
|
|
1097
|
-
fracStr: s.substring(pointPos + 1, expIndex),
|
|
1098
|
-
expStr: s.substr(expIndex + 1)
|
|
1099
|
-
};
|
|
1100
|
-
}
|
|
1101
|
-
if (pointPos < 0) {
|
|
1102
|
-
intStr = s;
|
|
1103
|
-
} else {
|
|
1104
|
-
intStr = s.substr(0, pointPos);
|
|
1105
|
-
fracStr = s.substr(pointPos + 1);
|
|
1106
|
-
}
|
|
1107
|
-
return {
|
|
1108
|
-
"pointPos": pointPos,
|
|
1109
|
-
"intStr": intStr,
|
|
1110
|
-
"fracStr": fracStr,
|
|
1111
|
-
"expStr": ""
|
|
1112
|
-
};
|
|
1113
|
-
};
|
|
1114
|
-
}
|
|
1115
|
-
});
|
|
1116
|
-
|
|
1117
|
-
// ../../node_modules/ansi-escape-sequences/dist/index.cjs
|
|
1118
|
-
var require_dist = __commonJS({
|
|
1119
|
-
"../../node_modules/ansi-escape-sequences/dist/index.cjs"(exports2, module2) {
|
|
1120
|
-
"use strict";
|
|
1121
|
-
function isObject(input) {
|
|
1122
|
-
return typeof input === "object" && input !== null;
|
|
1123
|
-
}
|
|
1124
|
-
function isArrayLike(input) {
|
|
1125
|
-
return isObject(input) && typeof input.length === "number";
|
|
1126
|
-
}
|
|
1127
|
-
function arrayify(input) {
|
|
1128
|
-
if (Array.isArray(input)) {
|
|
1129
|
-
return input;
|
|
1130
|
-
} else if (input === void 0) {
|
|
1131
|
-
return [];
|
|
1132
|
-
} else if (isArrayLike(input) || input instanceof Set) {
|
|
1133
|
-
return Array.from(input);
|
|
1134
|
-
} else {
|
|
1135
|
-
return [input];
|
|
1136
|
-
}
|
|
1137
|
-
}
|
|
1138
|
-
var csi = "\x1B[";
|
|
1139
|
-
var ansi = {};
|
|
1140
|
-
ansi.style = {
|
|
1141
|
-
reset: "\x1B[0m",
|
|
1142
|
-
bold: "\x1B[1m",
|
|
1143
|
-
italic: "\x1B[3m",
|
|
1144
|
-
underline: "\x1B[4m",
|
|
1145
|
-
fontDefault: "\x1B[10m",
|
|
1146
|
-
font2: "\x1B[11m",
|
|
1147
|
-
font3: "\x1B[12m",
|
|
1148
|
-
font4: "\x1B[13m",
|
|
1149
|
-
font5: "\x1B[14m",
|
|
1150
|
-
font6: "\x1B[15m",
|
|
1151
|
-
imageNegative: "\x1B[7m",
|
|
1152
|
-
imagePositive: "\x1B[27m",
|
|
1153
|
-
black: "\x1B[30m",
|
|
1154
|
-
red: "\x1B[31m",
|
|
1155
|
-
green: "\x1B[32m",
|
|
1156
|
-
yellow: "\x1B[33m",
|
|
1157
|
-
blue: "\x1B[34m",
|
|
1158
|
-
magenta: "\x1B[35m",
|
|
1159
|
-
cyan: "\x1B[36m",
|
|
1160
|
-
white: "\x1B[37m",
|
|
1161
|
-
grey: "\x1B[90m",
|
|
1162
|
-
gray: "\x1B[90m",
|
|
1163
|
-
brightRed: "\x1B[91m",
|
|
1164
|
-
brightGreen: "\x1B[92m",
|
|
1165
|
-
brightYellow: "\x1B[93m",
|
|
1166
|
-
brightBlue: "\x1B[94m",
|
|
1167
|
-
brightMagenta: "\x1B[95m",
|
|
1168
|
-
brightCyan: "\x1B[96m",
|
|
1169
|
-
brightWhite: "\x1B[97m",
|
|
1170
|
-
"bg-black": "\x1B[40m",
|
|
1171
|
-
"bg-red": "\x1B[41m",
|
|
1172
|
-
"bg-green": "\x1B[42m",
|
|
1173
|
-
"bg-yellow": "\x1B[43m",
|
|
1174
|
-
"bg-blue": "\x1B[44m",
|
|
1175
|
-
"bg-magenta": "\x1B[45m",
|
|
1176
|
-
"bg-cyan": "\x1B[46m",
|
|
1177
|
-
"bg-white": "\x1B[47m",
|
|
1178
|
-
"bg-grey": "\x1B[100m",
|
|
1179
|
-
"bg-gray": "\x1B[100m",
|
|
1180
|
-
"bg-brightRed": "\x1B[101m",
|
|
1181
|
-
"bg-brightGreen": "\x1B[102m",
|
|
1182
|
-
"bg-brightYellow": "\x1B[103m",
|
|
1183
|
-
"bg-brightBlue": "\x1B[104m",
|
|
1184
|
-
"bg-brightMagenta": "\x1B[105m",
|
|
1185
|
-
"bg-brightCyan": "\x1B[106m",
|
|
1186
|
-
"bg-brightWhite": "\x1B[107m"
|
|
1187
|
-
};
|
|
1188
|
-
ansi.rgb = function(r, g, b) {
|
|
1189
|
-
return `\x1B[38;2;${r};${g};${b}m`;
|
|
1190
|
-
};
|
|
1191
|
-
ansi.bgRgb = function(r, g, b) {
|
|
1192
|
-
return `\x1B[48;2;${r};${g};${b}m`;
|
|
1193
|
-
};
|
|
1194
|
-
ansi.styles = function(styles) {
|
|
1195
|
-
styles = arrayify(styles);
|
|
1196
|
-
return styles.map(function(effect) {
|
|
1197
|
-
const rgbMatches = effect.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
|
|
1198
|
-
const bgRgbMatches = effect.match(/bg-rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
|
|
1199
|
-
if (bgRgbMatches) {
|
|
1200
|
-
const [full, r, g, b] = bgRgbMatches;
|
|
1201
|
-
return ansi.bgRgb(r, g, b);
|
|
1202
|
-
} else if (rgbMatches) {
|
|
1203
|
-
const [full, r, g, b] = rgbMatches;
|
|
1204
|
-
return ansi.rgb(r, g, b);
|
|
1205
|
-
} else {
|
|
1206
|
-
return ansi.style[effect];
|
|
1207
|
-
}
|
|
1208
|
-
}).join("");
|
|
1209
|
-
};
|
|
1210
|
-
ansi.format = function(str, styleArray) {
|
|
1211
|
-
const re = /\[([\w\s-\(\),]+)\]{([^]*?)}/;
|
|
1212
|
-
let matches;
|
|
1213
|
-
str = String(str);
|
|
1214
|
-
if (!str) return "";
|
|
1215
|
-
while (matches = str.match(re)) {
|
|
1216
|
-
const inlineStyles = matches[1].split(/\s+/);
|
|
1217
|
-
const inlineString = matches[2];
|
|
1218
|
-
str = str.replace(matches[0], ansi.format(inlineString, inlineStyles));
|
|
1219
|
-
}
|
|
1220
|
-
return styleArray && styleArray.length ? ansi.styles(styleArray) + str + ansi.style.reset : str;
|
|
1221
|
-
};
|
|
1222
|
-
ansi.cursor = {
|
|
1223
|
-
/**
|
|
1224
|
-
* Moves the cursor `lines` cells up. If the cursor is already at the edge of the screen, this has no effect
|
|
1225
|
-
* @param [lines=1] {number}
|
|
1226
|
-
* @return {string}
|
|
1227
|
-
*/
|
|
1228
|
-
up: function(lines) {
|
|
1229
|
-
return csi + (lines || 1) + "A";
|
|
1230
|
-
},
|
|
1231
|
-
/**
|
|
1232
|
-
* Moves the cursor `lines` cells down. If the cursor is already at the edge of the screen, this has no effect
|
|
1233
|
-
* @param [lines=1] {number}
|
|
1234
|
-
* @return {string}
|
|
1235
|
-
*/
|
|
1236
|
-
down: function(lines) {
|
|
1237
|
-
return csi + (lines || 1) + "B";
|
|
1238
|
-
},
|
|
1239
|
-
/**
|
|
1240
|
-
* Moves the cursor `lines` cells forward. If the cursor is already at the edge of the screen, this has no effect
|
|
1241
|
-
* @param [lines=1] {number}
|
|
1242
|
-
* @return {string}
|
|
1243
|
-
*/
|
|
1244
|
-
forward: function(lines) {
|
|
1245
|
-
return csi + (lines || 1) + "C";
|
|
1246
|
-
},
|
|
1247
|
-
/**
|
|
1248
|
-
* Moves the cursor `lines` cells back. If the cursor is already at the edge of the screen, this has no effect
|
|
1249
|
-
* @param [lines=1] {number}
|
|
1250
|
-
* @return {string}
|
|
1251
|
-
*/
|
|
1252
|
-
back: function(lines) {
|
|
1253
|
-
return csi + (lines || 1) + "D";
|
|
1254
|
-
},
|
|
1255
|
-
/**
|
|
1256
|
-
* Moves cursor to beginning of the line n lines down.
|
|
1257
|
-
* @param [lines=1] {number}
|
|
1258
|
-
* @return {string}
|
|
1259
|
-
*/
|
|
1260
|
-
nextLine: function(lines) {
|
|
1261
|
-
return csi + (lines || 1) + "E";
|
|
1262
|
-
},
|
|
1263
|
-
/**
|
|
1264
|
-
* Moves cursor to beginning of the line n lines up.
|
|
1265
|
-
* @param [lines=1] {number}
|
|
1266
|
-
* @return {string}
|
|
1267
|
-
*/
|
|
1268
|
-
previousLine: function(lines) {
|
|
1269
|
-
return csi + (lines || 1) + "F";
|
|
1270
|
-
},
|
|
1271
|
-
/**
|
|
1272
|
-
* Moves the cursor to column n.
|
|
1273
|
-
* @param n {number} - column number
|
|
1274
|
-
* @return {string}
|
|
1275
|
-
*/
|
|
1276
|
-
horizontalAbsolute: function(n) {
|
|
1277
|
-
return csi + n + "G";
|
|
1278
|
-
},
|
|
1279
|
-
/**
|
|
1280
|
-
* Moves the cursor to row n, column m. The values are 1-based, and default to 1 (top left corner) if omitted.
|
|
1281
|
-
* @param n {number} - row number
|
|
1282
|
-
* @param m {number} - column number
|
|
1283
|
-
* @return {string}
|
|
1284
|
-
*/
|
|
1285
|
-
position: function(n, m) {
|
|
1286
|
-
return csi + (n || 1) + ";" + (m || 1) + "H";
|
|
1287
|
-
},
|
|
1288
|
-
/**
|
|
1289
|
-
* Hides the cursor
|
|
1290
|
-
*/
|
|
1291
|
-
hide: csi + "?25l",
|
|
1292
|
-
/**
|
|
1293
|
-
* Shows the cursor
|
|
1294
|
-
*/
|
|
1295
|
-
show: csi + "?25h"
|
|
1296
|
-
};
|
|
1297
|
-
ansi.erase = {
|
|
1298
|
-
/**
|
|
1299
|
-
* Clears part of the screen. If n is 0 (or missing), clear from cursor to end of screen. If n is 1, clear from cursor to beginning of the screen. If n is 2, clear entire screen.
|
|
1300
|
-
* @param n {number}
|
|
1301
|
-
* @return {string}
|
|
1302
|
-
*/
|
|
1303
|
-
display: function(n) {
|
|
1304
|
-
return csi + (n || 0) + "J";
|
|
1305
|
-
},
|
|
1306
|
-
/**
|
|
1307
|
-
* Erases part of the line. If n is zero (or missing), clear from cursor to the end of the line. If n is one, clear from cursor to beginning of the line. If n is two, clear entire line. Cursor position does not change.
|
|
1308
|
-
* @param n {number}
|
|
1309
|
-
* @return {string}
|
|
1310
|
-
*/
|
|
1311
|
-
inLine: function(n) {
|
|
1312
|
-
return csi + (n || 0) + "K";
|
|
1313
|
-
}
|
|
1314
|
-
};
|
|
1315
|
-
module2.exports = ansi;
|
|
1316
|
-
}
|
|
1317
|
-
});
|
|
1318
|
-
|
|
1319
|
-
// ../../node_modules/list-it/lib/list-it-buffer.js
|
|
1320
|
-
var require_list_it_buffer = __commonJS({
|
|
1321
|
-
"../../node_modules/list-it/lib/list-it-buffer.js"(exports2, module2) {
|
|
1322
|
-
"use strict";
|
|
1323
|
-
var debug = require_src()("list-it-buffer");
|
|
1324
|
-
var DataCell = require_data_cell();
|
|
1325
|
-
var Row = require_row();
|
|
1326
|
-
var Column = require_column();
|
|
1327
|
-
var ansi = require_dist();
|
|
1328
|
-
function ListItBuffer(opt) {
|
|
1329
|
-
opt = opt || {};
|
|
1330
|
-
this.opt = {
|
|
1331
|
-
"autoAlign": true,
|
|
1332
|
-
"columnWidth": null,
|
|
1333
|
-
"header": null,
|
|
1334
|
-
"headerBold": false,
|
|
1335
|
-
"headerColor": "",
|
|
1336
|
-
"headerUnderline": false
|
|
1337
|
-
};
|
|
1338
|
-
if (opt.header != null && !Array.isArray(opt.header)) {
|
|
1339
|
-
throw new Error([
|
|
1340
|
-
`Invalid header was specified. It must be an array, but (${JSON.stringify(opt.header)}):${typeof opt.header} was specified.`
|
|
1341
|
-
].join(" "));
|
|
1342
|
-
}
|
|
1343
|
-
if (opt.headerColor && !(opt.headerColor in COLORS)) {
|
|
1344
|
-
throw new Error([
|
|
1345
|
-
`Invalid color ${JSON.stringify(opt.headerColor)} was specified.`,
|
|
1346
|
-
"Available color names:",
|
|
1347
|
-
...AVAILABLE_COLORS.map((color) => `* ${JSON.stringify(color)}`)
|
|
1348
|
-
].join("\n"));
|
|
1349
|
-
}
|
|
1350
|
-
Object.keys(this.opt).forEach((key) => {
|
|
1351
|
-
if (key in opt) {
|
|
1352
|
-
this.opt[key] = opt[key];
|
|
1353
|
-
}
|
|
1354
|
-
});
|
|
1355
|
-
this.lines = [];
|
|
1356
|
-
this.columns = [];
|
|
1357
|
-
this.columnWidth = this.opt.columnWidth;
|
|
1358
|
-
if (this.opt.header) {
|
|
1359
|
-
this.setHeaderRow(this.opt.header);
|
|
1360
|
-
}
|
|
1361
|
-
}
|
|
1362
|
-
module2.exports = ListItBuffer;
|
|
1363
|
-
ListItBuffer.prototype.nl = function() {
|
|
1364
|
-
const lastRowIndex = this.lines.length - 1;
|
|
1365
|
-
if (lastRowIndex >= 0 && !this.lines[lastRowIndex].isFixed()) {
|
|
1366
|
-
this.lines[lastRowIndex].fix();
|
|
1367
|
-
}
|
|
1368
|
-
this.pushNewRow();
|
|
1369
|
-
return this;
|
|
1370
|
-
};
|
|
1371
|
-
ListItBuffer.prototype.d = function(data) {
|
|
1372
|
-
if (arguments.length > 1) {
|
|
1373
|
-
const array = Array.apply(null, arguments);
|
|
1374
|
-
if (ListItBuffer.isMultiDimensionalArray(array)) {
|
|
1375
|
-
array.forEach((row) => this.addRow(row));
|
|
1376
|
-
} else {
|
|
1377
|
-
array.forEach((data2) => this.d(data2));
|
|
1378
|
-
}
|
|
1379
|
-
return this;
|
|
1380
|
-
}
|
|
1381
|
-
if (Array.isArray(data)) {
|
|
1382
|
-
if (ListItBuffer.isMultiDimensionalArray(data)) {
|
|
1383
|
-
data.forEach((row) => this.addRow(row));
|
|
1384
|
-
} else if (ListItBuffer.isObjectArray(data)) {
|
|
1385
|
-
data = objectArrayToTable(data);
|
|
1386
|
-
if (!this.header && (this.opt.headerBold || this.opt.headerColor || this.opt.headerUnderline)) {
|
|
1387
|
-
this.setHeaderRow(data.shift());
|
|
1388
|
-
}
|
|
1389
|
-
data.forEach((row) => this.addRow(row));
|
|
1390
|
-
} else {
|
|
1391
|
-
this.addRow(data);
|
|
1392
|
-
}
|
|
1393
|
-
return this;
|
|
1394
|
-
}
|
|
1395
|
-
const rowidx = this.lines.length - 1;
|
|
1396
|
-
if (rowidx < 0 || this.lines[rowidx].isFixed()) {
|
|
1397
|
-
this.pushNewRow();
|
|
1398
|
-
}
|
|
1399
|
-
const cell = new DataCell();
|
|
1400
|
-
cell.setData(data);
|
|
1401
|
-
const iRow = this.lines.length - 1;
|
|
1402
|
-
let iCol = this.lines[iRow].getCellLength();
|
|
1403
|
-
if (iCol >= this.columns.length) {
|
|
1404
|
-
this.addColumn();
|
|
1405
|
-
}
|
|
1406
|
-
this.columns[iCol].setCellAt(iRow, cell);
|
|
1407
|
-
this.lines[iRow].pushCell(cell);
|
|
1408
|
-
return this;
|
|
1409
|
-
};
|
|
1410
|
-
ListItBuffer.isMultiDimensionalArray = function(arr) {
|
|
1411
|
-
if (!Array.isArray(arr)) {
|
|
1412
|
-
throw Error("The parameter arr must be array");
|
|
1413
|
-
}
|
|
1414
|
-
for (let element of arr) {
|
|
1415
|
-
if (!Array.isArray(element)) {
|
|
1416
|
-
return false;
|
|
1417
|
-
}
|
|
1418
|
-
}
|
|
1419
|
-
return true;
|
|
1420
|
-
};
|
|
1421
|
-
ListItBuffer.isObjectArray = function(arr) {
|
|
1422
|
-
if (!Array.isArray(arr)) {
|
|
1423
|
-
throw Error("The parameter arr must be array");
|
|
1424
|
-
}
|
|
1425
|
-
const ctor = arr[0].constructor;
|
|
1426
|
-
for (let element of arr) {
|
|
1427
|
-
if (typeof element != "object") {
|
|
1428
|
-
return false;
|
|
1429
|
-
} else {
|
|
1430
|
-
if (element.constructor.name != ctor.name) {
|
|
1431
|
-
return false;
|
|
1432
|
-
}
|
|
1433
|
-
}
|
|
1434
|
-
}
|
|
1435
|
-
return true;
|
|
1436
|
-
};
|
|
1437
|
-
ListItBuffer.prototype.addRow = function(row) {
|
|
1438
|
-
row.forEach((col) => {
|
|
1439
|
-
switch (typeof col) {
|
|
1440
|
-
case "string":
|
|
1441
|
-
case "number":
|
|
1442
|
-
this.d(col);
|
|
1443
|
-
break;
|
|
1444
|
-
default:
|
|
1445
|
-
this.d(col != null ? col.toString() : "(null)");
|
|
1446
|
-
break;
|
|
1447
|
-
}
|
|
1448
|
-
});
|
|
1449
|
-
this.nl();
|
|
1450
|
-
};
|
|
1451
|
-
ListItBuffer.prototype.pushNewRow = function() {
|
|
1452
|
-
this.lines.push(new Row());
|
|
1453
|
-
};
|
|
1454
|
-
ListItBuffer.prototype.toString = function() {
|
|
1455
|
-
const rows = [];
|
|
1456
|
-
this.columns.forEach((column, iCol) => {
|
|
1457
|
-
if (this.header != null) {
|
|
1458
|
-
column.setHeader(this.header[iCol] || "");
|
|
1459
|
-
}
|
|
1460
|
-
column.setTextWidth(this.getColumnWidth(iCol));
|
|
1461
|
-
column.updateWidth();
|
|
1462
|
-
});
|
|
1463
|
-
if (this.header != null) {
|
|
1464
|
-
const headerLine = this.applyHeaderStyleOption(
|
|
1465
|
-
this.columns.map((column) => column.formatColumnHeader()).join(" ")
|
|
1466
|
-
);
|
|
1467
|
-
rows.push(headerLine);
|
|
1468
|
-
const headerUnderline = this.generateHeaderUnderline();
|
|
1469
|
-
if (headerUnderline) {
|
|
1470
|
-
rows.push(headerUnderline);
|
|
1471
|
-
}
|
|
1472
|
-
}
|
|
1473
|
-
this.lines.forEach((line) => {
|
|
1474
|
-
if (line.isFixed() || !line.isEmpty()) {
|
|
1475
|
-
if (line.isEmpty()) {
|
|
1476
|
-
rows.push("\n");
|
|
1477
|
-
} else {
|
|
1478
|
-
rows.push(this.columns.map((column, iCol) => {
|
|
1479
|
-
const cell = line.getCell(iCol);
|
|
1480
|
-
const data = cell.getData();
|
|
1481
|
-
return column.formatCell(data);
|
|
1482
|
-
}).join(" "));
|
|
1483
|
-
}
|
|
1484
|
-
}
|
|
1485
|
-
});
|
|
1486
|
-
return rows.join("\n");
|
|
1487
|
-
};
|
|
1488
|
-
var COLORS = {};
|
|
1489
|
-
var BGCOLORS = {};
|
|
1490
|
-
Object.keys(ansi.style).forEach((key) => {
|
|
1491
|
-
const value = ansi.style[key];
|
|
1492
|
-
if (/^bg-/.test(key)) {
|
|
1493
|
-
BGCOLORS[key.substr(3)] = value;
|
|
1494
|
-
} else {
|
|
1495
|
-
COLORS[key] = value;
|
|
1496
|
-
debug(`COLOR-KEY: ${key}`);
|
|
1497
|
-
}
|
|
1498
|
-
});
|
|
1499
|
-
Object.keys(COLORS).forEach((key) => {
|
|
1500
|
-
if (!(key in BGCOLORS)) {
|
|
1501
|
-
delete COLORS[key];
|
|
1502
|
-
debug(`remove COLOR-KEY: ${key}`);
|
|
1503
|
-
}
|
|
1504
|
-
});
|
|
1505
|
-
var AVAILABLE_COLORS = Object.keys(COLORS);
|
|
1506
|
-
debug(`AVAILABLE_COLORS:${JSON.stringify(AVAILABLE_COLORS)}`);
|
|
1507
|
-
ListItBuffer.prototype.applyHeaderStyleOption = function(line) {
|
|
1508
|
-
if (!this.opt.headerBold && !this.opt.headerColor) {
|
|
1509
|
-
return line;
|
|
1510
|
-
}
|
|
1511
|
-
const textBuffer = [];
|
|
1512
|
-
if (this.opt.headerBold) {
|
|
1513
|
-
textBuffer.push(ansi.style.bold);
|
|
1514
|
-
}
|
|
1515
|
-
if (this.opt.headerColor) {
|
|
1516
|
-
textBuffer.push(COLORS[this.opt.headerColor]);
|
|
1517
|
-
}
|
|
1518
|
-
textBuffer.push(line);
|
|
1519
|
-
textBuffer.push(ansi.style.reset);
|
|
1520
|
-
return textBuffer.join("");
|
|
1521
|
-
};
|
|
1522
|
-
ListItBuffer.prototype.generateHeaderUnderline = function() {
|
|
1523
|
-
if (!this.opt.headerUnderline) {
|
|
1524
|
-
return null;
|
|
1525
|
-
}
|
|
1526
|
-
if (this.header == null) {
|
|
1527
|
-
return null;
|
|
1528
|
-
}
|
|
1529
|
-
return this.columns.map(
|
|
1530
|
-
(column) => "-".repeat(column.getWidth())
|
|
1531
|
-
).join(" ");
|
|
1532
|
-
};
|
|
1533
|
-
function objectArrayToTable(objects) {
|
|
1534
|
-
const keys = Object.keys(objects[0]);
|
|
1535
|
-
const body = objects.map((item) => keys.map((key) => {
|
|
1536
|
-
if (item[key] != null && typeof item[key] == "object" && item[key].constructor.name == "Date") {
|
|
1537
|
-
return item[key].toISOString();
|
|
1538
|
-
}
|
|
1539
|
-
return item[key];
|
|
1540
|
-
}));
|
|
1541
|
-
return [keys, ...body];
|
|
1542
|
-
}
|
|
1543
|
-
ListItBuffer.prototype.setColumnWidth = function(indexOfColumns, width) {
|
|
1544
|
-
this.columnWidth = this.columnWidth || [];
|
|
1545
|
-
if (typeof indexOfColumns !== "number") {
|
|
1546
|
-
throw new Error("indexOfColumns must be a number");
|
|
1547
|
-
}
|
|
1548
|
-
if (!width) {
|
|
1549
|
-
delete this.columnWidth[indexOfColumns];
|
|
1550
|
-
} else {
|
|
1551
|
-
if (typeof width !== "number") {
|
|
1552
|
-
throw new Error("width must be a number");
|
|
1553
|
-
}
|
|
1554
|
-
this.columnWidth[indexOfColumns] = width;
|
|
1555
|
-
}
|
|
1556
|
-
return this;
|
|
1557
|
-
};
|
|
1558
|
-
ListItBuffer.prototype.setColumnWidthAll = function(widthForAll) {
|
|
1559
|
-
if (widthForAll != null && !Array.isArray(widthForAll) && typeof widthForAll !== "number") {
|
|
1560
|
-
throw new Error(
|
|
1561
|
-
"widthForAll must be one of a null, an Array or a number"
|
|
1562
|
-
);
|
|
1563
|
-
}
|
|
1564
|
-
if (Array.isArray(widthForAll)) {
|
|
1565
|
-
for (let i = 0; i < widthForAll.length; i++) {
|
|
1566
|
-
const width = widthForAll[i];
|
|
1567
|
-
if (width != void 0 && typeof width !== "number") {
|
|
1568
|
-
throw new Error(
|
|
1569
|
-
`widthForAll[${i}] must be an undefined or a number`
|
|
1570
|
-
);
|
|
1571
|
-
}
|
|
1572
|
-
}
|
|
1573
|
-
}
|
|
1574
|
-
this.columnWidth = widthForAll;
|
|
1575
|
-
return this;
|
|
1576
|
-
};
|
|
1577
|
-
ListItBuffer.prototype.getColumnWidth = function(indexOfColumns) {
|
|
1578
|
-
if (Array.isArray(this.columnWidth)) {
|
|
1579
|
-
return this.columnWidth[indexOfColumns];
|
|
1580
|
-
}
|
|
1581
|
-
return this.columnWidth;
|
|
1582
|
-
};
|
|
1583
|
-
ListItBuffer.prototype.setHeaderRow = function(header) {
|
|
1584
|
-
if (header && !Array.isArray(header)) {
|
|
1585
|
-
throw new Error([
|
|
1586
|
-
"The header must be an array,",
|
|
1587
|
-
`but ${typeof header} was specified.`,
|
|
1588
|
-
`header: ${JSON.stringify(header)}`
|
|
1589
|
-
].join(" "));
|
|
1590
|
-
}
|
|
1591
|
-
this.header = header;
|
|
1592
|
-
if (this.header == null) {
|
|
1593
|
-
this.columns.forEach((column) => column.setHeader(null));
|
|
1594
|
-
} else {
|
|
1595
|
-
this.header.forEach((headerText, iCol) => {
|
|
1596
|
-
if (iCol >= this.columns.length) {
|
|
1597
|
-
this.addColumn(headerText);
|
|
1598
|
-
}
|
|
1599
|
-
});
|
|
1600
|
-
}
|
|
1601
|
-
return this;
|
|
1602
|
-
};
|
|
1603
|
-
ListItBuffer.prototype.addColumn = function(headerText) {
|
|
1604
|
-
const column = new Column();
|
|
1605
|
-
if (headerText) {
|
|
1606
|
-
column.setHeader(headerText);
|
|
1607
|
-
}
|
|
1608
|
-
if (this.opt.autoAlign) {
|
|
1609
|
-
column.setAutoAlign(true);
|
|
1610
|
-
}
|
|
1611
|
-
this.columns.push(column);
|
|
1612
|
-
};
|
|
1613
|
-
}
|
|
1614
|
-
});
|
|
1615
|
-
|
|
1616
|
-
// ../../node_modules/list-it/index.js
|
|
1617
|
-
var require_list_it = __commonJS({
|
|
1618
|
-
"../../node_modules/list-it/index.js"(exports2, module2) {
|
|
1619
|
-
"use strict";
|
|
1620
|
-
var ListItBuffer = require_list_it_buffer();
|
|
1621
|
-
function ListIt2(opt) {
|
|
1622
|
-
ListItBuffer.call(this, opt);
|
|
1623
|
-
}
|
|
1624
|
-
ListIt2.prototype = new ListItBuffer();
|
|
1625
|
-
ListIt2.buffer = function(opt) {
|
|
1626
|
-
opt = opt || {};
|
|
1627
|
-
if (!("autoAlign" in opt)) {
|
|
1628
|
-
opt.autoAlign = false;
|
|
1629
|
-
}
|
|
1630
|
-
return new ListIt2(opt);
|
|
1631
|
-
};
|
|
1632
|
-
module2.exports = ListIt2;
|
|
1633
|
-
}
|
|
1634
|
-
});
|
|
1635
|
-
|
|
1636
30
|
// src/scripts/replay.ts
|
|
1637
31
|
var replay_exports = {};
|
|
1638
32
|
__export(replay_exports, {
|
|
@@ -1649,7 +43,7 @@ var import_redis6 = require("@tradejs/infra/redis");
|
|
|
1649
43
|
|
|
1650
44
|
// src/lib/runFormatting.ts
|
|
1651
45
|
var import_date_fns = require("date-fns");
|
|
1652
|
-
var ListIt =
|
|
46
|
+
var ListIt = require("list-it");
|
|
1653
47
|
var createListIt = () => new ListIt({
|
|
1654
48
|
autoAlign: true,
|
|
1655
49
|
headerUnderline: true
|
|
@@ -1713,20 +107,20 @@ var resolveTimeWindow = ({
|
|
|
1713
107
|
const explicitStart = toEpochMs(startTime);
|
|
1714
108
|
const explicitEnd = toEpochMs(endTime);
|
|
1715
109
|
const resolvedDays = toPositiveNumber(days);
|
|
1716
|
-
const alignToLastClosedInterval = (
|
|
110
|
+
const alignToLastClosedInterval = (window, preserveDuration) => {
|
|
1717
111
|
if (typeof closedIntervalMs !== "number" || !Number.isFinite(closedIntervalMs) || closedIntervalMs <= 0) {
|
|
1718
|
-
return
|
|
112
|
+
return window;
|
|
1719
113
|
}
|
|
1720
|
-
const alignedEnd = Math.floor(
|
|
1721
|
-
const delta =
|
|
1722
|
-
const alignedStart = preserveDuration ?
|
|
114
|
+
const alignedEnd = Math.floor(window.end / closedIntervalMs) * closedIntervalMs - 1;
|
|
115
|
+
const delta = window.end - alignedEnd;
|
|
116
|
+
const alignedStart = preserveDuration ? window.start - delta : window.start;
|
|
1723
117
|
if (alignedStart >= alignedEnd) {
|
|
1724
118
|
throw new Error(
|
|
1725
119
|
`Invalid closed-candle window: start (${alignedStart}) must be less than end (${alignedEnd})`
|
|
1726
120
|
);
|
|
1727
121
|
}
|
|
1728
122
|
return {
|
|
1729
|
-
...
|
|
123
|
+
...window,
|
|
1730
124
|
start: Math.trunc(alignedStart),
|
|
1731
125
|
end: Math.trunc(alignedEnd)
|
|
1732
126
|
};
|
|
@@ -1787,17 +181,7 @@ var import_chalk = __toESM(require("chalk"));
|
|
|
1787
181
|
// src/lib/runtimeRedis.ts
|
|
1788
182
|
var import_redis = require("@tradejs/infra/redis");
|
|
1789
183
|
var import_time = require("@tradejs/core/time");
|
|
1790
|
-
var
|
|
1791
|
-
var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
|
|
1792
|
-
var resolveStrategyConfigIdentityByKey = (userName, key) => {
|
|
1793
|
-
const parts = key.split(":");
|
|
1794
|
-
if (parts.length !== 5) return null;
|
|
1795
|
-
const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
|
|
1796
|
-
if (users !== "users" || keyUserName !== userName || strategiesKey !== "strategies" || !strategyName || !configId || RESERVED_STRATEGY_NAMES.has(strategyName) || RESERVED_CONFIG_IDS.has(configId) || !/^[a-zA-Z0-9_-]+$/.test(configId)) {
|
|
1797
|
-
return null;
|
|
1798
|
-
}
|
|
1799
|
-
return { strategyName, configId };
|
|
1800
|
-
};
|
|
184
|
+
var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
|
|
1801
185
|
var isRuntimeStrategyEnabled = (strategyConfig) => {
|
|
1802
186
|
const enabled = strategyConfig.ENABLE;
|
|
1803
187
|
return enabled !== false;
|
|
@@ -1809,42 +193,6 @@ var isRuntimeTradeRecord = (value) => {
|
|
|
1809
193
|
const record = value;
|
|
1810
194
|
return typeof record.orderId === "string" && typeof record.strategy === "string" && typeof record.symbol === "string" && typeof record.entryTimestamp === "number" && typeof record.entryPrice === "number" && typeof record.qty === "number" && (record.direction === "LONG" || record.direction === "SHORT");
|
|
1811
195
|
};
|
|
1812
|
-
var resolveStrategyNameByConfigKey = (userName, key) => {
|
|
1813
|
-
return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
|
|
1814
|
-
};
|
|
1815
|
-
var getRuntimeStrategyConfigKeys = async (userName) => {
|
|
1816
|
-
const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
|
|
1817
|
-
return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
|
|
1818
|
-
};
|
|
1819
|
-
var loadRuntimeStrategyConfigs = async (userName, {
|
|
1820
|
-
onInvalidConfig
|
|
1821
|
-
} = {}) => {
|
|
1822
|
-
const configKeys = await getRuntimeStrategyConfigKeys(userName);
|
|
1823
|
-
const strategyConfigs = await Promise.all(
|
|
1824
|
-
configKeys.map(async (key) => {
|
|
1825
|
-
const strategyName = resolveStrategyNameByConfigKey(userName, key);
|
|
1826
|
-
const identity = resolveStrategyConfigIdentityByKey(userName, key);
|
|
1827
|
-
if (!strategyName || !identity) {
|
|
1828
|
-
return null;
|
|
1829
|
-
}
|
|
1830
|
-
const strategyConfig = await (0, import_redis.getData)(
|
|
1831
|
-
key,
|
|
1832
|
-
null
|
|
1833
|
-
);
|
|
1834
|
-
if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
|
|
1835
|
-
onInvalidConfig?.(key);
|
|
1836
|
-
return null;
|
|
1837
|
-
}
|
|
1838
|
-
return {
|
|
1839
|
-
key,
|
|
1840
|
-
strategyName,
|
|
1841
|
-
configId: identity.configId,
|
|
1842
|
-
strategyConfig
|
|
1843
|
-
};
|
|
1844
|
-
})
|
|
1845
|
-
);
|
|
1846
|
-
return strategyConfigs.filter(Boolean);
|
|
1847
|
-
};
|
|
1848
196
|
var loadRuntimeTrades = async (userName, {
|
|
1849
197
|
startTime,
|
|
1850
198
|
endTime
|
|
@@ -1894,7 +242,7 @@ var toStrategyConfigGrid = (strategyConfig) => Object.fromEntries(
|
|
|
1894
242
|
Object.entries(strategyConfig).filter(([key]) => !BACKTEST_CLI_RUNTIME_CONFIG_KEYS.has(key)).map(([key, value]) => [key, [value]])
|
|
1895
243
|
);
|
|
1896
244
|
var loadRuntimeStrategyBacktestConfigs = async (userName) => {
|
|
1897
|
-
const configs = await loadRuntimeStrategyConfigs(userName, {
|
|
245
|
+
const configs = await (0, import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs)(userName, {
|
|
1898
246
|
onInvalidConfig: (key) => {
|
|
1899
247
|
console.log(import_chalk.default.yellow(`Skip invalid runtime strategy config: ${key}`));
|
|
1900
248
|
}
|
|
@@ -2277,7 +625,7 @@ var prepareRunEnvironment = async ({
|
|
|
2277
625
|
instrument
|
|
2278
626
|
])
|
|
2279
627
|
);
|
|
2280
|
-
const
|
|
628
|
+
const window = resolveTimeWindow({
|
|
2281
629
|
days,
|
|
2282
630
|
startTime,
|
|
2283
631
|
endTime,
|
|
@@ -2286,7 +634,7 @@ var prepareRunEnvironment = async ({
|
|
|
2286
634
|
closedIntervalMs
|
|
2287
635
|
});
|
|
2288
636
|
const preloadStart = (0, import_time2.getBacktestPreloadStart)(
|
|
2289
|
-
|
|
637
|
+
window.start,
|
|
2290
638
|
import_constants.BACKTEST_PRELOAD_DAYS
|
|
2291
639
|
);
|
|
2292
640
|
if (!cacheOnly) {
|
|
@@ -2306,7 +654,7 @@ var prepareRunEnvironment = async ({
|
|
|
2306
654
|
interval,
|
|
2307
655
|
symbols: loadedTickers,
|
|
2308
656
|
preloadStart,
|
|
2309
|
-
preloadEnd:
|
|
657
|
+
preloadEnd: window.end,
|
|
2310
658
|
universe,
|
|
2311
659
|
log: (message) => console.log(import_chalk3.default.gray(message))
|
|
2312
660
|
});
|
|
@@ -2322,7 +670,7 @@ var prepareRunEnvironment = async ({
|
|
|
2322
670
|
{
|
|
2323
671
|
connectorLabel: connectorName,
|
|
2324
672
|
preloadStart,
|
|
2325
|
-
preloadEnd:
|
|
673
|
+
preloadEnd: window.end,
|
|
2326
674
|
skipCovered: true
|
|
2327
675
|
}
|
|
2328
676
|
)
|
|
@@ -2334,7 +682,7 @@ var prepareRunEnvironment = async ({
|
|
|
2334
682
|
marketConnector,
|
|
2335
683
|
tickers: loadedTickers,
|
|
2336
684
|
instrumentsBySymbol,
|
|
2337
|
-
window
|
|
685
|
+
window,
|
|
2338
686
|
preloadStart,
|
|
2339
687
|
universe,
|
|
2340
688
|
accountId,
|
|
@@ -2346,7 +694,7 @@ var prepareRunEnvironment = async ({
|
|
|
2346
694
|
|
|
2347
695
|
// src/lib/marketContextPrepare.ts
|
|
2348
696
|
var import_chalk7 = __toESM(require("chalk"));
|
|
2349
|
-
var
|
|
697
|
+
var import_marketContext3 = require("@tradejs/infra/timescale/marketContext");
|
|
2350
698
|
var import_registry = require("@tradejs/node/registry");
|
|
2351
699
|
|
|
2352
700
|
// src/lib/binanceMarketContextBackfill.ts
|
|
@@ -2355,7 +703,8 @@ var import_chalk4 = __toESM(require("chalk"));
|
|
|
2355
703
|
var import_connectors4 = require("@tradejs/connectors");
|
|
2356
704
|
var import_connectors5 = require("@tradejs/node/connectors");
|
|
2357
705
|
var import_strategies = require("@tradejs/node/strategies");
|
|
2358
|
-
var
|
|
706
|
+
var import_marketContext = require("@tradejs/infra/timescale/marketContext");
|
|
707
|
+
var import_client = require("@tradejs/infra/timescale/client");
|
|
2359
708
|
|
|
2360
709
|
// src/lib/binanceMarketData.ts
|
|
2361
710
|
var MARKET_FEATURE_INTERVAL_MS = {
|
|
@@ -2863,7 +1212,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
2863
1212
|
if (endMs <= Math.min(breadthStartMs, tradeFlowStartMs)) {
|
|
2864
1213
|
return skippedBackfillResult();
|
|
2865
1214
|
}
|
|
2866
|
-
await (0,
|
|
1215
|
+
await (0, import_client.waitForDbReady)();
|
|
2867
1216
|
const connector = await getBinanceConnector({
|
|
2868
1217
|
projectRoot: params.projectRoot,
|
|
2869
1218
|
userName: params.userName
|
|
@@ -2909,7 +1258,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
2909
1258
|
)
|
|
2910
1259
|
);
|
|
2911
1260
|
if (includeTradeFlow && referenceSymbols.length) {
|
|
2912
|
-
const coverage = await (0,
|
|
1261
|
+
const coverage = await (0, import_marketContext.getMarketTradeFlowCoverage)({
|
|
2913
1262
|
symbols: referenceSymbols,
|
|
2914
1263
|
interval,
|
|
2915
1264
|
startMs: tradeFlowStartMs,
|
|
@@ -2993,7 +1342,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
2993
1342
|
const ts = row.ts.getTime();
|
|
2994
1343
|
return ts >= chunk.startMs && ts <= chunk.endMs;
|
|
2995
1344
|
});
|
|
2996
|
-
await (0,
|
|
1345
|
+
await (0, import_marketContext.upsertMarketTradeFlowRows)(boundedRows);
|
|
2997
1346
|
tradeFlowRows += boundedRows.length;
|
|
2998
1347
|
chunkBar?.tick(1, {
|
|
2999
1348
|
rows: tradeFlowRows,
|
|
@@ -3021,7 +1370,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
3021
1370
|
});
|
|
3022
1371
|
const plans = await Promise.all(
|
|
3023
1372
|
breadthUniverses.map(async (definition) => {
|
|
3024
|
-
const coverage = await (0,
|
|
1373
|
+
const coverage = await (0, import_marketContext.getMarketBreadthCoverage)({
|
|
3025
1374
|
universe: definition.universe,
|
|
3026
1375
|
interval,
|
|
3027
1376
|
startMs: breadthStartMs,
|
|
@@ -3122,7 +1471,7 @@ var backfillBinanceMarketContext = async (params, enabled) => {
|
|
|
3122
1471
|
const ts = row.ts.getTime();
|
|
3123
1472
|
return ts >= chunk.startMs && ts <= chunk.endMs;
|
|
3124
1473
|
});
|
|
3125
|
-
await (0,
|
|
1474
|
+
await (0, import_marketContext.upsertMarketBreadthRows)(rows);
|
|
3126
1475
|
breadthRows += rows.length;
|
|
3127
1476
|
}
|
|
3128
1477
|
}
|
|
@@ -3150,7 +1499,8 @@ var import_progress2 = __toESM(require("progress"));
|
|
|
3150
1499
|
var import_async = require("@tradejs/core/async");
|
|
3151
1500
|
var import_constants2 = require("@tradejs/core/constants");
|
|
3152
1501
|
var import_indicators = require("@tradejs/core/indicators");
|
|
3153
|
-
var
|
|
1502
|
+
var import_derivatives = require("@tradejs/infra/timescale/derivatives");
|
|
1503
|
+
var import_client2 = require("@tradejs/infra/timescale/client");
|
|
3154
1504
|
var import_userSettings = require("@tradejs/infra/userSettings");
|
|
3155
1505
|
var HOUR_MS = 60 * 60 * 1e3;
|
|
3156
1506
|
var DAY_MS2 = 24 * HOUR_MS;
|
|
@@ -3663,13 +2013,13 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3663
2013
|
if (!intervalWindows.length) {
|
|
3664
2014
|
return skippedBackfillResult2();
|
|
3665
2015
|
}
|
|
3666
|
-
await (0,
|
|
2016
|
+
await (0, import_client2.waitForDbReady)();
|
|
3667
2017
|
const edgesByInterval = /* @__PURE__ */ new Map();
|
|
3668
2018
|
await Promise.all(
|
|
3669
2019
|
intervalWindows.map(async ({ interval }) => {
|
|
3670
2020
|
edgesByInterval.set(
|
|
3671
2021
|
interval,
|
|
3672
|
-
await (0,
|
|
2022
|
+
await (0, import_derivatives.getDerivativesDataEdgesForSymbols)(symbols, interval)
|
|
3673
2023
|
);
|
|
3674
2024
|
})
|
|
3675
2025
|
);
|
|
@@ -3678,32 +2028,32 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3678
2028
|
const liquidationCoverageRangesByInterval = /* @__PURE__ */ new Map();
|
|
3679
2029
|
const coverageNowMs = Date.now();
|
|
3680
2030
|
await Promise.all(
|
|
3681
|
-
intervalWindows.map(async (
|
|
2031
|
+
intervalWindows.map(async (window) => {
|
|
3682
2032
|
const confirmedLiquidationWindow = (0, import_indicators.resolveCoinalyzeConfirmedIntradayCoverage)({
|
|
3683
|
-
interval:
|
|
3684
|
-
fromMs:
|
|
3685
|
-
toMs:
|
|
2033
|
+
interval: window.interval,
|
|
2034
|
+
fromMs: window.fromMs,
|
|
2035
|
+
toMs: window.toMs,
|
|
3686
2036
|
nowMs: coverageNowMs
|
|
3687
2037
|
});
|
|
3688
2038
|
const [coverageRows, liquidationCoverageRows] = await Promise.all([
|
|
3689
|
-
(0,
|
|
2039
|
+
(0, import_derivatives.getDerivativesBackfillCoverage)({
|
|
3690
2040
|
source: "coinalyze",
|
|
3691
2041
|
symbols,
|
|
3692
|
-
interval:
|
|
3693
|
-
fromMs:
|
|
3694
|
-
toMs:
|
|
2042
|
+
interval: window.interval,
|
|
2043
|
+
fromMs: window.fromMs,
|
|
2044
|
+
toMs: window.toMs
|
|
3695
2045
|
}),
|
|
3696
|
-
confirmedLiquidationWindow ? (0,
|
|
2046
|
+
confirmedLiquidationWindow ? (0, import_derivatives.getDerivativesMetricCoverage)({
|
|
3697
2047
|
source: "coinalyze",
|
|
3698
2048
|
metric: "liquidation",
|
|
3699
2049
|
symbols,
|
|
3700
|
-
interval:
|
|
2050
|
+
interval: window.interval,
|
|
3701
2051
|
fromMs: confirmedLiquidationWindow.fromMs,
|
|
3702
2052
|
toMs: confirmedLiquidationWindow.toMs
|
|
3703
2053
|
}) : Promise.resolve([])
|
|
3704
2054
|
]);
|
|
3705
2055
|
coverageKeysByInterval.set(
|
|
3706
|
-
|
|
2056
|
+
window.interval,
|
|
3707
2057
|
new Set(
|
|
3708
2058
|
coverageRows.map(
|
|
3709
2059
|
(row) => coverageKey({
|
|
@@ -3722,7 +2072,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3722
2072
|
ranges.push({ fromMs: row.fromMs, toMs: row.toMs });
|
|
3723
2073
|
rangesBySymbol.set(symbol, ranges);
|
|
3724
2074
|
}
|
|
3725
|
-
coverageRangesByInterval.set(
|
|
2075
|
+
coverageRangesByInterval.set(window.interval, rangesBySymbol);
|
|
3726
2076
|
const liquidationRangesBySymbol = /* @__PURE__ */ new Map();
|
|
3727
2077
|
for (const row of liquidationCoverageRows) {
|
|
3728
2078
|
const symbol = row.symbol.toUpperCase();
|
|
@@ -3731,33 +2081,33 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3731
2081
|
liquidationRangesBySymbol.set(symbol, ranges);
|
|
3732
2082
|
}
|
|
3733
2083
|
liquidationCoverageRangesByInterval.set(
|
|
3734
|
-
|
|
2084
|
+
window.interval,
|
|
3735
2085
|
liquidationRangesBySymbol
|
|
3736
2086
|
);
|
|
3737
2087
|
})
|
|
3738
2088
|
);
|
|
3739
2089
|
const cachedWindows = intervalWindows.reduce(
|
|
3740
|
-
(sum,
|
|
3741
|
-
fromMs:
|
|
3742
|
-
toMs:
|
|
2090
|
+
(sum, window) => sum + countBackfillWindows({
|
|
2091
|
+
fromMs: window.fromMs,
|
|
2092
|
+
toMs: window.toMs,
|
|
3743
2093
|
batchMs,
|
|
3744
|
-
intervalMs:
|
|
2094
|
+
intervalMs: window.intervalMs
|
|
3745
2095
|
}),
|
|
3746
2096
|
0
|
|
3747
2097
|
);
|
|
3748
|
-
const allBackfillWindowsCached = mode !== "signals" && intervalWindows.every((
|
|
3749
|
-
const edgesBySymbol = edgesByInterval.get(
|
|
3750
|
-
const coverageKeys = coverageKeysByInterval.get(
|
|
2098
|
+
const allBackfillWindowsCached = mode !== "signals" && intervalWindows.every((window) => {
|
|
2099
|
+
const edgesBySymbol = edgesByInterval.get(window.interval);
|
|
2100
|
+
const coverageKeys = coverageKeysByInterval.get(window.interval);
|
|
3751
2101
|
const backfillWindows = buildBackfillWindows({
|
|
3752
|
-
fromMs:
|
|
3753
|
-
toMs:
|
|
2102
|
+
fromMs: window.fromMs,
|
|
2103
|
+
toMs: window.toMs,
|
|
3754
2104
|
batchMs,
|
|
3755
|
-
intervalMs:
|
|
2105
|
+
intervalMs: window.intervalMs
|
|
3756
2106
|
});
|
|
3757
2107
|
return symbols.every(
|
|
3758
2108
|
(symbol) => backfillWindows.every((backfillWindow) => {
|
|
3759
2109
|
const normalizedSymbol = symbol.toUpperCase();
|
|
3760
|
-
const coverageRanges = coverageRangesByInterval.get(
|
|
2110
|
+
const coverageRanges = coverageRangesByInterval.get(window.interval)?.get(normalizedSymbol) ?? [];
|
|
3761
2111
|
const dataCovered = hasDerivativesWindowCoverage({
|
|
3762
2112
|
edges: edgesBySymbol?.get(normalizedSymbol),
|
|
3763
2113
|
fromMs: backfillWindow.fromMs,
|
|
@@ -3766,26 +2116,26 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3766
2116
|
ranges: coverageRanges,
|
|
3767
2117
|
fromMs: backfillWindow.fromMs,
|
|
3768
2118
|
toMs: backfillWindow.toMs,
|
|
3769
|
-
intervalMs:
|
|
2119
|
+
intervalMs: window.intervalMs
|
|
3770
2120
|
}) == null || coverageKeys?.has(
|
|
3771
2121
|
coverageKey({
|
|
3772
2122
|
symbol: normalizedSymbol,
|
|
3773
|
-
interval:
|
|
2123
|
+
interval: window.interval,
|
|
3774
2124
|
fromMs: backfillWindow.fromMs,
|
|
3775
2125
|
toMs: backfillWindow.toMs
|
|
3776
2126
|
})
|
|
3777
2127
|
);
|
|
3778
2128
|
const confirmedLiquidationWindow = (0, import_indicators.resolveCoinalyzeConfirmedIntradayCoverage)({
|
|
3779
|
-
interval:
|
|
2129
|
+
interval: window.interval,
|
|
3780
2130
|
fromMs: backfillWindow.fromMs,
|
|
3781
2131
|
toMs: backfillWindow.toMs,
|
|
3782
2132
|
nowMs: coverageNowMs
|
|
3783
2133
|
});
|
|
3784
2134
|
const liquidationCovered = confirmedLiquidationWindow == null || resolveDerivativesContextMissingCoverageFetchFromMs({
|
|
3785
|
-
ranges: liquidationCoverageRangesByInterval.get(
|
|
2135
|
+
ranges: liquidationCoverageRangesByInterval.get(window.interval)?.get(normalizedSymbol) ?? [],
|
|
3786
2136
|
fromMs: confirmedLiquidationWindow.fromMs,
|
|
3787
2137
|
toMs: confirmedLiquidationWindow.toMs,
|
|
3788
|
-
intervalMs:
|
|
2138
|
+
intervalMs: window.intervalMs
|
|
3789
2139
|
}) == null;
|
|
3790
2140
|
return dataCovered && liquidationCovered;
|
|
3791
2141
|
})
|
|
@@ -3835,11 +2185,11 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3835
2185
|
);
|
|
3836
2186
|
const symbolBatches = chunkArray(matches, symbolBatchSize);
|
|
3837
2187
|
const windowsPerPair = intervalWindows.reduce(
|
|
3838
|
-
(sum,
|
|
3839
|
-
fromMs:
|
|
3840
|
-
toMs:
|
|
2188
|
+
(sum, window) => sum + countBackfillWindows({
|
|
2189
|
+
fromMs: window.fromMs,
|
|
2190
|
+
toMs: window.toMs,
|
|
3841
2191
|
batchMs,
|
|
3842
|
-
intervalMs:
|
|
2192
|
+
intervalMs: window.intervalMs
|
|
3843
2193
|
}),
|
|
3844
2194
|
0
|
|
3845
2195
|
);
|
|
@@ -3862,9 +2212,9 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3862
2212
|
`derivatives context backfill: symbols=${matches.length}, requestedSymbols=${requestedSymbols.length}, unmatched=${unmatched.length}, intervals=${intervals.join(",")}, window=${new Date(fromMs).toISOString()}..${new Date(safeEndMs).toISOString()}, testStart=${new Date(safeStartMs).toISOString()}`
|
|
3863
2213
|
)
|
|
3864
2214
|
);
|
|
3865
|
-
for (const
|
|
3866
|
-
const { interval, intervalMs } =
|
|
3867
|
-
const edgesBySymbol = edgesByInterval.get(interval) ?? await (0,
|
|
2215
|
+
for (const window of intervalWindows) {
|
|
2216
|
+
const { interval, intervalMs } = window;
|
|
2217
|
+
const edgesBySymbol = edgesByInterval.get(interval) ?? await (0, import_derivatives.getDerivativesDataEdgesForSymbols)(
|
|
3868
2218
|
matches.map((item) => item.symbol),
|
|
3869
2219
|
interval
|
|
3870
2220
|
);
|
|
@@ -3879,9 +2229,9 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3879
2229
|
);
|
|
3880
2230
|
for (let batchIdx = 0; batchIdx < symbolBatches.length; batchIdx += 1) {
|
|
3881
2231
|
const batch = symbolBatches[batchIdx];
|
|
3882
|
-
let cursor =
|
|
3883
|
-
while (cursor <
|
|
3884
|
-
const toMs = Math.min(
|
|
2232
|
+
let cursor = window.fromMs;
|
|
2233
|
+
while (cursor < window.toMs) {
|
|
2234
|
+
const toMs = Math.min(window.toMs, cursor + batchMs);
|
|
3885
2235
|
const missingRanges = batch.map((item) => {
|
|
3886
2236
|
const key = coverageKey({
|
|
3887
2237
|
symbol: item.symbol,
|
|
@@ -3987,7 +2337,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
3987
2337
|
);
|
|
3988
2338
|
}
|
|
3989
2339
|
if (rows.length) {
|
|
3990
|
-
await (0,
|
|
2340
|
+
await (0, import_derivatives.upsertDerivatives)(rows);
|
|
3991
2341
|
totalRows += rows.length;
|
|
3992
2342
|
}
|
|
3993
2343
|
const confirmedLiquidationWindow = (0, import_indicators.resolveCoinalyzeConfirmedIntradayCoverage)({
|
|
@@ -4015,7 +2365,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
4015
2365
|
eventRowsCount
|
|
4016
2366
|
};
|
|
4017
2367
|
});
|
|
4018
|
-
await (0,
|
|
2368
|
+
await (0, import_derivatives.applyDerivativesMetricCoverage)(metricCoverageRows);
|
|
4019
2369
|
for (const coverageRow of metricCoverageRows) {
|
|
4020
2370
|
const symbol = coverageRow.symbol.toUpperCase();
|
|
4021
2371
|
const ranges = liquidationCoverageRangesBySymbol.get(symbol) ?? [];
|
|
@@ -4047,7 +2397,7 @@ var backfillDerivativesContext = async (params, enabled, mode) => {
|
|
|
4047
2397
|
rowsCount
|
|
4048
2398
|
};
|
|
4049
2399
|
});
|
|
4050
|
-
await (0,
|
|
2400
|
+
await (0, import_derivatives.upsertDerivativesBackfillCoverage)(coverageRows);
|
|
4051
2401
|
for (const coverageRow of coverageRows) {
|
|
4052
2402
|
const symbol = coverageRow.symbol.toUpperCase();
|
|
4053
2403
|
edgesBySymbol.set(
|
|
@@ -4124,7 +2474,8 @@ var backfillDerivativesContextForSignals = async (params) => backfillDerivatives
|
|
|
4124
2474
|
// src/lib/coinMarketCapContextBackfill.ts
|
|
4125
2475
|
var import_chalk6 = __toESM(require("chalk"));
|
|
4126
2476
|
var import_async2 = require("@tradejs/core/async");
|
|
4127
|
-
var
|
|
2477
|
+
var import_marketContext2 = require("@tradejs/infra/timescale/marketContext");
|
|
2478
|
+
var import_client3 = require("@tradejs/infra/timescale/client");
|
|
4128
2479
|
var import_userSettings2 = require("@tradejs/infra/userSettings");
|
|
4129
2480
|
var DAY_MS3 = 864e5;
|
|
4130
2481
|
var DEFAULT_CONTEXT_MAX_AGE_MS = 48 * 60 * 6e4;
|
|
@@ -4349,27 +2700,27 @@ var createCoinMarketCapFetchStats = () => ({
|
|
|
4349
2700
|
totalCredits: 0,
|
|
4350
2701
|
byPath: /* @__PURE__ */ new Map()
|
|
4351
2702
|
});
|
|
4352
|
-
var getCoinMarketCapPathLabel = (
|
|
4353
|
-
if (
|
|
4354
|
-
if (
|
|
4355
|
-
if (
|
|
4356
|
-
if (
|
|
4357
|
-
if (
|
|
4358
|
-
if (
|
|
4359
|
-
return
|
|
4360
|
-
};
|
|
4361
|
-
var recordCoinMarketCapFetchStats = (stats,
|
|
2703
|
+
var getCoinMarketCapPathLabel = (path5) => {
|
|
2704
|
+
if (path5.includes("global-metrics")) return "global";
|
|
2705
|
+
if (path5.includes("cryptocurrency/quotes")) return "reference";
|
|
2706
|
+
if (path5.includes("exchange/quotes")) return "exchangeLiquidity";
|
|
2707
|
+
if (path5.includes("fear-and-greed")) return "fearGreed";
|
|
2708
|
+
if (path5.includes("cmc100")) return "cmc100";
|
|
2709
|
+
if (path5.includes("cmc20")) return "cmc20";
|
|
2710
|
+
return path5;
|
|
2711
|
+
};
|
|
2712
|
+
var recordCoinMarketCapFetchStats = (stats, path5, creditCount) => {
|
|
4362
2713
|
if (!stats) return;
|
|
4363
|
-
const existing = stats.byPath.get(
|
|
2714
|
+
const existing = stats.byPath.get(path5) ?? { requests: 0, credits: 0 };
|
|
4364
2715
|
existing.requests += 1;
|
|
4365
2716
|
existing.credits += creditCount ?? 0;
|
|
4366
2717
|
stats.requests += 1;
|
|
4367
2718
|
stats.totalCredits += creditCount ?? 0;
|
|
4368
|
-
stats.byPath.set(
|
|
2719
|
+
stats.byPath.set(path5, existing);
|
|
4369
2720
|
};
|
|
4370
2721
|
var formatCoinMarketCapFetchStats = (stats) => {
|
|
4371
2722
|
const byPath = [...stats.byPath.entries()].map(
|
|
4372
|
-
([
|
|
2723
|
+
([path5, item]) => `${getCoinMarketCapPathLabel(path5)}=${item.requests}req/${item.credits}cr`
|
|
4373
2724
|
).join(" ");
|
|
4374
2725
|
return `apiRequests=${stats.requests} apiCredits=${stats.totalCredits}${byPath ? ` ${byPath}` : ""}`;
|
|
4375
2726
|
};
|
|
@@ -4388,7 +2739,7 @@ var logBackfillSourceDone = (params) => {
|
|
|
4388
2739
|
)
|
|
4389
2740
|
);
|
|
4390
2741
|
};
|
|
4391
|
-
var markBackfillCoverage = (rows) => (0,
|
|
2742
|
+
var markBackfillCoverage = (rows) => (0, import_marketContext2.upsertMarketContextBackfillCoverage)(rows);
|
|
4392
2743
|
var coinMarketCapFetch = async (params) => {
|
|
4393
2744
|
const url = new URL(`${getBaseUrl()}${params.path}`);
|
|
4394
2745
|
for (const [key, value] of Object.entries(params.searchParams)) {
|
|
@@ -4717,7 +3068,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
4717
3068
|
if (toMs <= fromMs) return skippedResult();
|
|
4718
3069
|
const exchangeLiquidityEnabled = isExchangeLiquidityBackfillEnabled();
|
|
4719
3070
|
const fearGreedEnabled = isFearGreedBackfillEnabled();
|
|
4720
|
-
await (0,
|
|
3071
|
+
await (0, import_client3.waitForDbReady)();
|
|
4721
3072
|
const [
|
|
4722
3073
|
globalDailyCoverage,
|
|
4723
3074
|
referenceDailyCoverage,
|
|
@@ -4730,66 +3081,66 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
4730
3081
|
fearGreedBackfillCoverage,
|
|
4731
3082
|
indexBackfillCoverage
|
|
4732
3083
|
] = await Promise.all([
|
|
4733
|
-
(0,
|
|
3084
|
+
(0, import_marketContext2.getMarketGlobalContextCoverage)({
|
|
4734
3085
|
source: SOURCE_GLOBAL_DAILY,
|
|
4735
3086
|
startMs: fromMs,
|
|
4736
3087
|
endMs: toMs
|
|
4737
3088
|
}),
|
|
4738
|
-
(0,
|
|
3089
|
+
(0, import_marketContext2.getMarketReferenceAssetContextCoverage)({
|
|
4739
3090
|
source: SOURCE_REFERENCE,
|
|
4740
3091
|
symbols: REFERENCE_ASSETS.map((item) => item.symbol),
|
|
4741
3092
|
interval: "1d",
|
|
4742
3093
|
startMs: fromMs,
|
|
4743
3094
|
endMs: toMs
|
|
4744
3095
|
}),
|
|
4745
|
-
exchangeLiquidityEnabled ? (0,
|
|
3096
|
+
exchangeLiquidityEnabled ? (0, import_marketContext2.getMarketCmcExchangeLiquidityContextCoverage)({
|
|
4746
3097
|
source: SOURCE_EXCHANGE_LIQUIDITY,
|
|
4747
3098
|
interval: "1d",
|
|
4748
3099
|
startMs: fromMs,
|
|
4749
3100
|
endMs: toMs
|
|
4750
3101
|
}) : Promise.resolve(null),
|
|
4751
|
-
fearGreedEnabled ? (0,
|
|
3102
|
+
fearGreedEnabled ? (0, import_marketContext2.getMarketCmcFearGreedContextCoverage)({
|
|
4752
3103
|
source: SOURCE_FEAR_GREED,
|
|
4753
3104
|
interval: "1d",
|
|
4754
3105
|
startMs: fromMs,
|
|
4755
3106
|
endMs: toMs
|
|
4756
3107
|
}) : Promise.resolve(null),
|
|
4757
|
-
(0,
|
|
3108
|
+
(0, import_marketContext2.getMarketCmcIndexContextCoverage)({
|
|
4758
3109
|
source: SOURCE_INDEX,
|
|
4759
3110
|
indexSlugs: CMC_INDEXES.map((index) => index.slug),
|
|
4760
3111
|
interval: "1d",
|
|
4761
3112
|
startMs: fromMs,
|
|
4762
3113
|
endMs: toMs
|
|
4763
3114
|
}),
|
|
4764
|
-
(0,
|
|
3115
|
+
(0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4765
3116
|
source: SOURCE_GLOBAL_DAILY,
|
|
4766
3117
|
scopes: [COVERAGE_SCOPE_ALL],
|
|
4767
3118
|
interval: "1d",
|
|
4768
3119
|
fromMs,
|
|
4769
3120
|
toMs
|
|
4770
3121
|
}),
|
|
4771
|
-
(0,
|
|
3122
|
+
(0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4772
3123
|
source: SOURCE_REFERENCE,
|
|
4773
3124
|
scopes: REFERENCE_ASSETS.map((item) => item.symbol),
|
|
4774
3125
|
interval: "1d",
|
|
4775
3126
|
fromMs,
|
|
4776
3127
|
toMs
|
|
4777
3128
|
}),
|
|
4778
|
-
exchangeLiquidityEnabled ? (0,
|
|
3129
|
+
exchangeLiquidityEnabled ? (0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4779
3130
|
source: SOURCE_EXCHANGE_LIQUIDITY,
|
|
4780
3131
|
scopes: [COVERAGE_SCOPE_ALL],
|
|
4781
3132
|
interval: "1d",
|
|
4782
3133
|
fromMs,
|
|
4783
3134
|
toMs
|
|
4784
3135
|
}) : Promise.resolve([]),
|
|
4785
|
-
fearGreedEnabled ? (0,
|
|
3136
|
+
fearGreedEnabled ? (0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4786
3137
|
source: SOURCE_FEAR_GREED,
|
|
4787
3138
|
scopes: [COVERAGE_SCOPE_ALL],
|
|
4788
3139
|
interval: "1d",
|
|
4789
3140
|
fromMs,
|
|
4790
3141
|
toMs
|
|
4791
3142
|
}) : Promise.resolve([]),
|
|
4792
|
-
(0,
|
|
3143
|
+
(0, import_marketContext2.getMarketContextBackfillCoverage)({
|
|
4793
3144
|
source: SOURCE_INDEX,
|
|
4794
3145
|
scopes: CMC_INDEXES.map((index) => index.slug),
|
|
4795
3146
|
interval: "1d",
|
|
@@ -4980,7 +3331,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
4980
3331
|
}
|
|
4981
3332
|
});
|
|
4982
3333
|
const rows = coinMarketCapGlobalPayloadToRows(payload, SOURCE_GLOBAL_DAILY);
|
|
4983
|
-
await (0,
|
|
3334
|
+
await (0, import_marketContext2.upsertMarketGlobalContextRows)(rows);
|
|
4984
3335
|
await markBackfillCoverage([
|
|
4985
3336
|
{
|
|
4986
3337
|
source: SOURCE_GLOBAL_DAILY,
|
|
@@ -5014,7 +3365,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
5014
3365
|
}
|
|
5015
3366
|
});
|
|
5016
3367
|
const rows = coinMarketCapHistoricalQuotesPayloadToRows(payload, "1d");
|
|
5017
|
-
await (0,
|
|
3368
|
+
await (0, import_marketContext2.upsertMarketReferenceAssetContextRows)(rows);
|
|
5018
3369
|
await markBackfillCoverage(
|
|
5019
3370
|
REFERENCE_ASSETS.map((asset) => ({
|
|
5020
3371
|
source: SOURCE_REFERENCE,
|
|
@@ -5053,7 +3404,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
5053
3404
|
payload,
|
|
5054
3405
|
"1d"
|
|
5055
3406
|
);
|
|
5056
|
-
await (0,
|
|
3407
|
+
await (0, import_marketContext2.upsertMarketCmcExchangeLiquidityContextRows)(rows);
|
|
5057
3408
|
await markBackfillCoverage([
|
|
5058
3409
|
{
|
|
5059
3410
|
source: SOURCE_EXCHANGE_LIQUIDITY,
|
|
@@ -5098,7 +3449,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
5098
3449
|
const oldestPageTs = Math.min(...pageRows.map((row) => row.ts.getTime()));
|
|
5099
3450
|
if (oldestPageTs < fromMs || pageRows.length < pageSize) break;
|
|
5100
3451
|
}
|
|
5101
|
-
await (0,
|
|
3452
|
+
await (0, import_marketContext2.upsertMarketCmcFearGreedContextRows)(rows);
|
|
5102
3453
|
await markBackfillCoverage([
|
|
5103
3454
|
{
|
|
5104
3455
|
source: SOURCE_FEAR_GREED,
|
|
@@ -5132,7 +3483,7 @@ var backfillCoinMarketCapContext = async (params) => {
|
|
|
5132
3483
|
}))
|
|
5133
3484
|
);
|
|
5134
3485
|
const rows = rowsByIndex.flatMap((item) => item.result.rows);
|
|
5135
|
-
await (0,
|
|
3486
|
+
await (0, import_marketContext2.upsertMarketCmcIndexContextRows)(rows);
|
|
5136
3487
|
await markBackfillCoverage(
|
|
5137
3488
|
rowsByIndex.map(({ index, result }) => ({
|
|
5138
3489
|
source: SOURCE_INDEX,
|
|
@@ -5184,7 +3535,7 @@ var backfillCoinMarketCapContextForSignals = (params) => backfillCoinMarketCapCo
|
|
|
5184
3535
|
|
|
5185
3536
|
// src/lib/hyperliquidWhaleBackfill.ts
|
|
5186
3537
|
var import_progress3 = __toESM(require("progress"));
|
|
5187
|
-
var
|
|
3538
|
+
var import_hyperliquidWhales = require("@tradejs/infra/timescale/hyperliquidWhales");
|
|
5188
3539
|
var import_strategies2 = require("@tradejs/node/strategies");
|
|
5189
3540
|
|
|
5190
3541
|
// src/lib/hyperliquidWhaleData.ts
|
|
@@ -5439,7 +3790,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5439
3790
|
};
|
|
5440
3791
|
const fromMs = Math.floor(params.startMs / HYPERLIQUID_WHALE_BUCKET_MS) * HYPERLIQUID_WHALE_BUCKET_MS;
|
|
5441
3792
|
const toMs = minuteCeil(params.endMs);
|
|
5442
|
-
const cached = await (0,
|
|
3793
|
+
const cached = await (0, import_hyperliquidWhales.hasHyperliquidWhaleBackfillCoverage)({
|
|
5443
3794
|
fromMs,
|
|
5444
3795
|
toMs,
|
|
5445
3796
|
...identity
|
|
@@ -5488,7 +3839,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5488
3839
|
items: whales.addresses,
|
|
5489
3840
|
concurrency,
|
|
5490
3841
|
worker: async (address) => {
|
|
5491
|
-
const previous = await (0,
|
|
3842
|
+
const previous = await (0, import_hyperliquidWhales.getHyperliquidWhaleWalletCoverage)({
|
|
5492
3843
|
address,
|
|
5493
3844
|
fromMs,
|
|
5494
3845
|
toMs,
|
|
@@ -5515,8 +3866,8 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5515
3866
|
identity
|
|
5516
3867
|
})
|
|
5517
3868
|
).filter((row) => row != null);
|
|
5518
|
-
await (0,
|
|
5519
|
-
await (0,
|
|
3869
|
+
await (0, import_hyperliquidWhales.upsertHyperliquidWhaleTradeEvents)(addressEvents);
|
|
3870
|
+
await (0, import_hyperliquidWhales.upsertHyperliquidWhaleWalletCoverage)({
|
|
5520
3871
|
address,
|
|
5521
3872
|
fromMs,
|
|
5522
3873
|
toMs,
|
|
@@ -5534,7 +3885,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5534
3885
|
const normalizedError = error instanceof Error ? error : new Error(String(error));
|
|
5535
3886
|
failures.push(normalizedError);
|
|
5536
3887
|
failedWallets += 1;
|
|
5537
|
-
await (0,
|
|
3888
|
+
await (0, import_hyperliquidWhales.upsertHyperliquidWhaleWalletCoverage)({
|
|
5538
3889
|
address,
|
|
5539
3890
|
fromMs,
|
|
5540
3891
|
toMs,
|
|
@@ -5553,7 +3904,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5553
3904
|
);
|
|
5554
3905
|
}
|
|
5555
3906
|
});
|
|
5556
|
-
const buckets = await (0,
|
|
3907
|
+
const buckets = await (0, import_hyperliquidWhales.rebuildHyperliquidWhaleFlowRows)({
|
|
5557
3908
|
fromMs,
|
|
5558
3909
|
toMs,
|
|
5559
3910
|
...identity
|
|
@@ -5569,7 +3920,7 @@ var backfillHyperliquidWhaleContext = async (params) => {
|
|
|
5569
3920
|
}
|
|
5570
3921
|
);
|
|
5571
3922
|
let displayedCoverageBuckets = 0;
|
|
5572
|
-
const coverageBuckets = await (0,
|
|
3923
|
+
const coverageBuckets = await (0, import_hyperliquidWhales.rebuildHyperliquidWhaleCoverageRows)({
|
|
5573
3924
|
fromMs,
|
|
5574
3925
|
toMs,
|
|
5575
3926
|
expectedWhales: whales.addresses.length,
|
|
@@ -5775,7 +4126,7 @@ var prepareMarketContextForRun = async (params) => {
|
|
|
5775
4126
|
if (readableSources.length) {
|
|
5776
4127
|
await timeOperation3(
|
|
5777
4128
|
"market context schema ensure",
|
|
5778
|
-
() => (0,
|
|
4129
|
+
() => (0, import_marketContext3.ensureMarketContextSchemas)(readableSources)
|
|
5779
4130
|
);
|
|
5780
4131
|
}
|
|
5781
4132
|
if (requirements.derivatives.backfill) {
|
|
@@ -5852,11 +4203,11 @@ var markTestsStarted = () => {
|
|
|
5852
4203
|
var setRuntimeCompareContext = ({
|
|
5853
4204
|
connector,
|
|
5854
4205
|
connectorName,
|
|
5855
|
-
window
|
|
4206
|
+
window
|
|
5856
4207
|
}) => {
|
|
5857
4208
|
runtimeCompareConnector = connector;
|
|
5858
4209
|
runtimeCompareConnectorName = connectorName;
|
|
5859
|
-
runtimeCompareWindow =
|
|
4210
|
+
runtimeCompareWindow = window;
|
|
5860
4211
|
};
|
|
5861
4212
|
var getRuntimeCompareContext = () => ({
|
|
5862
4213
|
connector: runtimeCompareConnector,
|
|
@@ -6550,11 +4901,56 @@ var invokeAfterSignalsHooks = async (hooks, params) => {
|
|
|
6550
4901
|
|
|
6551
4902
|
// src/lib/runtimeLineage.ts
|
|
6552
4903
|
var import_node_child_process = require("child_process");
|
|
4904
|
+
var import_node_crypto2 = require("crypto");
|
|
4905
|
+
var import_promises2 = __toESM(require("fs/promises"));
|
|
4906
|
+
var import_node_path2 = __toESM(require("path"));
|
|
4907
|
+
var import_types2 = require("@tradejs/types");
|
|
4908
|
+
var import_strategies3 = require("@tradejs/node/strategies");
|
|
4909
|
+
|
|
4910
|
+
// src/lib/strategyGateFingerprint.ts
|
|
6553
4911
|
var import_node_crypto = require("crypto");
|
|
6554
4912
|
var import_promises = __toESM(require("fs/promises"));
|
|
6555
4913
|
var import_node_path = __toESM(require("path"));
|
|
6556
|
-
var
|
|
6557
|
-
|
|
4914
|
+
var gateFingerprintRelativePaths = (strategyName) => [
|
|
4915
|
+
`packages/strategies/src/${strategyName}/adapters/ai.ts`,
|
|
4916
|
+
`packages/strategies/src/${strategyName}/guardrails.ts`,
|
|
4917
|
+
`packages/strategies/src/${strategyName}/pockets.ts`,
|
|
4918
|
+
`packages/strategies/src/${strategyName}/config.ts`,
|
|
4919
|
+
"packages/strategies/src/shared/localAiGate.ts",
|
|
4920
|
+
"packages/node/src/ai.ts",
|
|
4921
|
+
"packages/core/src/utils/strategyHelpers/signalBuilders.ts"
|
|
4922
|
+
];
|
|
4923
|
+
var resolveStrategyGateFingerprint = async ({
|
|
4924
|
+
projectRoot,
|
|
4925
|
+
strategyName,
|
|
4926
|
+
gitSha
|
|
4927
|
+
}) => {
|
|
4928
|
+
const candidates = await Promise.all(
|
|
4929
|
+
gateFingerprintRelativePaths(strategyName).map(async (relativePath) => {
|
|
4930
|
+
const content = await import_promises.default.readFile(import_node_path.default.join(projectRoot, relativePath)).catch(() => null);
|
|
4931
|
+
return content == null ? null : { relativePath, content };
|
|
4932
|
+
})
|
|
4933
|
+
);
|
|
4934
|
+
const sourceEntries = candidates.filter(
|
|
4935
|
+
(entry) => entry != null
|
|
4936
|
+
);
|
|
4937
|
+
const hash = (0, import_node_crypto.createHash)("sha256");
|
|
4938
|
+
hash.update(strategyName);
|
|
4939
|
+
if (sourceEntries.length) {
|
|
4940
|
+
for (const entry of sourceEntries) {
|
|
4941
|
+
hash.update(entry.relativePath);
|
|
4942
|
+
hash.update(entry.content);
|
|
4943
|
+
}
|
|
4944
|
+
} else {
|
|
4945
|
+
hash.update(gitSha ?? "unknown-git-sha");
|
|
4946
|
+
}
|
|
4947
|
+
return {
|
|
4948
|
+
gateFingerprint: hash.digest("hex").slice(0, 16),
|
|
4949
|
+
gateFingerprintFiles: sourceEntries.map((entry) => entry.relativePath)
|
|
4950
|
+
};
|
|
4951
|
+
};
|
|
4952
|
+
|
|
4953
|
+
// src/lib/runtimeLineage.ts
|
|
6558
4954
|
var RUNTIME_CONTEXT_ENV_KEYS = [
|
|
6559
4955
|
"AI_MODE",
|
|
6560
4956
|
"MIN_AI_QUALITY",
|
|
@@ -6604,6 +5000,17 @@ var normalizeForStableJson = (value) => {
|
|
|
6604
5000
|
}
|
|
6605
5001
|
return value;
|
|
6606
5002
|
};
|
|
5003
|
+
var normalizeRuntimeLogicConfig = (value) => {
|
|
5004
|
+
if (Array.isArray(value)) {
|
|
5005
|
+
return value.map(normalizeRuntimeLogicConfig);
|
|
5006
|
+
}
|
|
5007
|
+
if (value && typeof value === "object") {
|
|
5008
|
+
return Object.fromEntries(
|
|
5009
|
+
Object.entries(value).filter(([key]) => key !== "MAX_LOSS_VALUE").sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, normalizeRuntimeLogicConfig(entry)])
|
|
5010
|
+
);
|
|
5011
|
+
}
|
|
5012
|
+
return value;
|
|
5013
|
+
};
|
|
6607
5014
|
var resolveRuntimeMaxLossValue = (config) => {
|
|
6608
5015
|
if (!config || typeof config !== "object" || Array.isArray(config)) {
|
|
6609
5016
|
return null;
|
|
@@ -6617,7 +5024,7 @@ var resolveRuntimeMaxLossValue = (config) => {
|
|
|
6617
5024
|
);
|
|
6618
5025
|
return Number.isFinite(maxLossValue) ? maxLossValue : null;
|
|
6619
5026
|
};
|
|
6620
|
-
var fingerprintRuntimeValue = (value) => (0,
|
|
5027
|
+
var fingerprintRuntimeValue = (value) => (0, import_node_crypto2.createHash)("sha256").update(JSON.stringify(normalizeForStableJson(value))).digest("hex").slice(0, 16);
|
|
6621
5028
|
var gitLineageCache = /* @__PURE__ */ new Map();
|
|
6622
5029
|
var gateFingerprintCache = /* @__PURE__ */ new Map();
|
|
6623
5030
|
var binanceBreadthFingerprintCache = /* @__PURE__ */ new Map();
|
|
@@ -6668,7 +5075,7 @@ var resolveGitLineage = (projectRoot) => {
|
|
|
6668
5075
|
};
|
|
6669
5076
|
var readOptionalFile = async (filePath) => {
|
|
6670
5077
|
try {
|
|
6671
|
-
return await
|
|
5078
|
+
return await import_promises2.default.readFile(filePath);
|
|
6672
5079
|
} catch {
|
|
6673
5080
|
return null;
|
|
6674
5081
|
}
|
|
@@ -6678,7 +5085,7 @@ var resolveBinanceBreadthFingerprint = async (projectRoot) => {
|
|
|
6678
5085
|
return binanceBreadthFingerprintCache.get(projectRoot) ?? null;
|
|
6679
5086
|
}
|
|
6680
5087
|
const content = await readOptionalFile(
|
|
6681
|
-
|
|
5088
|
+
import_node_path2.default.join(
|
|
6682
5089
|
projectRoot,
|
|
6683
5090
|
"packages/node/src/config/binanceBreadthUniverses.json"
|
|
6684
5091
|
)
|
|
@@ -6700,7 +5107,7 @@ var resolveSnapshotFingerprint = async (projectRoot, relativePath) => {
|
|
|
6700
5107
|
if (snapshotFingerprintCache.has(cacheKey)) {
|
|
6701
5108
|
return snapshotFingerprintCache.get(cacheKey) ?? null;
|
|
6702
5109
|
}
|
|
6703
|
-
const content = await readOptionalFile(
|
|
5110
|
+
const content = await readOptionalFile(import_node_path2.default.join(projectRoot, relativePath));
|
|
6704
5111
|
let result = null;
|
|
6705
5112
|
if (content) {
|
|
6706
5113
|
try {
|
|
@@ -6713,55 +5120,26 @@ var resolveSnapshotFingerprint = async (projectRoot, relativePath) => {
|
|
|
6713
5120
|
snapshotFingerprintCache.set(cacheKey, result);
|
|
6714
5121
|
return result;
|
|
6715
5122
|
};
|
|
6716
|
-
var
|
|
5123
|
+
var resolveRuntimeGateFingerprint = async ({
|
|
6717
5124
|
projectRoot,
|
|
6718
5125
|
strategyName,
|
|
6719
5126
|
gitSha
|
|
6720
5127
|
}) => {
|
|
6721
5128
|
const cacheKey = `${projectRoot}:${strategyName}:${gitSha ?? "unknown"}`;
|
|
6722
5129
|
const cached = gateFingerprintCache.get(cacheKey);
|
|
6723
|
-
if (cached)
|
|
6724
|
-
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
|
|
6728
|
-
|
|
6729
|
-
|
|
6730
|
-
|
|
6731
|
-
"packages/node/src/ai.ts",
|
|
6732
|
-
"packages/core/src/utils/strategyHelpers/signalBuilders.ts"
|
|
6733
|
-
];
|
|
6734
|
-
const optionalEntries = await Promise.all(
|
|
6735
|
-
relativeCandidates.map(async (relativePath) => {
|
|
6736
|
-
const content = await readOptionalFile(
|
|
6737
|
-
import_node_path.default.join(projectRoot, relativePath)
|
|
6738
|
-
);
|
|
6739
|
-
return content == null ? null : { relativePath, content };
|
|
6740
|
-
})
|
|
6741
|
-
);
|
|
6742
|
-
const sourceEntries = [];
|
|
6743
|
-
for (const entry of optionalEntries) {
|
|
6744
|
-
if (entry != null) {
|
|
6745
|
-
sourceEntries.push(entry);
|
|
6746
|
-
}
|
|
6747
|
-
}
|
|
6748
|
-
const hash = (0, import_node_crypto.createHash)("sha256");
|
|
6749
|
-
hash.update(strategyName);
|
|
6750
|
-
if (sourceEntries.length) {
|
|
6751
|
-
for (const entry of sourceEntries) {
|
|
6752
|
-
hash.update(entry.relativePath);
|
|
6753
|
-
hash.update(entry.content);
|
|
6754
|
-
}
|
|
6755
|
-
} else {
|
|
6756
|
-
hash.update(gitSha ?? "unknown-git-sha");
|
|
6757
|
-
}
|
|
6758
|
-
const fingerprint = hash.digest("hex").slice(0, 16);
|
|
6759
|
-
gateFingerprintCache.set(cacheKey, fingerprint);
|
|
6760
|
-
return fingerprint;
|
|
5130
|
+
if (cached) return cached;
|
|
5131
|
+
const result = await resolveStrategyGateFingerprint({
|
|
5132
|
+
projectRoot,
|
|
5133
|
+
strategyName,
|
|
5134
|
+
gitSha
|
|
5135
|
+
});
|
|
5136
|
+
gateFingerprintCache.set(cacheKey, result);
|
|
5137
|
+
return result;
|
|
6761
5138
|
};
|
|
6762
5139
|
var buildRuntimeLineage = async ({
|
|
6763
5140
|
projectRoot,
|
|
6764
5141
|
strategyName,
|
|
5142
|
+
compositionId,
|
|
6765
5143
|
config,
|
|
6766
5144
|
runContext,
|
|
6767
5145
|
env = process.env
|
|
@@ -6787,19 +5165,25 @@ var buildRuntimeLineage = async ({
|
|
|
6787
5165
|
};
|
|
6788
5166
|
return {
|
|
6789
5167
|
schemaVersion: 1,
|
|
5168
|
+
compositionId: compositionId?.trim() || null,
|
|
6790
5169
|
...git,
|
|
6791
|
-
gateFingerprint: await
|
|
5170
|
+
gateFingerprint: (await resolveRuntimeGateFingerprint({
|
|
6792
5171
|
projectRoot,
|
|
6793
5172
|
strategyName,
|
|
6794
5173
|
gitSha: git.gitSha
|
|
6795
|
-
}),
|
|
6796
|
-
|
|
5174
|
+
})).gateFingerprint,
|
|
5175
|
+
// Position risk is tracked separately so changing trade size does not
|
|
5176
|
+
// masquerade as a change to the core + gate decision logic.
|
|
5177
|
+
configFingerprint: fingerprintRuntimeValue(
|
|
5178
|
+
normalizeRuntimeLogicConfig(config)
|
|
5179
|
+
),
|
|
6797
5180
|
contextFingerprint: fingerprintRuntimeValue(context),
|
|
6798
5181
|
maxLossValue: resolveRuntimeMaxLossValue(config)
|
|
6799
5182
|
};
|
|
6800
5183
|
};
|
|
6801
5184
|
var runtimeLineageKey = (lineage) => [
|
|
6802
5185
|
lineage.schemaVersion,
|
|
5186
|
+
lineage.compositionId ?? "unbound-composition",
|
|
6803
5187
|
lineage.gitSha ?? "unknown",
|
|
6804
5188
|
lineage.gitDirty == null ? "unknown" : lineage.gitDirty ? "dirty" : "clean",
|
|
6805
5189
|
lineage.gateFingerprint,
|
|
@@ -8812,8 +7196,8 @@ var buildReplayExchangeComparisonDetails = ({
|
|
|
8812
7196
|
};
|
|
8813
7197
|
|
|
8814
7198
|
// src/lib/replay/runtimeEvidenceSource.ts
|
|
8815
|
-
var
|
|
8816
|
-
var
|
|
7199
|
+
var import_promises3 = __toESM(require("fs/promises"));
|
|
7200
|
+
var import_node_path3 = __toESM(require("path"));
|
|
8817
7201
|
var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
8818
7202
|
var asFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
8819
7203
|
var unwrapRows = (value, field) => (Array.isArray(value) ? value : []).map((item) => {
|
|
@@ -8874,9 +7258,9 @@ var loadReplayRuntimeEvidenceSource = async ({
|
|
|
8874
7258
|
expectedUserName,
|
|
8875
7259
|
expectedWindow
|
|
8876
7260
|
}) => {
|
|
8877
|
-
const resolvedPath =
|
|
7261
|
+
const resolvedPath = import_node_path3.default.resolve(projectRoot, filePath);
|
|
8878
7262
|
const root = asRecord(
|
|
8879
|
-
JSON.parse(await
|
|
7263
|
+
JSON.parse(await import_promises3.default.readFile(resolvedPath, "utf8"))
|
|
8880
7264
|
);
|
|
8881
7265
|
const runtime = asRecord(root?.runtime) ?? root;
|
|
8882
7266
|
if (!root || !runtime) {
|
|
@@ -9021,11 +7405,11 @@ var filterReplayComparisonByLineage = ({
|
|
|
9021
7405
|
expectedByScope
|
|
9022
7406
|
});
|
|
9023
7407
|
}
|
|
9024
|
-
const
|
|
7408
|
+
const window = deploymentWindows.get(
|
|
9025
7409
|
lineageScopeKey(trade.strategy, trade.symbol)
|
|
9026
7410
|
);
|
|
9027
7411
|
const signalTimestamp = trade.signalTimestamp ?? trade.entryTimestamp;
|
|
9028
|
-
return
|
|
7412
|
+
return window != null && signalTimestamp >= window.firstTimestamp && signalTimestamp <= window.lastTimestamp;
|
|
9029
7413
|
});
|
|
9030
7414
|
for (const artifact of [
|
|
9031
7415
|
...comparableRuntimeSignals,
|
|
@@ -9039,11 +7423,11 @@ var filterReplayComparisonByLineage = ({
|
|
|
9039
7423
|
});
|
|
9040
7424
|
}
|
|
9041
7425
|
const comparableBacktestEntries = backtestEntries.filter((entry) => {
|
|
9042
|
-
const
|
|
7426
|
+
const window = deploymentWindows.get(
|
|
9043
7427
|
lineageScopeKey(entry.strategy, entry.symbol)
|
|
9044
7428
|
);
|
|
9045
7429
|
const signalTimestamp = entry.signalTimestamp ?? entry.timestamp;
|
|
9046
|
-
return
|
|
7430
|
+
return window != null && signalTimestamp >= window.firstTimestamp && signalTimestamp <= window.lastTimestamp;
|
|
9047
7431
|
});
|
|
9048
7432
|
const comparableScopeKeys = new Set(deploymentWindows.keys());
|
|
9049
7433
|
return {
|
|
@@ -9455,11 +7839,11 @@ var saveAndPrintReplayExchangeComparison = async ({
|
|
|
9455
7839
|
runtimeSignalEvaluations,
|
|
9456
7840
|
lineage
|
|
9457
7841
|
}) => {
|
|
9458
|
-
const { connector, connectorName, window
|
|
7842
|
+
const { connector, connectorName, window } = getRuntimeCompareContext();
|
|
9459
7843
|
const rawExchangeEntries = await loadExchangeEntriesForComparison({
|
|
9460
7844
|
connector,
|
|
9461
|
-
startTime:
|
|
9462
|
-
endTime:
|
|
7845
|
+
startTime: window.start,
|
|
7846
|
+
endTime: window.end
|
|
9463
7847
|
});
|
|
9464
7848
|
const strategyNameByOrderLinkKey = buildStrategyNameByOrderLinkKey(
|
|
9465
7849
|
liveStrategySummaries.map((summary) => summary.strategyName)
|
|
@@ -9494,8 +7878,8 @@ var saveAndPrintReplayExchangeComparison = async ({
|
|
|
9494
7878
|
console.log(
|
|
9495
7879
|
import_chalk11.default.yellow(
|
|
9496
7880
|
`SIGNALS REPLAY VS EXCHANGE: no lineage-linked exchange entry executions found for ${connectorName} in ${(0, import_time6.formatUnix)(
|
|
9497
|
-
|
|
9498
|
-
)} -> ${(0, import_time6.formatUnix)(
|
|
7881
|
+
window.start
|
|
7882
|
+
)} -> ${(0, import_time6.formatUnix)(window.end)}`
|
|
9499
7883
|
)
|
|
9500
7884
|
);
|
|
9501
7885
|
console.log("");
|
|
@@ -9691,8 +8075,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9691
8075
|
replayLineages,
|
|
9692
8076
|
runtimeEvidencePath
|
|
9693
8077
|
}) => {
|
|
9694
|
-
const { connector, connectorName, window
|
|
9695
|
-
if (!connector || !
|
|
8078
|
+
const { connector, connectorName, window } = getRuntimeCompareContext();
|
|
8079
|
+
if (!connector || !window) {
|
|
9696
8080
|
return null;
|
|
9697
8081
|
}
|
|
9698
8082
|
const relevantStrategies = new Set(
|
|
@@ -9703,7 +8087,7 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9703
8087
|
filePath: runtimeEvidencePath,
|
|
9704
8088
|
projectRoot: replayProjectRoot,
|
|
9705
8089
|
expectedUserName: replayUserName,
|
|
9706
|
-
expectedWindow:
|
|
8090
|
+
expectedWindow: window
|
|
9707
8091
|
}) : null;
|
|
9708
8092
|
const [
|
|
9709
8093
|
rawRuntimeTrades,
|
|
@@ -9717,20 +8101,20 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9717
8101
|
runtimeEvidence.lineageScopes
|
|
9718
8102
|
] : await Promise.all([
|
|
9719
8103
|
loadRuntimeTrades(replayUserName, {
|
|
9720
|
-
startTime:
|
|
9721
|
-
endTime:
|
|
8104
|
+
startTime: window.start,
|
|
8105
|
+
endTime: window.end
|
|
9722
8106
|
}),
|
|
9723
8107
|
loadRuntimeSignals(replayUserName, {
|
|
9724
|
-
startTime:
|
|
9725
|
-
endTime:
|
|
8108
|
+
startTime: window.start,
|
|
8109
|
+
endTime: window.end
|
|
9726
8110
|
}),
|
|
9727
8111
|
loadRuntimeSignalEvaluations(replayUserName, {
|
|
9728
|
-
startTime:
|
|
9729
|
-
endTime:
|
|
8112
|
+
startTime: window.start,
|
|
8113
|
+
endTime: window.end
|
|
9730
8114
|
}),
|
|
9731
8115
|
loadRuntimeLineageScopes(replayUserName, {
|
|
9732
|
-
startTime:
|
|
9733
|
-
endTime:
|
|
8116
|
+
startTime: window.start,
|
|
8117
|
+
endTime: window.end
|
|
9734
8118
|
})
|
|
9735
8119
|
]);
|
|
9736
8120
|
if (runtimeEvidence) {
|
|
@@ -9744,8 +8128,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9744
8128
|
userName: replayUserName,
|
|
9745
8129
|
connector,
|
|
9746
8130
|
trades: rawRuntimeTrades,
|
|
9747
|
-
startTime:
|
|
9748
|
-
endTime:
|
|
8131
|
+
startTime: window.start,
|
|
8132
|
+
endTime: window.end,
|
|
9749
8133
|
openPositionCallbacks: {
|
|
9750
8134
|
onError: (error) => {
|
|
9751
8135
|
console.log(
|
|
@@ -9789,15 +8173,15 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9789
8173
|
});
|
|
9790
8174
|
const comparableBacktestEntries = comparable.backtestEntries;
|
|
9791
8175
|
const windowRuntimeTrades = comparable.runtimeTrades.filter(
|
|
9792
|
-
(trade) => trade.entryTimestamp >=
|
|
8176
|
+
(trade) => trade.entryTimestamp >= window.start && trade.entryTimestamp < window.end && relevantStrategies.has(trade.strategy)
|
|
9793
8177
|
);
|
|
9794
8178
|
if (!windowRuntimeTrades.length && !runtimeEvidence) {
|
|
9795
8179
|
console.log("");
|
|
9796
8180
|
console.log(
|
|
9797
8181
|
import_chalk11.default.yellow(
|
|
9798
8182
|
`SIGNALS REPLAY VS RUNTIME: no local runtime trades found for ${connectorName} in ${(0, import_time6.formatUnix)(
|
|
9799
|
-
|
|
9800
|
-
)} -> ${(0, import_time6.formatUnix)(
|
|
8183
|
+
window.start
|
|
8184
|
+
)} -> ${(0, import_time6.formatUnix)(window.end)} with matching lineage; checking lineage-linked exchange executions`
|
|
9801
8185
|
)
|
|
9802
8186
|
);
|
|
9803
8187
|
console.log("");
|
|
@@ -9923,8 +8307,8 @@ var saveAndPrintReplayRuntimeComparison = async ({
|
|
|
9923
8307
|
};
|
|
9924
8308
|
|
|
9925
8309
|
// src/lib/replay/outputReport.ts
|
|
9926
|
-
var
|
|
9927
|
-
var
|
|
8310
|
+
var import_promises4 = __toESM(require("fs/promises"));
|
|
8311
|
+
var import_node_path4 = __toESM(require("path"));
|
|
9928
8312
|
var import_data = require("@tradejs/core/data");
|
|
9929
8313
|
var formatMsk = (timestamp) => typeof timestamp === "number" && Number.isFinite(timestamp) ? new Intl.DateTimeFormat("ru-RU", {
|
|
9930
8314
|
timeZone: "Europe/Moscow",
|
|
@@ -10222,14 +8606,14 @@ var writeReplayOutputReport = async ({
|
|
|
10222
8606
|
connectorName,
|
|
10223
8607
|
interval,
|
|
10224
8608
|
tickers,
|
|
10225
|
-
window
|
|
8609
|
+
window,
|
|
10226
8610
|
durationSeconds,
|
|
10227
8611
|
replayResult,
|
|
10228
8612
|
strategySnapshot,
|
|
10229
8613
|
runtimeComparison
|
|
10230
8614
|
}) => {
|
|
10231
|
-
const outputDir =
|
|
10232
|
-
await
|
|
8615
|
+
const outputDir = import_node_path4.default.resolve(projectRoot, "data/replay/output");
|
|
8616
|
+
await import_promises4.default.mkdir(outputDir, { recursive: true });
|
|
10233
8617
|
const perTradeAnalysis = buildPerTradeAnalysis(runtimeComparison);
|
|
10234
8618
|
const report = {
|
|
10235
8619
|
reportType: "replay-output",
|
|
@@ -10240,12 +8624,12 @@ var writeReplayOutputReport = async ({
|
|
|
10240
8624
|
interval,
|
|
10241
8625
|
command: process.argv.join(" "),
|
|
10242
8626
|
window: {
|
|
10243
|
-
startTime:
|
|
10244
|
-
endTime:
|
|
10245
|
-
startIso: new Date(
|
|
10246
|
-
endIso: new Date(
|
|
10247
|
-
startMsk: formatMsk(
|
|
10248
|
-
endMsk: formatMsk(
|
|
8627
|
+
startTime: window.start,
|
|
8628
|
+
endTime: window.end,
|
|
8629
|
+
startIso: new Date(window.start).toISOString(),
|
|
8630
|
+
endIso: new Date(window.end).toISOString(),
|
|
8631
|
+
startMsk: formatMsk(window.start),
|
|
8632
|
+
endMsk: formatMsk(window.end)
|
|
10249
8633
|
},
|
|
10250
8634
|
durationSeconds,
|
|
10251
8635
|
counts: {
|
|
@@ -10264,8 +8648,8 @@ var writeReplayOutputReport = async ({
|
|
|
10264
8648
|
runtimeComparison,
|
|
10265
8649
|
perTradeAnalysis
|
|
10266
8650
|
};
|
|
10267
|
-
const markdownPath =
|
|
10268
|
-
const jsonPath =
|
|
8651
|
+
const markdownPath = import_node_path4.default.join(outputDir, `${timestamp}-replay-report.md`);
|
|
8652
|
+
const jsonPath = import_node_path4.default.join(outputDir, `${timestamp}-replay-report.json`);
|
|
10269
8653
|
const lines = [
|
|
10270
8654
|
"# Replay Report",
|
|
10271
8655
|
"",
|
|
@@ -10282,7 +8666,7 @@ var writeReplayOutputReport = async ({
|
|
|
10282
8666
|
["Strategies", replayResult.strategies.length],
|
|
10283
8667
|
["Signals", replayResult.signals.length],
|
|
10284
8668
|
["Duration", `${durationSeconds.toFixed(2)}s`],
|
|
10285
|
-
["Window", `${formatMsk(
|
|
8669
|
+
["Window", `${formatMsk(window.start)} - ${formatMsk(window.end)} MSK`],
|
|
10286
8670
|
["Runtime compare mode", runtimeComparison?.mode ?? "none"],
|
|
10287
8671
|
["Matched", runtimeComparison?.matchedCount ?? 0],
|
|
10288
8672
|
["Order failed", runtimeComparison?.orderFailedCount ?? 0],
|
|
@@ -10331,8 +8715,8 @@ var writeReplayOutputReport = async ({
|
|
|
10331
8715
|
""
|
|
10332
8716
|
];
|
|
10333
8717
|
await Promise.all([
|
|
10334
|
-
|
|
10335
|
-
|
|
8718
|
+
import_promises4.default.writeFile(markdownPath, lines.join("\n"), "utf8"),
|
|
8719
|
+
import_promises4.default.writeFile(jsonPath, `${(0, import_data.toJson)(report, true)}
|
|
10336
8720
|
`, "utf8")
|
|
10337
8721
|
]);
|
|
10338
8722
|
return {
|
|
@@ -10363,7 +8747,7 @@ var finishReplay = async ({
|
|
|
10363
8747
|
replayResult,
|
|
10364
8748
|
tickers,
|
|
10365
8749
|
connectorName,
|
|
10366
|
-
window
|
|
8750
|
+
window
|
|
10367
8751
|
}) => {
|
|
10368
8752
|
const replayStrategySnapshot = await saveAndPrintReplayResultsByStrategy({
|
|
10369
8753
|
replayResult,
|
|
@@ -10403,7 +8787,7 @@ var finishReplay = async ({
|
|
|
10403
8787
|
connectorName,
|
|
10404
8788
|
interval: replayInterval,
|
|
10405
8789
|
tickers,
|
|
10406
|
-
window
|
|
8790
|
+
window,
|
|
10407
8791
|
durationSeconds,
|
|
10408
8792
|
replayResult,
|
|
10409
8793
|
strategySnapshot: replayStrategySnapshot,
|