@backtest-kit/cli 13.4.0 → 13.5.0

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/README.md CHANGED
@@ -954,7 +954,27 @@ export default {
954
954
  };
955
955
  ```
956
956
 
957
- **How it works:** when strategy code calls `require("ccxt")`, the loader checks `IMPORT_ALIAS` first. If a key matches, the mapped value is returned instead of the real module no monkey-patching of `node_modules` needed.
957
+ Alias config may export an **async factory** instead of a plain mapping. The CLI `await`s it before any strategy code runs, so you can resolve ESM modules dynamically and hand the live bindings to the alias table:
958
+
959
+ ```ts
960
+ // config/alias.config.ts — async factory (default export)
961
+ export default async () => ({
962
+ // `nanoid` is ESM-only — `require("nanoid")` would throw,
963
+ // so pull it in with a dynamic import and alias it.
964
+ nanoid: await import("nanoid"),
965
+ });
966
+ ```
967
+
968
+ ```ts
969
+ // config/alias.config.ts — async factory (named `loader` export)
970
+ export const loader = async () => ({
971
+ "p-limit": await import("p-limit"),
972
+ });
973
+ ```
974
+
975
+ Both export styles are supported — `export default` and `export const loader` — but **never both at once**; if both are present the `default` export wins. The factory must resolve to the same `{ moduleName: replacement }` shape as the object form. The CLI awaits it before loading the first strategy module, so strategy code keeps calling a plain `require("nanoid")` and transparently gets the ESM binding.
976
+
977
+ When strategy code calls `require("ccxt")`, the loader checks `IMPORT_ALIAS` first. If a key matches, the mapped value is returned instead of the real module — no monkey-patching of `node_modules` needed.
958
978
 
959
979
  **Important:** It is **not** per-strategy — it applies to all modules loaded in the current process.
960
980
 
package/build/index.cjs CHANGED
@@ -10,7 +10,6 @@ var fs$1 = require('fs/promises');
10
10
  var dotenv = require('dotenv');
11
11
  var diKit = require('di-kit');
12
12
  var url = require('url');
13
- var ccxt = require('ccxt');
14
13
  var util = require('util');
15
14
  var child_process = require('child_process');
16
15
  var BacktestKitUi = require('@backtest-kit/ui');
@@ -440,7 +439,7 @@ class ResolveService {
440
439
  const cwd = process.cwd();
441
440
  dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
442
441
  }
443
- this.loaderService.import(absolutePath, moduleRoot);
442
+ await this.loaderService.import(absolutePath, moduleRoot);
444
443
  };
445
444
  this.attachJavascript = async (jsPath) => {
446
445
  this.loggerService.log("resolveService attachJavascript", {
@@ -458,7 +457,7 @@ class ResolveService {
458
457
  cwd !== moduleRoot && Setup.update();
459
458
  dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
460
459
  dotenv.config({ path: path.join(moduleRoot, '.env'), override: true, quiet: true });
461
- this.loaderService.import(absolutePath);
460
+ await this.loaderService.import(absolutePath);
462
461
  }
463
462
  _is_launched = true;
464
463
  return absolutePath;
@@ -475,7 +474,7 @@ class ResolveService {
475
474
  await fs$1.access(absolutePath, fs.constants.F_OK | fs.constants.R_OK);
476
475
  dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
477
476
  {
478
- this.loaderService.import(absolutePath);
477
+ await this.loaderService.import(absolutePath);
479
478
  }
480
479
  _is_launched = true;
481
480
  return absolutePath;
@@ -484,6 +483,7 @@ class ResolveService {
484
483
  }
485
484
 
486
485
  const getExchange = functoolsKit.singleshot(async () => {
486
+ const ccxt = await import('ccxt');
487
487
  const exchange = new ccxt.binance({
488
488
  options: {
489
489
  defaultType: "spot",
@@ -2748,7 +2748,7 @@ const LOAD_MODULE_MODULE_FN = async (fileName, self) => {
2748
2748
  for (const { filePath, baseDir } of GET_MODULE_VARIANTS_FN(fileName, self)) {
2749
2749
  try {
2750
2750
  if (await self.loaderService.check(filePath, baseDir)) {
2751
- self.loaderService.import(filePath, baseDir);
2751
+ await self.loaderService.import(filePath, baseDir);
2752
2752
  return true;
2753
2753
  }
2754
2754
  }
@@ -3123,12 +3123,23 @@ const GET_ALIAS_VARIANTS_FN = (self) => {
3123
3123
  });
3124
3124
  return result;
3125
3125
  };
3126
+ const ESM_IMPORT_FN = functoolsKit.trycatch(async (name) => {
3127
+ const alias = await import(name);
3128
+ {
3129
+ overrideModule(name, alias);
3130
+ Object.assign(IMPORT_ALIAS, { [name]: alias });
3131
+ }
3132
+ }, {
3133
+ fallback: (error, name) => {
3134
+ console.error(`Import failed for ${name}`, error);
3135
+ }
3136
+ });
3126
3137
  const GET_ALIAS_EXPORTS_FN = (self) => {
3127
3138
  for (const { filePath, baseDir } of GET_ALIAS_VARIANTS_FN(self)) {
3128
3139
  if (!fs.existsSync(filePath)) {
3129
3140
  continue;
3130
3141
  }
3131
- const instance = self.getInstance(baseDir);
3142
+ const instance = self._getInstance(baseDir);
3132
3143
  const alias = instance.import(filePath);
3133
3144
  if (!alias) {
3134
3145
  return null;
@@ -3140,17 +3151,38 @@ const GET_ALIAS_EXPORTS_FN = (self) => {
3140
3151
  }
3141
3152
  return null;
3142
3153
  };
3143
- const INIT_ALIAS_FN = functoolsKit.singleshot((self) => {
3154
+ const INIT_ALIAS_FN = functoolsKit.singleshot(async (self) => {
3155
+ {
3156
+ await ESM_IMPORT_FN("ccxt");
3157
+ await ESM_IMPORT_FN("pinets");
3158
+ }
3144
3159
  const alias = GET_ALIAS_EXPORTS_FN(self);
3145
3160
  if (!alias) {
3146
3161
  return;
3147
3162
  }
3148
- if (!functoolsKit.isObject(alias)) {
3163
+ let moduleMap;
3164
+ try {
3165
+ if (functoolsKit.isObject(alias)) {
3166
+ moduleMap = alias;
3167
+ }
3168
+ else if (typeof alias === "function") {
3169
+ moduleMap = await alias();
3170
+ }
3171
+ else if (typeof alias?.loader === "function") {
3172
+ moduleMap = await alias.loader();
3173
+ }
3174
+ }
3175
+ catch (error) {
3176
+ console.error("Alias loader failed", error);
3177
+ kill(-1);
3178
+ return;
3179
+ }
3180
+ if (!functoolsKit.isObject(moduleMap)) {
3149
3181
  return;
3150
3182
  }
3151
3183
  {
3152
- Object.entries(alias).forEach(([name, module]) => overrideModule(name, module));
3153
- Object.assign(IMPORT_ALIAS, alias);
3184
+ Object.entries(moduleMap).forEach(([name, module]) => overrideModule(name, module));
3185
+ Object.assign(IMPORT_ALIAS, moduleMap);
3154
3186
  }
3155
3187
  });
3156
3188
  class LoaderService {
@@ -3158,8 +3190,7 @@ class LoaderService {
3158
3190
  this.babelService = inject(TYPES.babelService);
3159
3191
  this.loggerService = inject(TYPES.loggerService);
3160
3192
  this.resolveService = inject(TYPES.resolveService);
3161
- this.getInstance = functoolsKit.memoize(([basePath]) => `${basePath}`, (basePath) => {
3162
- INIT_ALIAS_FN(this);
3193
+ this._getInstance = functoolsKit.memoize(([basePath]) => `${basePath}`, (basePath) => {
3163
3194
  return new ClientLoader({
3164
3195
  babel: this.babelService,
3165
3196
  logger: this.loggerService,
@@ -3167,12 +3198,13 @@ class LoaderService {
3167
3198
  path: basePath,
3168
3199
  });
3169
3200
  });
3170
- this.import = (filePath, basePath = process.cwd()) => {
3201
+ this.import = async (filePath, basePath = process.cwd()) => {
3171
3202
  this.loggerService.log("loaderService import", {
3172
3203
  filePath,
3173
3204
  basePath,
3174
3205
  });
3175
- const instance = this.getInstance(basePath);
3206
+ const instance = this._getInstance(basePath);
3207
+ await INIT_ALIAS_FN(this);
3176
3208
  return instance.import(filePath);
3177
3209
  };
3178
3210
  this.check = async (filePath, basePath = process.cwd()) => {
@@ -3180,7 +3212,8 @@ class LoaderService {
3180
3212
  filePath,
3181
3213
  basePath,
3182
3214
  });
3183
- const instance = this.getInstance(basePath);
3215
+ const instance = this._getInstance(basePath);
3216
+ await INIT_ALIAS_FN(this);
3184
3217
  return instance.check(filePath);
3185
3218
  };
3186
3219
  }
@@ -3206,7 +3239,7 @@ const LOAD_CONFIG_CONFIG_FN = async (fileName, self) => {
3206
3239
  for (const { filePath, baseDir } of GET_CONFIG_VARIANTS_FN(fileName, self)) {
3207
3240
  try {
3208
3241
  if (await self.loaderService.check(filePath, baseDir)) {
3209
- return self.loaderService.import(filePath, baseDir);
3242
+ return await self.loaderService.import(filePath, baseDir);
3210
3243
  }
3211
3244
  }
3212
3245
  catch {
@@ -3397,7 +3430,7 @@ const main$h = async () => {
3397
3430
  if (MODES.some((mode) => values[mode])) {
3398
3431
  return;
3399
3432
  }
3400
- process.stdout.write(`@backtest-kit/cli ${"13.4.0"}\n`);
3433
+ process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n`);
3401
3434
  process.stdout.write("\n");
3402
3435
  process.stdout.write(`Run with --help to see available commands.\n`);
3403
3436
  process.stdout.write("\n");
@@ -4703,7 +4736,7 @@ const main$1 = async () => {
4703
4736
  if (!values.help) {
4704
4737
  return;
4705
4738
  }
4706
- process.stdout.write(`@backtest-kit/cli ${"13.4.0"}\n\n`);
4739
+ process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n\n`);
4707
4740
  process.stdout.write(HELP_TEXT);
4708
4741
  process.exit(0);
4709
4742
  };
@@ -4717,7 +4750,7 @@ const main = async () => {
4717
4750
  if (!values.version) {
4718
4751
  return;
4719
4752
  }
4720
- process.stdout.write(`@backtest-kit/cli ${"13.4.0"}\n`);
4753
+ process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n`);
4721
4754
  process.exit(0);
4722
4755
  };
4723
4756
  main();
package/build/index.mjs CHANGED
@@ -9,7 +9,6 @@ import fs$1, { access, readFile, mkdir, writeFile, rm, readdir, copyFile } from
9
9
  import dotenv from 'dotenv';
10
10
  import { createActivator } from 'di-kit';
11
11
  import { fileURLToPath } from 'url';
12
- import ccxt from 'ccxt';
13
12
  import { parseArgs } from 'util';
14
13
  import { exec, spawn } from 'child_process';
15
14
  import * as BacktestKitUi from '@backtest-kit/ui';
@@ -415,7 +414,7 @@ class ResolveService {
415
414
  const cwd = process.cwd();
416
415
  dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
417
416
  }
418
- this.loaderService.import(absolutePath, moduleRoot);
417
+ await this.loaderService.import(absolutePath, moduleRoot);
419
418
  };
420
419
  this.attachJavascript = async (jsPath) => {
421
420
  this.loggerService.log("resolveService attachJavascript", {
@@ -433,7 +432,7 @@ class ResolveService {
433
432
  cwd !== moduleRoot && Setup.update();
434
433
  dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
435
434
  dotenv.config({ path: path.join(moduleRoot, '.env'), override: true, quiet: true });
436
- this.loaderService.import(absolutePath);
435
+ await this.loaderService.import(absolutePath);
437
436
  }
438
437
  _is_launched = true;
439
438
  return absolutePath;
@@ -450,7 +449,7 @@ class ResolveService {
450
449
  await access(absolutePath, constants.F_OK | constants.R_OK);
451
450
  dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
452
451
  {
453
- this.loaderService.import(absolutePath);
452
+ await this.loaderService.import(absolutePath);
454
453
  }
455
454
  _is_launched = true;
456
455
  return absolutePath;
@@ -459,6 +458,7 @@ class ResolveService {
459
458
  }
460
459
 
461
460
  const getExchange = singleshot(async () => {
461
+ const ccxt = await import('ccxt');
462
462
  const exchange = new ccxt.binance({
463
463
  options: {
464
464
  defaultType: "spot",
@@ -2723,7 +2723,7 @@ const LOAD_MODULE_MODULE_FN = async (fileName, self) => {
2723
2723
  for (const { filePath, baseDir } of GET_MODULE_VARIANTS_FN(fileName, self)) {
2724
2724
  try {
2725
2725
  if (await self.loaderService.check(filePath, baseDir)) {
2726
- self.loaderService.import(filePath, baseDir);
2726
+ await self.loaderService.import(filePath, baseDir);
2727
2727
  return true;
2728
2728
  }
2729
2729
  }
@@ -3094,12 +3094,23 @@ const GET_ALIAS_VARIANTS_FN = (self) => {
3094
3094
  });
3095
3095
  return result;
3096
3096
  };
3097
+ const ESM_IMPORT_FN = trycatch(async (name) => {
3098
+ const alias = await import(name);
3099
+ {
3100
+ overrideModule(name, alias);
3101
+ Object.assign(IMPORT_ALIAS, { [name]: alias });
3102
+ }
3103
+ }, {
3104
+ fallback: (error, name) => {
3105
+ console.error(`Import failed for ${name}`, error);
3106
+ }
3107
+ });
3097
3108
  const GET_ALIAS_EXPORTS_FN = (self) => {
3098
3109
  for (const { filePath, baseDir } of GET_ALIAS_VARIANTS_FN(self)) {
3099
3110
  if (!fs.existsSync(filePath)) {
3100
3111
  continue;
3101
3112
  }
3102
- const instance = self.getInstance(baseDir);
3113
+ const instance = self._getInstance(baseDir);
3103
3114
  const alias = instance.import(filePath);
3104
3115
  if (!alias) {
3105
3116
  return null;
@@ -3111,17 +3122,38 @@ const GET_ALIAS_EXPORTS_FN = (self) => {
3111
3122
  }
3112
3123
  return null;
3113
3124
  };
3114
- const INIT_ALIAS_FN = singleshot((self) => {
3125
+ const INIT_ALIAS_FN = singleshot(async (self) => {
3126
+ {
3127
+ await ESM_IMPORT_FN("ccxt");
3128
+ await ESM_IMPORT_FN("pinets");
3129
+ }
3115
3130
  const alias = GET_ALIAS_EXPORTS_FN(self);
3116
3131
  if (!alias) {
3117
3132
  return;
3118
3133
  }
3119
- if (!isObject(alias)) {
3134
+ let moduleMap;
3135
+ try {
3136
+ if (isObject(alias)) {
3137
+ moduleMap = alias;
3138
+ }
3139
+ else if (typeof alias === "function") {
3140
+ moduleMap = await alias();
3141
+ }
3142
+ else if (typeof alias?.loader === "function") {
3143
+ moduleMap = await alias.loader();
3144
+ }
3145
+ }
3146
+ catch (error) {
3147
+ console.error("Alias loader failed", error);
3148
+ kill(-1);
3149
+ return;
3150
+ }
3151
+ if (!isObject(moduleMap)) {
3120
3152
  return;
3121
3153
  }
3122
3154
  {
3123
- Object.entries(alias).forEach(([name, module]) => overrideModule(name, module));
3124
- Object.assign(IMPORT_ALIAS, alias);
3155
+ Object.entries(moduleMap).forEach(([name, module]) => overrideModule(name, module));
3156
+ Object.assign(IMPORT_ALIAS, moduleMap);
3125
3157
  }
3126
3158
  });
3127
3159
  class LoaderService {
@@ -3129,8 +3161,7 @@ class LoaderService {
3129
3161
  this.babelService = inject(TYPES.babelService);
3130
3162
  this.loggerService = inject(TYPES.loggerService);
3131
3163
  this.resolveService = inject(TYPES.resolveService);
3132
- this.getInstance = memoize(([basePath]) => `${basePath}`, (basePath) => {
3133
- INIT_ALIAS_FN(this);
3164
+ this._getInstance = memoize(([basePath]) => `${basePath}`, (basePath) => {
3134
3165
  return new ClientLoader({
3135
3166
  babel: this.babelService,
3136
3167
  logger: this.loggerService,
@@ -3138,12 +3169,13 @@ class LoaderService {
3138
3169
  path: basePath,
3139
3170
  });
3140
3171
  });
3141
- this.import = (filePath, basePath = process.cwd()) => {
3172
+ this.import = async (filePath, basePath = process.cwd()) => {
3142
3173
  this.loggerService.log("loaderService import", {
3143
3174
  filePath,
3144
3175
  basePath,
3145
3176
  });
3146
- const instance = this.getInstance(basePath);
3177
+ const instance = this._getInstance(basePath);
3178
+ await INIT_ALIAS_FN(this);
3147
3179
  return instance.import(filePath);
3148
3180
  };
3149
3181
  this.check = async (filePath, basePath = process.cwd()) => {
@@ -3151,7 +3183,8 @@ class LoaderService {
3151
3183
  filePath,
3152
3184
  basePath,
3153
3185
  });
3154
- const instance = this.getInstance(basePath);
3186
+ const instance = this._getInstance(basePath);
3187
+ await INIT_ALIAS_FN(this);
3155
3188
  return instance.check(filePath);
3156
3189
  };
3157
3190
  }
@@ -3177,7 +3210,7 @@ const LOAD_CONFIG_CONFIG_FN = async (fileName, self) => {
3177
3210
  for (const { filePath, baseDir } of GET_CONFIG_VARIANTS_FN(fileName, self)) {
3178
3211
  try {
3179
3212
  if (await self.loaderService.check(filePath, baseDir)) {
3180
- return self.loaderService.import(filePath, baseDir);
3213
+ return await self.loaderService.import(filePath, baseDir);
3181
3214
  }
3182
3215
  }
3183
3216
  catch {
@@ -3368,7 +3401,7 @@ const main$h = async () => {
3368
3401
  if (MODES.some((mode) => values[mode])) {
3369
3402
  return;
3370
3403
  }
3371
- process.stdout.write(`@backtest-kit/cli ${"13.4.0"}\n`);
3404
+ process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n`);
3372
3405
  process.stdout.write("\n");
3373
3406
  process.stdout.write(`Run with --help to see available commands.\n`);
3374
3407
  process.stdout.write("\n");
@@ -4674,7 +4707,7 @@ const main$1 = async () => {
4674
4707
  if (!values.help) {
4675
4708
  return;
4676
4709
  }
4677
- process.stdout.write(`@backtest-kit/cli ${"13.4.0"}\n\n`);
4710
+ process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n\n`);
4678
4711
  process.stdout.write(HELP_TEXT);
4679
4712
  process.exit(0);
4680
4713
  };
@@ -4688,7 +4721,7 @@ const main = async () => {
4688
4721
  if (!values.version) {
4689
4722
  return;
4690
4723
  }
4691
- process.stdout.write(`@backtest-kit/cli ${"13.4.0"}\n`);
4724
+ process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n`);
4692
4725
  process.exit(0);
4693
4726
  };
4694
4727
  main();
@@ -15,17 +15,17 @@
15
15
  "@types/node": "25.6.0"
16
16
  },
17
17
  "dependencies": {
18
- "@backtest-kit/cli": "13.4.0",
19
- "@backtest-kit/graph": "13.4.0",
20
- "@backtest-kit/pinets": "13.4.0",
21
- "@backtest-kit/signals": "13.4.0",
22
- "@backtest-kit/ui": "13.4.0",
18
+ "@backtest-kit/cli": "13.5.0",
19
+ "@backtest-kit/graph": "13.5.0",
20
+ "@backtest-kit/pinets": "13.5.0",
21
+ "@backtest-kit/signals": "13.5.0",
22
+ "@backtest-kit/ui": "13.5.0",
23
23
  "@tavily/core": "0.7.2",
24
24
  "@tensorflow/tfjs": "4.22.0",
25
25
  "@tensorflow/tfjs-backend-wasm": "4.22.0",
26
26
  "@tensorflow/tfjs-core": "4.22.0",
27
27
  "agent-swarm-kit": "2.7.0",
28
- "backtest-kit": "13.4.0",
28
+ "backtest-kit": "13.5.0",
29
29
  "dayjs": "1.11.20",
30
30
  "functools-kit": "2.3.0",
31
31
  "garch": "1.2.3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backtest-kit/cli",
3
- "version": "13.4.0",
3
+ "version": "13.5.0",
4
4
  "description": "Zero-boilerplate CLI runner for backtest-kit strategies. Run backtests, paper trading, and live bots with candle cache warming, web dashboard, and Telegram notifications — no setup code required.",
5
5
  "author": {
6
6
  "name": "Petr Tripolsky",
@@ -63,11 +63,11 @@
63
63
  "devDependencies": {
64
64
  "@babel/plugin-transform-modules-umd": "7.27.1",
65
65
  "@babel/standalone": "7.29.1",
66
- "@backtest-kit/graph": "13.4.0",
67
- "@backtest-kit/ollama": "13.4.0",
68
- "@backtest-kit/pinets": "13.4.0",
69
- "@backtest-kit/signals": "13.4.0",
70
- "@backtest-kit/ui": "13.4.0",
66
+ "@backtest-kit/graph": "13.5.0",
67
+ "@backtest-kit/ollama": "13.5.0",
68
+ "@backtest-kit/pinets": "13.5.0",
69
+ "@backtest-kit/signals": "13.5.0",
70
+ "@backtest-kit/ui": "13.5.0",
71
71
  "@rollup/plugin-replace": "6.0.3",
72
72
  "@rollup/plugin-typescript": "11.1.6",
73
73
  "@types/image-size": "0.7.0",
@@ -75,7 +75,7 @@
75
75
  "@types/mustache": "4.2.6",
76
76
  "@types/node": "22.9.0",
77
77
  "@types/stack-trace": "0.0.33",
78
- "backtest-kit": "13.4.0",
78
+ "backtest-kit": "13.5.0",
79
79
  "glob": "11.0.1",
80
80
  "markdown-it": "14.1.1",
81
81
  "rimraf": "6.0.1",
@@ -85,22 +85,25 @@
85
85
  "ts-morph": "27.0.2",
86
86
  "tslib": "2.7.0",
87
87
  "typedoc": "0.27.9",
88
+ "pinets": "0.9.22",
89
+ "ccxt": "4.5.39",
88
90
  "worker-testbed": "2.0.0"
89
91
  },
90
92
  "peerDependencies": {
91
93
  "@babel/plugin-transform-modules-umd": "^7.27.1",
92
94
  "@babel/standalone": "^7.29.1",
93
- "@backtest-kit/graph": "^13.4.0",
94
- "@backtest-kit/ollama": "^13.4.0",
95
- "@backtest-kit/pinets": "^13.4.0",
96
- "@backtest-kit/signals": "^13.4.0",
97
- "@backtest-kit/ui": "^13.4.0",
98
- "backtest-kit": "^13.4.0",
95
+ "@backtest-kit/graph": "^13.5.0",
96
+ "@backtest-kit/ollama": "^13.5.0",
97
+ "@backtest-kit/pinets": "^13.5.0",
98
+ "@backtest-kit/signals": "^13.5.0",
99
+ "@backtest-kit/ui": "^13.5.0",
100
+ "pinets": "^0.9.22",
101
+ "ccxt": "^4.5.39",
102
+ "backtest-kit": "^13.5.0",
99
103
  "markdown-it": "^14.1.1",
100
104
  "typescript": "^5.0.0"
101
105
  },
102
106
  "dependencies": {
103
- "ccxt": "4.5.39",
104
107
  "di-kit": "1.1.1",
105
108
  "di-scoped": "1.0.21",
106
109
  "dotenv": "17.3.1",
@@ -13,12 +13,12 @@
13
13
  "license": "ISC",
14
14
  "type": "commonjs",
15
15
  "dependencies": {
16
- "@backtest-kit/cli": "^13.4.0",
17
- "@backtest-kit/graph": "^13.4.0",
18
- "@backtest-kit/pinets": "^13.4.0",
19
- "@backtest-kit/ui": "^13.4.0",
16
+ "@backtest-kit/cli": "^13.5.0",
17
+ "@backtest-kit/graph": "^13.5.0",
18
+ "@backtest-kit/pinets": "^13.5.0",
19
+ "@backtest-kit/ui": "^13.5.0",
20
20
  "agent-swarm-kit": "^2.7.0",
21
- "backtest-kit": "^13.4.0",
21
+ "backtest-kit": "^13.5.0",
22
22
  "functools-kit": "^2.3.0",
23
23
  "garch": "^1.2.3",
24
24
  "get-moment-stamp": "^2.0.0",
package/types.d.ts CHANGED
@@ -206,8 +206,8 @@ declare class LoaderService {
206
206
  readonly babelService: BabelService;
207
207
  readonly loggerService: LoggerService;
208
208
  readonly resolveService: ResolveService;
209
- getInstance: ((basePath: string) => ClientLoader) & functools_kit.IClearableMemoize<string> & functools_kit.IControlMemoize<string, ClientLoader>;
210
- import: (filePath: string, basePath?: string) => any;
209
+ _getInstance: ((basePath: string) => ClientLoader) & functools_kit.IClearableMemoize<string> & functools_kit.IControlMemoize<string, ClientLoader>;
210
+ import: (filePath: string, basePath?: string) => Promise<any>;
211
211
  check: (filePath: string, basePath?: string) => Promise<boolean>;
212
212
  }
213
213