@backtest-kit/ui 9.6.0 → 9.7.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.
Files changed (37) hide show
  1. package/README.md +254 -254
  2. package/build/index.cjs +243 -170
  3. package/build/index.mjs +122 -67
  4. package/build/modules/frontend/build/3rdparty/ace_1.4.12/ace.js +21337 -21337
  5. package/build/modules/frontend/build/3rdparty/ace_1.4.12/mode-javascript.js +797 -797
  6. package/build/modules/frontend/build/3rdparty/ace_1.4.12/theme-chrome.js +137 -137
  7. package/build/modules/frontend/build/3rdparty/ace_1.4.12/theme-twilight.js +115 -115
  8. package/build/modules/frontend/build/3rdparty/ace_1.4.12/worker-javascript.js +15012 -15012
  9. package/build/modules/frontend/build/3rdparty/qfchart_0.8.7/echarts.min.js +45 -45
  10. package/build/modules/frontend/build/assets/{Article-CPvMAlis.js → Article-CSLbW4S3.js} +1 -1
  11. package/build/modules/frontend/build/assets/{Background-BcBJxoQM.js → Background-D7AbUVrH.js} +1 -1
  12. package/build/modules/frontend/build/assets/{IconPhoto-C_ikll5b.js → IconPhoto-dJuN2ucb.js} +1 -1
  13. package/build/modules/frontend/build/assets/{KeyboardArrowLeft-wo8yIkQt.js → KeyboardArrowLeft-BC2GbqOB.js} +1 -1
  14. package/build/modules/frontend/build/assets/{PictureAsPdfOutlined-B2Y3DrmN.js → PictureAsPdfOutlined-BkS0a0A0.js} +1 -1
  15. package/build/modules/frontend/build/assets/{Refresh-DWwANC2C.js → Refresh-GywkMeC9.js} +1 -1
  16. package/build/modules/frontend/build/assets/emitters-D2HKeJSt.js +1 -0
  17. package/build/modules/frontend/build/assets/{hasRouteMatch-DxP9EIea.js → hasRouteMatch-DaOdXEtJ.js} +1 -1
  18. package/build/modules/frontend/build/assets/{html2canvas-BEYpPxnI.js → html2canvas-D40IxDXU.js} +1 -1
  19. package/build/modules/frontend/build/assets/{index-Csk3lyh_.js → index-BDWtjw8t.js} +1 -1
  20. package/build/modules/frontend/build/assets/{index-U9wO0mPn.js → index-BjNxXXRd.js} +1 -1
  21. package/build/modules/frontend/build/assets/{index-BLgqZVUW.js → index-BoVUr2mk.js} +5 -5
  22. package/build/modules/frontend/build/assets/{index-Ct4kOSwZ.js → index-C7fDq8VY.js} +1 -1
  23. package/build/modules/frontend/build/assets/{index-xcEpTc6J.js → index-CcP46J0C.js} +1 -1
  24. package/build/modules/frontend/build/assets/{index-DYIV_QwZ.js → index-CcnWYHDR.js} +1 -1
  25. package/build/modules/frontend/build/assets/{index-nQBp5LZR.js → index-CePvvRqq.js} +1 -1
  26. package/build/modules/frontend/build/assets/{index-Bd51gA9H.js → index-CknRQapy.js} +1 -1
  27. package/build/modules/frontend/build/assets/{index-C2FRNjrR.js → index-CyN7sutq.js} +1 -1
  28. package/build/modules/frontend/build/assets/{index-5Dtu864w.js → index-D9GOtTmB.js} +1 -1
  29. package/build/modules/frontend/build/assets/{index-BqQhlvLk.js → index-DWnTHxHy.js} +1 -1
  30. package/build/modules/frontend/build/assets/{index-Q1e8Guut.js → index-IkD99_6_.js} +1 -1
  31. package/build/modules/frontend/build/assets/{index-BW6mJqS7.js → index-zihyCAvY.js} +1 -1
  32. package/build/modules/frontend/build/assets/{index.es-FwYn4ntA.js → index.es-ByhwyzTS.js} +1 -1
  33. package/build/modules/frontend/build/assets/{markdownit-DifHDTjI.js → markdownit-DHhYBfkC.js} +1 -1
  34. package/build/modules/frontend/build/index.html +87 -87
  35. package/build/modules/frontend/build/manifest.json +23 -23
  36. package/package.json +118 -118
  37. package/build/modules/frontend/build/assets/emitters-Dr0rm1Id.js +0 -1
package/build/index.mjs CHANGED
@@ -6,6 +6,7 @@ import finalhandler from 'finalhandler';
6
6
  import serveHandler from 'serve-handler';
7
7
  import os from 'os';
8
8
  import { createActivator } from 'di-kit';
9
+ import * as BacktestKit from 'backtest-kit';
9
10
  import { alignToInterval, Exchange, listExchangeSchema, Backtest, Live, Notification, Storage, Log, lib, Heat, Strategy, Breakeven, Risk, Partial, HighestProfit, MaxDrawdown, Schedule, Performance, Sync, Walker, StorageLive, StorageBacktest, Broker, Dump, Markdown, Memory, Recent, Report, State, getConfig } from 'backtest-kit';
10
11
  import fs, { readdir, readFile } from 'fs/promises';
11
12
  import path, { join, dirname } from 'path';
@@ -13,6 +14,10 @@ import mime from 'mime-types';
13
14
  import { createHash } from 'crypto';
14
15
  import { createRequire } from 'module';
15
16
  import { existsSync } from 'fs';
17
+ import { createRequire as createRequire$1 } from 'node:module';
18
+ import { join as join$1 } from 'node:path';
19
+ import { pathToFileURL } from 'node:url';
20
+ import { createContext, runInContext } from 'vm';
16
21
 
17
22
  const CC_WWWROOT_PATH = process.env.CC_WWWROOT_PATH || "";
18
23
  const CC_WWWROOT_HOST = process.env.CC_WWWROOT_HOST || "0.0.0.0";
@@ -23,10 +28,10 @@ const CC_ENABLE_MOCK = !!parseInt(process.env.CC_ENABLE_MOCK) || false;
23
28
 
24
29
  const serveSubject = new BehaviorSubject();
25
30
 
26
- const router$b = Router({
31
+ const router$c = Router({
27
32
  params: true,
28
33
  });
29
- router$b.get("/api/v1/health/health_check", async (req, res) => {
34
+ router$c.get("/api/v1/health/health_check", async (req, res) => {
30
35
  const [cpuLoad] = os.loadavg();
31
36
  return await micro.send(res, 200, {
32
37
  uptime: process.uptime(),
@@ -2116,11 +2121,11 @@ const ioc = {
2116
2121
  };
2117
2122
  init();
2118
2123
 
2119
- const router$a = Router({
2124
+ const router$b = Router({
2120
2125
  params: true,
2121
2126
  });
2122
2127
  // SetupMockService endpoints
2123
- router$a.post("/api/v1/mock/setup_data", async (req, res) => {
2128
+ router$b.post("/api/v1/mock/setup_data", async (req, res) => {
2124
2129
  try {
2125
2130
  const request = await micro.json(req);
2126
2131
  const { requestId, serviceName } = request;
@@ -2149,7 +2154,7 @@ router$a.post("/api/v1/mock/setup_data", async (req, res) => {
2149
2154
  }
2150
2155
  });
2151
2156
  // ExchangeMockService endpoints
2152
- router$a.post("/api/v1/mock/candles_signal", async (req, res) => {
2157
+ router$b.post("/api/v1/mock/candles_signal", async (req, res) => {
2153
2158
  try {
2154
2159
  const request = await micro.json(req);
2155
2160
  const { signalId, interval, requestId, serviceName } = request;
@@ -2177,7 +2182,7 @@ router$a.post("/api/v1/mock/candles_signal", async (req, res) => {
2177
2182
  });
2178
2183
  }
2179
2184
  });
2180
- router$a.post("/api/v1/mock/candles_point", async (req, res) => {
2185
+ router$b.post("/api/v1/mock/candles_point", async (req, res) => {
2181
2186
  try {
2182
2187
  const request = await micro.json(req);
2183
2188
  const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
@@ -2210,7 +2215,7 @@ router$a.post("/api/v1/mock/candles_point", async (req, res) => {
2210
2215
  });
2211
2216
  }
2212
2217
  });
2213
- router$a.post("/api/v1/mock/candles_range", async (req, res) => {
2218
+ router$b.post("/api/v1/mock/candles_range", async (req, res) => {
2214
2219
  try {
2215
2220
  const request = await micro.json(req);
2216
2221
  const { symbol, interval, limit, sDate, eDate, requestId, serviceName } = request;
@@ -2245,7 +2250,7 @@ router$a.post("/api/v1/mock/candles_range", async (req, res) => {
2245
2250
  }
2246
2251
  });
2247
2252
  // NotificationMockService endpoints
2248
- router$a.post("/api/v1/mock/notification_list", async (req, res) => {
2253
+ router$b.post("/api/v1/mock/notification_list", async (req, res) => {
2249
2254
  try {
2250
2255
  const request = await micro.json(req);
2251
2256
  const { requestId, serviceName } = request;
@@ -2273,7 +2278,7 @@ router$a.post("/api/v1/mock/notification_list", async (req, res) => {
2273
2278
  });
2274
2279
  }
2275
2280
  });
2276
- router$a.post("/api/v1/mock/notification_one/:id", async (req, res) => {
2281
+ router$b.post("/api/v1/mock/notification_one/:id", async (req, res) => {
2277
2282
  try {
2278
2283
  const request = await micro.json(req);
2279
2284
  const { requestId, serviceName } = request;
@@ -2302,7 +2307,7 @@ router$a.post("/api/v1/mock/notification_one/:id", async (req, res) => {
2302
2307
  });
2303
2308
  }
2304
2309
  });
2305
- router$a.post("/api/v1/mock/notification_filter", async (req, res) => {
2310
+ router$b.post("/api/v1/mock/notification_filter", async (req, res) => {
2306
2311
  try {
2307
2312
  const request = await micro.json(req);
2308
2313
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -2331,7 +2336,7 @@ router$a.post("/api/v1/mock/notification_filter", async (req, res) => {
2331
2336
  }
2332
2337
  });
2333
2338
  // StorageMockService endpoints
2334
- router$a.post("/api/v1/mock/storage_one/:id", async (req, res) => {
2339
+ router$b.post("/api/v1/mock/storage_one/:id", async (req, res) => {
2335
2340
  try {
2336
2341
  const request = await micro.json(req);
2337
2342
  const { requestId, serviceName } = request;
@@ -2360,7 +2365,7 @@ router$a.post("/api/v1/mock/storage_one/:id", async (req, res) => {
2360
2365
  });
2361
2366
  }
2362
2367
  });
2363
- router$a.post("/api/v1/mock/storage_list/live", async (req, res) => {
2368
+ router$b.post("/api/v1/mock/storage_list/live", async (req, res) => {
2364
2369
  try {
2365
2370
  const request = await micro.json(req);
2366
2371
  const { requestId, serviceName } = request;
@@ -2388,7 +2393,7 @@ router$a.post("/api/v1/mock/storage_list/live", async (req, res) => {
2388
2393
  });
2389
2394
  }
2390
2395
  });
2391
- router$a.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
2396
+ router$b.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
2392
2397
  try {
2393
2398
  const request = await micro.json(req);
2394
2399
  const { requestId, serviceName } = request;
@@ -2417,7 +2422,7 @@ router$a.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
2417
2422
  }
2418
2423
  });
2419
2424
  // LogMockService endpoints
2420
- router$a.post("/api/v1/mock/log_list", async (req, res) => {
2425
+ router$b.post("/api/v1/mock/log_list", async (req, res) => {
2421
2426
  try {
2422
2427
  const request = await micro.json(req);
2423
2428
  const { requestId, serviceName } = request;
@@ -2445,7 +2450,7 @@ router$a.post("/api/v1/mock/log_list", async (req, res) => {
2445
2450
  });
2446
2451
  }
2447
2452
  });
2448
- router$a.post("/api/v1/mock/log_one/:id", async (req, res) => {
2453
+ router$b.post("/api/v1/mock/log_one/:id", async (req, res) => {
2449
2454
  try {
2450
2455
  const request = await micro.json(req);
2451
2456
  const { requestId, serviceName } = request;
@@ -2474,7 +2479,7 @@ router$a.post("/api/v1/mock/log_one/:id", async (req, res) => {
2474
2479
  });
2475
2480
  }
2476
2481
  });
2477
- router$a.post("/api/v1/mock/log_filter", async (req, res) => {
2482
+ router$b.post("/api/v1/mock/log_filter", async (req, res) => {
2478
2483
  try {
2479
2484
  const request = await micro.json(req);
2480
2485
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -2502,7 +2507,7 @@ router$a.post("/api/v1/mock/log_filter", async (req, res) => {
2502
2507
  });
2503
2508
  }
2504
2509
  });
2505
- router$a.post("/api/v1/mock/candles_live", async (req, res) => {
2510
+ router$b.post("/api/v1/mock/candles_live", async (req, res) => {
2506
2511
  try {
2507
2512
  const request = await micro.json(req);
2508
2513
  const { signalId, interval, requestId, serviceName } = request;
@@ -2530,7 +2535,7 @@ router$a.post("/api/v1/mock/candles_live", async (req, res) => {
2530
2535
  });
2531
2536
  }
2532
2537
  });
2533
- router$a.post("/api/v1/mock/candles_last", async (req, res) => {
2538
+ router$b.post("/api/v1/mock/candles_last", async (req, res) => {
2534
2539
  try {
2535
2540
  const request = await micro.json(req);
2536
2541
  const { symbol, interval, requestId, serviceName } = request;
@@ -2559,7 +2564,7 @@ router$a.post("/api/v1/mock/candles_last", async (req, res) => {
2559
2564
  }
2560
2565
  });
2561
2566
  // SignalMockService endpoints
2562
- router$a.post("/api/v1/mock/signal_last_update/:id", async (req, res) => {
2567
+ router$b.post("/api/v1/mock/signal_last_update/:id", async (req, res) => {
2563
2568
  try {
2564
2569
  const request = await micro.json(req);
2565
2570
  const { requestId, serviceName } = request;
@@ -2588,7 +2593,7 @@ router$a.post("/api/v1/mock/signal_last_update/:id", async (req, res) => {
2588
2593
  });
2589
2594
  }
2590
2595
  });
2591
- router$a.post("/api/v1/mock/signal_pending", async (req, res) => {
2596
+ router$b.post("/api/v1/mock/signal_pending", async (req, res) => {
2592
2597
  try {
2593
2598
  const request = await micro.json(req);
2594
2599
  const { symbol, requestId, serviceName } = request;
@@ -2617,7 +2622,7 @@ router$a.post("/api/v1/mock/signal_pending", async (req, res) => {
2617
2622
  }
2618
2623
  });
2619
2624
  // StatusMockService endpoints
2620
- router$a.post("/api/v1/mock/status_list", async (req, res) => {
2625
+ router$b.post("/api/v1/mock/status_list", async (req, res) => {
2621
2626
  try {
2622
2627
  const request = await micro.json(req);
2623
2628
  const { requestId, serviceName } = request;
@@ -2645,7 +2650,7 @@ router$a.post("/api/v1/mock/status_list", async (req, res) => {
2645
2650
  });
2646
2651
  }
2647
2652
  });
2648
- router$a.post("/api/v1/mock/status_one/:id", async (req, res) => {
2653
+ router$b.post("/api/v1/mock/status_one/:id", async (req, res) => {
2649
2654
  try {
2650
2655
  const request = await micro.json(req);
2651
2656
  const { requestId, serviceName } = request;
@@ -2675,7 +2680,7 @@ router$a.post("/api/v1/mock/status_one/:id", async (req, res) => {
2675
2680
  }
2676
2681
  });
2677
2682
  // HeatMockService endpoints
2678
- router$a.post("/api/v1/mock/heat_data", async (req, res) => {
2683
+ router$b.post("/api/v1/mock/heat_data", async (req, res) => {
2679
2684
  try {
2680
2685
  const request = await micro.json(req);
2681
2686
  const { requestId, serviceName } = request;
@@ -2703,7 +2708,7 @@ router$a.post("/api/v1/mock/heat_data", async (req, res) => {
2703
2708
  });
2704
2709
  }
2705
2710
  });
2706
- router$a.post("/api/v1/mock/heat_report", async (req, res) => {
2711
+ router$b.post("/api/v1/mock/heat_report", async (req, res) => {
2707
2712
  try {
2708
2713
  const request = await micro.json(req);
2709
2714
  const { requestId, serviceName } = request;
@@ -2731,7 +2736,7 @@ router$a.post("/api/v1/mock/heat_report", async (req, res) => {
2731
2736
  });
2732
2737
  }
2733
2738
  });
2734
- router$a.post("/api/v1/mock/status_info", async (req, res) => {
2739
+ router$b.post("/api/v1/mock/status_info", async (req, res) => {
2735
2740
  try {
2736
2741
  const request = await micro.json(req);
2737
2742
  const { requestId, serviceName } = request;
@@ -2760,7 +2765,7 @@ router$a.post("/api/v1/mock/status_info", async (req, res) => {
2760
2765
  }
2761
2766
  });
2762
2767
  // PerformanceMockService endpoints
2763
- router$a.post("/api/v1/mock/performance_data", async (req, res) => {
2768
+ router$b.post("/api/v1/mock/performance_data", async (req, res) => {
2764
2769
  try {
2765
2770
  const request = await micro.json(req);
2766
2771
  const { requestId, serviceName } = request;
@@ -2788,7 +2793,7 @@ router$a.post("/api/v1/mock/performance_data", async (req, res) => {
2788
2793
  });
2789
2794
  }
2790
2795
  });
2791
- router$a.post("/api/v1/mock/performance_report", async (req, res) => {
2796
+ router$b.post("/api/v1/mock/performance_report", async (req, res) => {
2792
2797
  try {
2793
2798
  const request = await micro.json(req);
2794
2799
  const { requestId, serviceName } = request;
@@ -2817,7 +2822,7 @@ router$a.post("/api/v1/mock/performance_report", async (req, res) => {
2817
2822
  }
2818
2823
  });
2819
2824
  // EnvironmentMockService endpoints
2820
- router$a.post("/api/v1/mock/environment_data", async (req, res) => {
2825
+ router$b.post("/api/v1/mock/environment_data", async (req, res) => {
2821
2826
  try {
2822
2827
  const request = await micro.json(req);
2823
2828
  const { requestId, serviceName } = request;
@@ -2846,11 +2851,11 @@ router$a.post("/api/v1/mock/environment_data", async (req, res) => {
2846
2851
  }
2847
2852
  });
2848
2853
 
2849
- const router$9 = Router({
2854
+ const router$a = Router({
2850
2855
  params: true,
2851
2856
  });
2852
2857
  // SetupViewService endpoints
2853
- router$9.post("/api/v1/view/setup_data", async (req, res) => {
2858
+ router$a.post("/api/v1/view/setup_data", async (req, res) => {
2854
2859
  try {
2855
2860
  const request = await micro.json(req);
2856
2861
  const { requestId, serviceName } = request;
@@ -2879,7 +2884,7 @@ router$9.post("/api/v1/view/setup_data", async (req, res) => {
2879
2884
  }
2880
2885
  });
2881
2886
  // ExchangeViewService endpoints
2882
- router$9.post("/api/v1/view/candles_signal", async (req, res) => {
2887
+ router$a.post("/api/v1/view/candles_signal", async (req, res) => {
2883
2888
  try {
2884
2889
  const request = await micro.json(req);
2885
2890
  const { signalId, interval, requestId, serviceName } = request;
@@ -2907,7 +2912,7 @@ router$9.post("/api/v1/view/candles_signal", async (req, res) => {
2907
2912
  });
2908
2913
  }
2909
2914
  });
2910
- router$9.post("/api/v1/view/candles_point", async (req, res) => {
2915
+ router$a.post("/api/v1/view/candles_point", async (req, res) => {
2911
2916
  try {
2912
2917
  const request = await micro.json(req);
2913
2918
  const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
@@ -2940,7 +2945,7 @@ router$9.post("/api/v1/view/candles_point", async (req, res) => {
2940
2945
  });
2941
2946
  }
2942
2947
  });
2943
- router$9.post("/api/v1/view/candles_range", async (req, res) => {
2948
+ router$a.post("/api/v1/view/candles_range", async (req, res) => {
2944
2949
  try {
2945
2950
  const request = await micro.json(req);
2946
2951
  const { symbol, interval, limit, sDate, eDate, requestId, serviceName } = request;
@@ -2974,7 +2979,7 @@ router$9.post("/api/v1/view/candles_range", async (req, res) => {
2974
2979
  });
2975
2980
  }
2976
2981
  });
2977
- router$9.post("/api/v1/view/candles_live", async (req, res) => {
2982
+ router$a.post("/api/v1/view/candles_live", async (req, res) => {
2978
2983
  try {
2979
2984
  const request = await micro.json(req);
2980
2985
  const { signalId, interval, requestId, serviceName } = request;
@@ -3002,7 +3007,7 @@ router$9.post("/api/v1/view/candles_live", async (req, res) => {
3002
3007
  });
3003
3008
  }
3004
3009
  });
3005
- router$9.post("/api/v1/view/candles_last", async (req, res) => {
3010
+ router$a.post("/api/v1/view/candles_last", async (req, res) => {
3006
3011
  try {
3007
3012
  const request = await micro.json(req);
3008
3013
  const { symbol, interval, requestId, serviceName } = request;
@@ -3031,7 +3036,7 @@ router$9.post("/api/v1/view/candles_last", async (req, res) => {
3031
3036
  }
3032
3037
  });
3033
3038
  // NotificationViewService endpoints
3034
- router$9.post("/api/v1/view/notification_list", async (req, res) => {
3039
+ router$a.post("/api/v1/view/notification_list", async (req, res) => {
3035
3040
  try {
3036
3041
  const request = await micro.json(req);
3037
3042
  const { requestId, serviceName } = request;
@@ -3059,7 +3064,7 @@ router$9.post("/api/v1/view/notification_list", async (req, res) => {
3059
3064
  });
3060
3065
  }
3061
3066
  });
3062
- router$9.post("/api/v1/view/notification_one/:id", async (req, res) => {
3067
+ router$a.post("/api/v1/view/notification_one/:id", async (req, res) => {
3063
3068
  try {
3064
3069
  const request = await micro.json(req);
3065
3070
  const { requestId, serviceName } = request;
@@ -3088,7 +3093,7 @@ router$9.post("/api/v1/view/notification_one/:id", async (req, res) => {
3088
3093
  });
3089
3094
  }
3090
3095
  });
3091
- router$9.post("/api/v1/view/notification_filter", async (req, res) => {
3096
+ router$a.post("/api/v1/view/notification_filter", async (req, res) => {
3092
3097
  try {
3093
3098
  const request = await micro.json(req);
3094
3099
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -3117,7 +3122,7 @@ router$9.post("/api/v1/view/notification_filter", async (req, res) => {
3117
3122
  }
3118
3123
  });
3119
3124
  // StorageViewService endpoints
3120
- router$9.post("/api/v1/view/storage_one/:id", async (req, res) => {
3125
+ router$a.post("/api/v1/view/storage_one/:id", async (req, res) => {
3121
3126
  try {
3122
3127
  const request = await micro.json(req);
3123
3128
  const { requestId, serviceName } = request;
@@ -3146,7 +3151,7 @@ router$9.post("/api/v1/view/storage_one/:id", async (req, res) => {
3146
3151
  });
3147
3152
  }
3148
3153
  });
3149
- router$9.post("/api/v1/view/storage_list/live", async (req, res) => {
3154
+ router$a.post("/api/v1/view/storage_list/live", async (req, res) => {
3150
3155
  try {
3151
3156
  const request = await micro.json(req);
3152
3157
  const { requestId, serviceName } = request;
@@ -3174,7 +3179,7 @@ router$9.post("/api/v1/view/storage_list/live", async (req, res) => {
3174
3179
  });
3175
3180
  }
3176
3181
  });
3177
- router$9.post("/api/v1/view/storage_list/backtest", async (req, res) => {
3182
+ router$a.post("/api/v1/view/storage_list/backtest", async (req, res) => {
3178
3183
  try {
3179
3184
  const request = await micro.json(req);
3180
3185
  const { requestId, serviceName } = request;
@@ -3203,7 +3208,7 @@ router$9.post("/api/v1/view/storage_list/backtest", async (req, res) => {
3203
3208
  }
3204
3209
  });
3205
3210
  // LogViewService endpoints
3206
- router$9.post("/api/v1/view/log_list", async (req, res) => {
3211
+ router$a.post("/api/v1/view/log_list", async (req, res) => {
3207
3212
  try {
3208
3213
  const request = await micro.json(req);
3209
3214
  const { requestId, serviceName } = request;
@@ -3231,7 +3236,7 @@ router$9.post("/api/v1/view/log_list", async (req, res) => {
3231
3236
  });
3232
3237
  }
3233
3238
  });
3234
- router$9.post("/api/v1/view/log_one/:id", async (req, res) => {
3239
+ router$a.post("/api/v1/view/log_one/:id", async (req, res) => {
3235
3240
  try {
3236
3241
  const request = await micro.json(req);
3237
3242
  const { requestId, serviceName } = request;
@@ -3260,7 +3265,7 @@ router$9.post("/api/v1/view/log_one/:id", async (req, res) => {
3260
3265
  });
3261
3266
  }
3262
3267
  });
3263
- router$9.post("/api/v1/view/log_filter", async (req, res) => {
3268
+ router$a.post("/api/v1/view/log_filter", async (req, res) => {
3264
3269
  try {
3265
3270
  const request = await micro.json(req);
3266
3271
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -3289,7 +3294,7 @@ router$9.post("/api/v1/view/log_filter", async (req, res) => {
3289
3294
  }
3290
3295
  });
3291
3296
  // SignalViewService endpoints
3292
- router$9.post("/api/v1/view/signal_last_update/:id", async (req, res) => {
3297
+ router$a.post("/api/v1/view/signal_last_update/:id", async (req, res) => {
3293
3298
  try {
3294
3299
  const request = await micro.json(req);
3295
3300
  const { requestId, serviceName } = request;
@@ -3318,7 +3323,7 @@ router$9.post("/api/v1/view/signal_last_update/:id", async (req, res) => {
3318
3323
  });
3319
3324
  }
3320
3325
  });
3321
- router$9.post("/api/v1/view/signal_pending", async (req, res) => {
3326
+ router$a.post("/api/v1/view/signal_pending", async (req, res) => {
3322
3327
  try {
3323
3328
  const request = await micro.json(req);
3324
3329
  const { symbol, requestId, serviceName } = request;
@@ -3347,7 +3352,7 @@ router$9.post("/api/v1/view/signal_pending", async (req, res) => {
3347
3352
  }
3348
3353
  });
3349
3354
  // StatusViewService endpoints
3350
- router$9.post("/api/v1/view/status_list", async (req, res) => {
3355
+ router$a.post("/api/v1/view/status_list", async (req, res) => {
3351
3356
  try {
3352
3357
  const request = await micro.json(req);
3353
3358
  const { requestId, serviceName } = request;
@@ -3375,7 +3380,7 @@ router$9.post("/api/v1/view/status_list", async (req, res) => {
3375
3380
  });
3376
3381
  }
3377
3382
  });
3378
- router$9.post("/api/v1/view/status_one/:id", async (req, res) => {
3383
+ router$a.post("/api/v1/view/status_one/:id", async (req, res) => {
3379
3384
  try {
3380
3385
  const request = await micro.json(req);
3381
3386
  const { requestId, serviceName } = request;
@@ -3405,7 +3410,7 @@ router$9.post("/api/v1/view/status_one/:id", async (req, res) => {
3405
3410
  }
3406
3411
  });
3407
3412
  // HeatViewService endpoints
3408
- router$9.post("/api/v1/view/heat_data", async (req, res) => {
3413
+ router$a.post("/api/v1/view/heat_data", async (req, res) => {
3409
3414
  try {
3410
3415
  const request = await micro.json(req);
3411
3416
  const { requestId, serviceName } = request;
@@ -3433,7 +3438,7 @@ router$9.post("/api/v1/view/heat_data", async (req, res) => {
3433
3438
  });
3434
3439
  }
3435
3440
  });
3436
- router$9.post("/api/v1/view/heat_report", async (req, res) => {
3441
+ router$a.post("/api/v1/view/heat_report", async (req, res) => {
3437
3442
  try {
3438
3443
  const request = await micro.json(req);
3439
3444
  const { requestId, serviceName } = request;
@@ -3461,7 +3466,7 @@ router$9.post("/api/v1/view/heat_report", async (req, res) => {
3461
3466
  });
3462
3467
  }
3463
3468
  });
3464
- router$9.post("/api/v1/view/status_info", async (req, res) => {
3469
+ router$a.post("/api/v1/view/status_info", async (req, res) => {
3465
3470
  try {
3466
3471
  const request = await micro.json(req);
3467
3472
  const { requestId, serviceName } = request;
@@ -3490,7 +3495,7 @@ router$9.post("/api/v1/view/status_info", async (req, res) => {
3490
3495
  }
3491
3496
  });
3492
3497
  // PerformanceViewService endpoints
3493
- router$9.post("/api/v1/view/performance_data", async (req, res) => {
3498
+ router$a.post("/api/v1/view/performance_data", async (req, res) => {
3494
3499
  try {
3495
3500
  const request = await micro.json(req);
3496
3501
  const { requestId, serviceName } = request;
@@ -3518,7 +3523,7 @@ router$9.post("/api/v1/view/performance_data", async (req, res) => {
3518
3523
  });
3519
3524
  }
3520
3525
  });
3521
- router$9.post("/api/v1/view/performance_report", async (req, res) => {
3526
+ router$a.post("/api/v1/view/performance_report", async (req, res) => {
3522
3527
  try {
3523
3528
  const request = await micro.json(req);
3524
3529
  const { requestId, serviceName } = request;
@@ -3547,7 +3552,7 @@ router$9.post("/api/v1/view/performance_report", async (req, res) => {
3547
3552
  }
3548
3553
  });
3549
3554
  // EnvironmentViewService endpoints
3550
- router$9.post("/api/v1/view/environment_data", async (req, res) => {
3555
+ router$a.post("/api/v1/view/environment_data", async (req, res) => {
3551
3556
  try {
3552
3557
  const request = await micro.json(req);
3553
3558
  const { requestId, serviceName } = request;
@@ -3583,7 +3588,7 @@ function getModulesPath() {
3583
3588
  return join(basePath, "../../../");
3584
3589
  }
3585
3590
 
3586
- const router$8 = Router({
3591
+ const router$9 = Router({
3587
3592
  params: true,
3588
3593
  });
3589
3594
  // getModulesPath
@@ -3600,7 +3605,7 @@ const ASSET_32 = CC_ENABLE_MOCK
3600
3605
  const cache128 = new Map();
3601
3606
  const cache32 = new Map();
3602
3607
  const cacheSvg = new Map();
3603
- router$8.get("/icon/128/:filename", async (req, res) => {
3608
+ router$9.get("/icon/128/:filename", async (req, res) => {
3604
3609
  const filename = req.params.filename;
3605
3610
  // Check cache first
3606
3611
  if (cache128.has(filename)) {
@@ -3616,7 +3621,7 @@ router$8.get("/icon/128/:filename", async (req, res) => {
3616
3621
  }
3617
3622
  return await micro.send(res, 404, "File not found (128)");
3618
3623
  });
3619
- router$8.get("/icon/32/:filename", async (req, res) => {
3624
+ router$9.get("/icon/32/:filename", async (req, res) => {
3620
3625
  const filename = req.params.filename;
3621
3626
  // Check cache first
3622
3627
  if (cache32.has(filename)) {
@@ -3632,7 +3637,7 @@ router$8.get("/icon/32/:filename", async (req, res) => {
3632
3637
  }
3633
3638
  return await micro.send(res, 404, "File not found (32)");
3634
3639
  });
3635
- router$8.get("/icon/svg/:filename", async (req, res) => {
3640
+ router$9.get("/icon/svg/:filename", async (req, res) => {
3636
3641
  const filename = req.params.filename;
3637
3642
  // Check cache first
3638
3643
  if (cacheSvg.has(filename)) {
@@ -3648,7 +3653,7 @@ router$8.get("/icon/svg/:filename", async (req, res) => {
3648
3653
  }
3649
3654
  return await micro.send(res, 404, "File not found (svg)");
3650
3655
  });
3651
- router$8.get("/icon/:filename", async (req, res) => {
3656
+ router$9.get("/icon/:filename", async (req, res) => {
3652
3657
  const filename = req.params.filename;
3653
3658
  // Check cache first
3654
3659
  if (cache32.has(filename)) {
@@ -3665,10 +3670,10 @@ router$8.get("/icon/:filename", async (req, res) => {
3665
3670
  return await micro.send(res, 404, "File not found (root)");
3666
3671
  });
3667
3672
 
3668
- const router$7 = Router({
3673
+ const router$8 = Router({
3669
3674
  params: true,
3670
3675
  });
3671
- router$7.post("/api/v1/dict/symbol/list", async (req, res) => {
3676
+ router$8.post("/api/v1/dict/symbol/list", async (req, res) => {
3672
3677
  try {
3673
3678
  const request = await micro.json(req);
3674
3679
  const { requestId, serviceName } = request;
@@ -3696,7 +3701,7 @@ router$7.post("/api/v1/dict/symbol/list", async (req, res) => {
3696
3701
  });
3697
3702
  }
3698
3703
  });
3699
- router$7.post("/api/v1/dict/symbol/map", async (req, res) => {
3704
+ router$8.post("/api/v1/dict/symbol/map", async (req, res) => {
3700
3705
  try {
3701
3706
  const request = await micro.json(req);
3702
3707
  const { requestId, serviceName } = request;
@@ -3724,7 +3729,7 @@ router$7.post("/api/v1/dict/symbol/map", async (req, res) => {
3724
3729
  });
3725
3730
  }
3726
3731
  });
3727
- router$7.post("/api/v1/dict/symbol/one", async (req, res) => {
3732
+ router$8.post("/api/v1/dict/symbol/one", async (req, res) => {
3728
3733
  try {
3729
3734
  const request = await micro.json(req);
3730
3735
  const { requestId, serviceName, id } = request;
@@ -3753,6 +3758,53 @@ router$7.post("/api/v1/dict/symbol/one", async (req, res) => {
3753
3758
  }
3754
3759
  });
3755
3760
 
3761
+ const makeContext = singleshot(() => {
3762
+ const require = createRequire$1(pathToFileURL(join$1(process.cwd(), "noop.js")));
3763
+ const context = createContext({
3764
+ BacktestKitUi: ioc,
3765
+ BacktestKit,
3766
+ require,
3767
+ console,
3768
+ });
3769
+ return context;
3770
+ });
3771
+ const router$7 = Router({
3772
+ params: true,
3773
+ });
3774
+ router$7.post("/api/v1/repl/eval", async (req, res) => {
3775
+ const request = await micro.json(req);
3776
+ const { requestId, serviceName } = request;
3777
+ try {
3778
+ const context = makeContext();
3779
+ const output = await runInContext(request.data.command, context);
3780
+ const data = isObject(output) ? JSON.stringify(output, null, 2) : output;
3781
+ const result = {
3782
+ data,
3783
+ status: "ok",
3784
+ error: "",
3785
+ requestId,
3786
+ serviceName,
3787
+ };
3788
+ ioc.loggerService.log("/api/v1/repl/eval ok", {
3789
+ request,
3790
+ result,
3791
+ });
3792
+ return await micro.send(res, 200, result);
3793
+ }
3794
+ catch (error) {
3795
+ ioc.loggerService.log("/api/v1/repl/eval error", {
3796
+ request,
3797
+ error: errorData(error),
3798
+ });
3799
+ return await micro.send(res, 200, {
3800
+ status: "error",
3801
+ error: getErrorMessage(error),
3802
+ requestId,
3803
+ serviceName,
3804
+ });
3805
+ }
3806
+ });
3807
+
3756
3808
  const router$6 = Router({
3757
3809
  params: true,
3758
3810
  });
@@ -4624,13 +4676,13 @@ const router = Router({
4624
4676
  params: true,
4625
4677
  });
4626
4678
  router.all("/api/v1/health/*", (req, res) => {
4627
- return router$b(req, res, finalhandler(req, res));
4679
+ return router$c(req, res, finalhandler(req, res));
4628
4680
  });
4629
4681
  router.all("/api/v1/mock/*", (req, res) => {
4630
- return router$a(req, res, finalhandler(req, res));
4682
+ return router$b(req, res, finalhandler(req, res));
4631
4683
  });
4632
4684
  router.all("/api/v1/view/*", (req, res) => {
4633
- return router$9(req, res, finalhandler(req, res));
4685
+ return router$a(req, res, finalhandler(req, res));
4634
4686
  });
4635
4687
  router.all("/api/v1/markdown_mock/*", (req, res) => {
4636
4688
  return router$6(req, res, finalhandler(req, res));
@@ -4645,9 +4697,12 @@ router.all("/api/v1/explorer_view/*", (req, res) => {
4645
4697
  return router$3(req, res, finalhandler(req, res));
4646
4698
  });
4647
4699
  router.all("/icon/*", (req, res) => {
4648
- return router$8(req, res, finalhandler(req, res));
4700
+ return router$9(req, res, finalhandler(req, res));
4649
4701
  });
4650
4702
  router.all("/api/v1/dict/*", (req, res) => {
4703
+ return router$8(req, res, finalhandler(req, res));
4704
+ });
4705
+ router.all("/api/v1/repl/*", (req, res) => {
4651
4706
  return router$7(req, res, finalhandler(req, res));
4652
4707
  });
4653
4708
  router.all("/api/v1/global/*", (req, res) => {