@backtest-kit/ui 5.6.2 → 5.9.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 (70) hide show
  1. package/build/index.cjs +1036 -134
  2. package/build/index.mjs +1037 -135
  3. package/build/modules/frontend/build/3rdparty/ace_1.4.12/ace.js +21338 -0
  4. package/build/modules/frontend/build/3rdparty/ace_1.4.12/mode-javascript.js +798 -0
  5. package/build/modules/frontend/build/3rdparty/ace_1.4.12/theme-chrome.js +138 -0
  6. package/build/modules/frontend/build/3rdparty/ace_1.4.12/theme-twilight.js +116 -0
  7. package/build/modules/frontend/build/3rdparty/ace_1.4.12/worker-javascript.js +15012 -0
  8. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-100.woff +0 -0
  9. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-100.woff2 +0 -0
  10. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-100italic.woff +0 -0
  11. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-100italic.woff2 +0 -0
  12. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-300.woff +0 -0
  13. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-300.woff2 +0 -0
  14. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-300italic.woff +0 -0
  15. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-300italic.woff2 +0 -0
  16. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-400.woff +0 -0
  17. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-400.woff2 +0 -0
  18. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-400italic.woff +0 -0
  19. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-400italic.woff2 +0 -0
  20. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-500.woff +0 -0
  21. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-500.woff2 +0 -0
  22. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-500italic.woff +0 -0
  23. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-500italic.woff2 +0 -0
  24. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-700.woff +0 -0
  25. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-700.woff2 +0 -0
  26. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-700italic.woff +0 -0
  27. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-700italic.woff2 +0 -0
  28. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-900.woff +0 -0
  29. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-900.woff2 +0 -0
  30. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-900italic.woff +0 -0
  31. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/files/roboto-latin-900italic.woff2 +0 -0
  32. package/build/modules/frontend/build/3rdparty/typeface-roboto_0.0.75/typeface-roboto.css +156 -0
  33. package/build/modules/frontend/build/assets/Article-DwCWbgig.js +1 -0
  34. package/build/modules/frontend/build/assets/{Background-B8kVLoJC.js → Background-BUWczIMa.js} +1 -1
  35. package/build/modules/frontend/build/assets/Container-DgcBaXwp.js +1 -0
  36. package/build/modules/frontend/build/assets/IconPhoto-Dg1OJT1g.js +1 -0
  37. package/build/modules/frontend/build/assets/{KeyboardArrowLeft-NcptneCW.js → KeyboardArrowLeft-DqH7VCRG.js} +1 -1
  38. package/build/modules/frontend/build/assets/Refresh-ASwi3YWH.js +1 -0
  39. package/build/modules/frontend/build/assets/emitters-EUI31qkt.js +1 -0
  40. package/build/modules/frontend/build/assets/hasRouteMatch-B_-PodjM.js +1 -0
  41. package/build/modules/frontend/build/assets/html2canvas-D67h2MXz.js +1 -0
  42. package/build/modules/frontend/build/assets/index-BXhzoqHB.js +17 -0
  43. package/build/modules/frontend/build/assets/index-BbMctGny.js +1 -0
  44. package/build/modules/frontend/build/assets/index-BjGW-SeZ.js +1560 -0
  45. package/build/modules/frontend/build/assets/index-CGTWcCfJ.js +1 -0
  46. package/build/modules/frontend/build/assets/index-CQbPy5z-.js +1 -0
  47. package/build/modules/frontend/build/assets/index-CYVGtlJR.js +1 -0
  48. package/build/modules/frontend/build/assets/index-CxqvOyvF.js +1 -0
  49. package/build/modules/frontend/build/assets/index-DoQ6TdNT.js +1 -0
  50. package/build/modules/frontend/build/assets/index-Dxunm9la.js +1 -0
  51. package/build/modules/frontend/build/assets/index-lFLkJBoZ.js +1 -0
  52. package/build/modules/frontend/build/assets/index-nAktdNIS.js +1 -0
  53. package/build/modules/frontend/build/assets/{index.es-BkDLGtAB.js → index.es-_Mw9_y9J.js} +2 -2
  54. package/build/modules/frontend/build/assets/markdownit-DnsUyAuX.js +1 -0
  55. package/build/modules/frontend/build/index.html +8 -2
  56. package/package.json +3 -3
  57. package/types.d.ts +80 -1
  58. package/build/modules/frontend/build/assets/IconPhoto-yqTcSjsj.js +0 -1
  59. package/build/modules/frontend/build/assets/Refresh-B-6VzYmL.js +0 -1
  60. package/build/modules/frontend/build/assets/hasRouteMatch-Cap76DHx.js +0 -1
  61. package/build/modules/frontend/build/assets/html2canvas-AeHV6o40.js +0 -1
  62. package/build/modules/frontend/build/assets/index-3FabZvCh.js +0 -1
  63. package/build/modules/frontend/build/assets/index-BSt5rIe0.js +0 -231
  64. package/build/modules/frontend/build/assets/index-BfdHWVzz.js +0 -1331
  65. package/build/modules/frontend/build/assets/index-BjR0gQPx.js +0 -1
  66. package/build/modules/frontend/build/assets/index-Bov2Mvu5.js +0 -1
  67. package/build/modules/frontend/build/assets/index-DTb7GKw2.js +0 -1
  68. package/build/modules/frontend/build/assets/index-eGg7QpVp.js +0 -1
  69. package/build/modules/frontend/build/assets/index-mEY60b54.js +0 -1
  70. package/build/modules/frontend/build/assets/markdownit-_uLqTUbF.js +0 -1
package/build/index.cjs CHANGED
@@ -11,6 +11,8 @@ var diKit = require('di-kit');
11
11
  var backtestKit = require('backtest-kit');
12
12
  var fs = require('fs/promises');
13
13
  var path = require('path');
14
+ var mime = require('mime-types');
15
+ var crypto = require('crypto');
14
16
  var module$1 = require('module');
15
17
  var fs$1 = require('fs');
16
18
 
@@ -20,10 +22,10 @@ const CC_WWWROOT_HOST = process.env.CC_WWWROOT_HOST || "0.0.0.0";
20
22
  const CC_WWWROOT_PORT = parseInt(process.env.CC_WWWROOT_PORT) || 60050;
21
23
  const CC_ENABLE_MOCK = !!parseInt(process.env.CC_ENABLE_MOCK) || false;
22
24
 
23
- const router$9 = Router({
25
+ const router$b = Router({
24
26
  params: true,
25
27
  });
26
- router$9.get("/api/v1/health/health_check", async (req, res) => {
28
+ router$b.get("/api/v1/health/health_check", async (req, res) => {
27
29
  const [cpuLoad] = os.loadavg();
28
30
  return await micro.send(res, 200, {
29
31
  uptime: process.uptime(),
@@ -72,6 +74,9 @@ const mockServices$1 = {
72
74
  logMockService: Symbol("logMockService"),
73
75
  statusMockService: Symbol("statusMockService"),
74
76
  markdownMockService: Symbol("markdownMockService"),
77
+ explorerMockService: Symbol("explorerMockService"),
78
+ signalMockService: Symbol("signalMockService"),
79
+ heatMockService: Symbol("heatMockService"),
75
80
  };
76
81
  const viewServices$1 = {
77
82
  notificationViewService: Symbol("notificationViewService"),
@@ -80,6 +85,9 @@ const viewServices$1 = {
80
85
  logViewService: Symbol("logViewService"),
81
86
  statusViewService: Symbol("statusViewService"),
82
87
  markdownViewService: Symbol("markdownViewService"),
88
+ explorerViewService: Symbol("explorerViewService"),
89
+ signalViewService: Symbol("signalViewService"),
90
+ heatViewService: Symbol("heatViewService"),
83
91
  };
84
92
  const TYPES = {
85
93
  ...baseServices$1,
@@ -148,6 +156,14 @@ class ExchangeService {
148
156
  exchangeName: dto.exchangeName,
149
157
  }, undefined, sDate, eDate);
150
158
  };
159
+ this.getLastCandles = async (dto) => {
160
+ this.loggerService.log("exchangeService getLastCandles", {
161
+ dto,
162
+ });
163
+ return await backtestKit.Exchange.getCandles(dto.symbol, dto.interval, dto.limit, {
164
+ exchangeName: dto.exchangeName,
165
+ });
166
+ };
151
167
  }
152
168
  }
153
169
 
@@ -182,9 +198,9 @@ class LoggerService {
182
198
  }
183
199
  }
184
200
 
185
- const MOCK_PATH$3 = "./mock/notifications.json";
201
+ const MOCK_PATH$5 = "./mock/notifications.json";
186
202
  const READ_NOTIFICATION_LIST_FN = functoolsKit.singleshot(async () => {
187
- const data = await fs.readFile(MOCK_PATH$3, "utf-8");
203
+ const data = await fs.readFile(MOCK_PATH$5, "utf-8");
188
204
  return JSON.parse(data);
189
205
  });
190
206
  const DEFAULT_LIMIT$3 = 25;
@@ -244,9 +260,9 @@ class NotificationMockService {
244
260
  }
245
261
  }
246
262
 
247
- const MOCK_PATH$2 = "./mock/db";
263
+ const MOCK_PATH$4 = "./mock/db";
248
264
  const READ_BACKTEST_STORAGE_FN = functoolsKit.singleshot(async () => {
249
- const dbPath = path.join(process.cwd(), MOCK_PATH$2);
265
+ const dbPath = path.join(process.cwd(), MOCK_PATH$4);
250
266
  const files = await fs.readdir(dbPath);
251
267
  const signals = [];
252
268
  for (const file of files) {
@@ -281,7 +297,7 @@ class StorageMockService {
281
297
  }
282
298
  }
283
299
 
284
- const MS_PER_MINUTE$1 = 60000;
300
+ const HISTORY_LAST_CANDLES_LIMIT$1 = 200;
285
301
  class ExchangeMockService {
286
302
  constructor() {
287
303
  this.loggerService = inject(TYPES.loggerService);
@@ -314,22 +330,56 @@ class ExchangeMockService {
314
330
  if (!signal) {
315
331
  throw new Error(`Signal with ID ${signalId} not found`);
316
332
  }
317
- const { pendingAt, scheduledAt, minuteEstimatedTime, } = signal;
333
+ const { pendingAt, scheduledAt, updatedAt } = signal;
318
334
  const eventAt = pendingAt || scheduledAt;
319
335
  return await this.exchangeService.getRangeCandles({
320
336
  symbol: signal.symbol,
321
337
  exchangeName: signal.exchangeName,
322
338
  signalStartTime: eventAt,
323
- signalStopTime: eventAt + minuteEstimatedTime * MS_PER_MINUTE$1,
339
+ signalStopTime: backtestKit.alignToInterval(new Date(updatedAt), interval).getTime(),
340
+ interval,
341
+ });
342
+ };
343
+ this.getLastCandles = async (symbol, interval) => {
344
+ this.loggerService.log("exchangeMockService getLastCandles", {
345
+ symbol,
324
346
  interval,
325
347
  });
348
+ const [backtestItem] = await backtestKit.Backtest.list();
349
+ const [liveItem] = await backtestKit.Live.list();
350
+ const [exchangeItem] = await backtestKit.listExchangeSchema();
351
+ if (backtestItem) {
352
+ return await this.exchangeService.getLastCandles({
353
+ symbol,
354
+ limit: HISTORY_LAST_CANDLES_LIMIT$1,
355
+ exchangeName: backtestItem.exchangeName,
356
+ interval,
357
+ });
358
+ }
359
+ if (liveItem) {
360
+ return await this.exchangeService.getLastCandles({
361
+ symbol,
362
+ limit: HISTORY_LAST_CANDLES_LIMIT$1,
363
+ exchangeName: liveItem.exchangeName,
364
+ interval,
365
+ });
366
+ }
367
+ if (exchangeItem) {
368
+ return await this.exchangeService.getLastCandles({
369
+ symbol,
370
+ limit: HISTORY_LAST_CANDLES_LIMIT$1,
371
+ exchangeName: exchangeItem.exchangeName,
372
+ interval,
373
+ });
374
+ }
375
+ throw new Error(`exchangeMockService getLastCandles no pending strategy symbol=${symbol} interval=${interval}`);
326
376
  };
327
377
  }
328
378
  }
329
379
 
330
- const MOCK_PATH$1 = "./mock/logs.json";
380
+ const MOCK_PATH$3 = "./mock/logs.json";
331
381
  const READ_LOG_LIST_FN = functoolsKit.singleshot(async () => {
332
- const data = await fs.readFile(MOCK_PATH$1, "utf-8");
382
+ const data = await fs.readFile(MOCK_PATH$3, "utf-8");
333
383
  return JSON.parse(data);
334
384
  });
335
385
  const DEFAULT_LIMIT$2 = 25;
@@ -377,14 +427,24 @@ class LogMockService {
377
427
  }
378
428
  }
379
429
 
380
- const MOCK_PATH = "./mock/status.json";
430
+ const MOCK_PATH$2 = "./mock/status.json";
431
+ const MOCK_INFO_PATH = "./mock/status-info.json";
381
432
  const READ_STATUS_LIST_FN = functoolsKit.singleshot(async () => {
382
- const data = await fs.readFile(MOCK_PATH, "utf-8");
433
+ const data = await fs.readFile(MOCK_PATH$2, "utf-8");
434
+ return JSON.parse(data);
435
+ });
436
+ const READ_STATUS_INFO_FN = functoolsKit.singleshot(async () => {
437
+ const data = await fs.readFile(MOCK_INFO_PATH, "utf-8");
383
438
  return JSON.parse(data);
384
439
  });
385
440
  class StatusMockService {
386
441
  constructor() {
387
442
  this.loggerService = inject(TYPES.loggerService);
443
+ this.signalMockService = inject(TYPES.signalMockService);
444
+ this.getStatusInfo = async () => {
445
+ this.loggerService.log("statusMockService getStatusInfo");
446
+ return await READ_STATUS_INFO_FN();
447
+ };
388
448
  this.getStatusList = async () => {
389
449
  this.loggerService.log("statusMockService getStatusList");
390
450
  const list = await READ_STATUS_LIST_FN();
@@ -404,33 +464,36 @@ class StatusMockService {
404
464
  this.getStatusOne = async (id) => {
405
465
  this.loggerService.log("statusMockService getStatusOne", { id });
406
466
  const list = await READ_STATUS_LIST_FN();
407
- const signal = list.find((s) => s.id === id);
408
- if (!signal) {
467
+ const status = list.find((s) => s.id === id);
468
+ if (!status) {
409
469
  return null;
410
470
  }
411
- const positionEntries = signal._entry ?? [];
471
+ const updatedAt = await this.signalMockService.getLastUpdateTimestamp(status.signalId);
472
+ const positionEntries = status._entry ?? [];
412
473
  const positionLevels = positionEntries.map((e) => e.price);
413
- const positionPartials = signal._partial ?? [];
474
+ const positionPartials = status._partial ?? [];
414
475
  return {
415
- signalId: signal.signalId,
416
- position: signal.position,
417
- symbol: signal.symbol,
418
- exchangeName: signal.exchangeName,
419
- strategyName: signal.strategyName,
420
- totalEntries: signal.totalEntries,
421
- totalPartials: signal.totalPartials,
422
- originalPriceStopLoss: signal.originalPriceStopLoss,
423
- originalPriceTakeProfit: signal.originalPriceTakeProfit,
424
- originalPriceOpen: signal.originalPriceOpen,
425
- priceOpen: signal.priceOpen,
426
- priceTakeProfit: signal.priceTakeProfit,
427
- priceStopLoss: signal.priceStopLoss,
428
- pnlPercentage: signal.pnl.pnlPercentage,
429
- pnlCost: signal.pnl.pnlCost,
430
- pnlEntries: signal.pnl.pnlEntries,
431
- partialExecuted: signal.partialExecuted,
432
- minuteEstimatedTime: signal.minuteEstimatedTime,
433
- pendingAt: signal.pendingAt,
476
+ signalId: status.signalId,
477
+ position: status.position,
478
+ symbol: status.symbol,
479
+ exchangeName: status.exchangeName,
480
+ strategyName: status.strategyName,
481
+ totalEntries: status.totalEntries,
482
+ totalPartials: status.totalPartials,
483
+ originalPriceStopLoss: status.originalPriceStopLoss,
484
+ originalPriceTakeProfit: status.originalPriceTakeProfit,
485
+ originalPriceOpen: status.originalPriceOpen,
486
+ priceOpen: status.priceOpen,
487
+ priceTakeProfit: status.priceTakeProfit,
488
+ priceStopLoss: status.priceStopLoss,
489
+ pnlPercentage: status.pnl.pnlPercentage,
490
+ pnlCost: status.pnl.pnlCost,
491
+ pnlEntries: status.pnl.pnlEntries,
492
+ partialExecuted: status.partialExecuted,
493
+ minuteEstimatedTime: status.minuteEstimatedTime,
494
+ pendingAt: status.pendingAt,
495
+ timestamp: status.timestamp,
496
+ updatedAt,
434
497
  positionLevels,
435
498
  positionEntries,
436
499
  positionPartials,
@@ -580,6 +643,127 @@ class MarkdownMockService {
580
643
  }
581
644
  }
582
645
 
646
+ const deepFlat = (arr) => {
647
+ const result = [];
648
+ const seen = new Set();
649
+ const process = (entries = []) => entries.forEach((entry) => {
650
+ if (seen.has(entry)) {
651
+ return;
652
+ }
653
+ seen.add(entry);
654
+ if (entry.type === "directory") {
655
+ process(entry.nodes);
656
+ }
657
+ result.push(entry);
658
+ });
659
+ process(arr);
660
+ return result;
661
+ };
662
+ const MOCK_PATH$1 = "./mock/explorer.json";
663
+ const READ_EXPLORER_TREE_FN = functoolsKit.singleshot(async () => {
664
+ const data = await fs.readFile(MOCK_PATH$1, "utf-8");
665
+ return JSON.parse(data);
666
+ });
667
+ const READ_EXPLORER_INDEX_FN = functoolsKit.singleshot(async () => {
668
+ const tree = await READ_EXPLORER_TREE_FN();
669
+ const treeList = deepFlat(tree);
670
+ if (treeList.length === 0) {
671
+ return {};
672
+ }
673
+ return treeList.reduce((acm, cur) => {
674
+ if (cur.type === "file" && "content" in cur) {
675
+ return { ...acm, [cur.path]: cur };
676
+ }
677
+ return acm;
678
+ }, {});
679
+ });
680
+ class ExplorerMockService {
681
+ constructor() {
682
+ this.loggerService = inject(TYPES.loggerService);
683
+ this.getNode = async (nodePath) => {
684
+ this.loggerService.log("explorerMockService getNode", {
685
+ nodePath,
686
+ });
687
+ const index = await READ_EXPLORER_INDEX_FN();
688
+ return index[nodePath]?.content ?? "";
689
+ };
690
+ this.getTree = async () => {
691
+ this.loggerService.log("explorerMockService getTree");
692
+ return await READ_EXPLORER_TREE_FN();
693
+ };
694
+ }
695
+ }
696
+
697
+ const MOCK_PATH = "./mock/db";
698
+ const MOCK_SIGNAL_PATH = "./mock/signal.json";
699
+ const READ_SIGNAL_STORAGE_FN = functoolsKit.singleshot(async () => {
700
+ const dbPath = path.join(process.cwd(), MOCK_PATH);
701
+ const files = await fs.readdir(dbPath);
702
+ const signals = [];
703
+ for (const file of files) {
704
+ if (!file.endsWith(".json")) {
705
+ continue;
706
+ }
707
+ const filePath = path.join(dbPath, file);
708
+ signals.push(JSON.parse(await fs.readFile(filePath, "utf-8")));
709
+ }
710
+ return signals;
711
+ });
712
+ const READ_PENDING_SIGNAL_FN = functoolsKit.singleshot(async () => {
713
+ const filePath = path.join(process.cwd(), MOCK_SIGNAL_PATH);
714
+ return JSON.parse(await fs.readFile(filePath, "utf-8"));
715
+ });
716
+ class SignalMockService {
717
+ constructor() {
718
+ this.loggerService = inject(TYPES.loggerService);
719
+ this.getLastUpdateTimestamp = async (signalId) => {
720
+ this.loggerService.log("signalMockService getLastUpdateTimestamp", {
721
+ signalId,
722
+ });
723
+ const signalList = await READ_SIGNAL_STORAGE_FN();
724
+ const signalMap = new Map(signalList.map((signal) => [signal.id, signal]));
725
+ const signal = signalMap.get(signalId);
726
+ if (!signal) {
727
+ throw new Error(`SignalMockService getLastUpdateTimestamp signal not found signalId=${signalId}`);
728
+ }
729
+ return signal.updatedAt;
730
+ };
731
+ this.getPendingSignal = async (symbol) => {
732
+ this.loggerService.log("signalMockService getPendingSignal", {
733
+ symbol,
734
+ });
735
+ const signal = await READ_PENDING_SIGNAL_FN();
736
+ if (signal.symbol !== symbol) {
737
+ return null;
738
+ }
739
+ return signal;
740
+ };
741
+ }
742
+ }
743
+
744
+ const MOCK_DATA_PATH = "./mock/heat.json";
745
+ const MOCK_REPORT_PATH = "./mock/heat-report.md";
746
+ const READ_HEAT_DATA_FN = functoolsKit.singleshot(async () => {
747
+ const data = await fs.readFile(MOCK_DATA_PATH, "utf-8");
748
+ return JSON.parse(data);
749
+ });
750
+ const READ_HEAT_REPORT_FN = functoolsKit.singleshot(async () => {
751
+ return await fs.readFile(MOCK_REPORT_PATH, "utf-8");
752
+ });
753
+ class HeatMockService {
754
+ constructor() {
755
+ this.loggerService = inject(TYPES.loggerService);
756
+ this.getStrategyHeatData = async () => {
757
+ this.loggerService.log("heatMockService getStrategyHeatData");
758
+ return await READ_HEAT_DATA_FN();
759
+ };
760
+ this.getStrategyHeatReport = async () => {
761
+ this.loggerService.log("heatMockService getStrategyHeatReport");
762
+ return await READ_HEAT_REPORT_FN();
763
+ };
764
+ }
765
+ }
766
+
583
767
  const DEFAULT_LIMIT$1 = 25;
584
768
  const DEFAULT_OFFSET$1 = 0;
585
769
  const CREATE_FILTER_LIST_FN$1 = (filterData) => Object.keys(filterData).map((key) => (row) => new RegExp(filterData[key], "i").test(row[key]));
@@ -724,13 +908,14 @@ class StorageViewService {
724
908
  }
725
909
  }
726
910
 
727
- const MS_PER_MINUTE = 60000;
911
+ const HISTORY_LAST_CANDLES_LIMIT = 200;
728
912
  class ExchangeViewService {
729
913
  constructor() {
730
914
  this.loggerService = inject(TYPES.loggerService);
731
915
  this.storageViewService = inject(TYPES.storageViewService);
732
916
  this.exchangeService = inject(TYPES.exchangeService);
733
917
  this.exchangeMockService = inject(TYPES.exchangeMockService);
918
+ this.signalViewService = inject(TYPES.signalViewService);
734
919
  this.getSignalCandles = async (signalId, interval) => {
735
920
  this.loggerService.log("exchangeViewService getCandles", {
736
921
  signalId,
@@ -764,15 +949,53 @@ class ExchangeViewService {
764
949
  if (!signal) {
765
950
  throw new Error(`Signal with ID ${signalId} not found`);
766
951
  }
767
- const { pendingAt, scheduledAt, minuteEstimatedTime, } = signal;
952
+ const { pendingAt, scheduledAt } = signal;
768
953
  const eventAt = pendingAt || scheduledAt;
954
+ const updatedAt = await this.signalViewService.getLastUpdateTimestamp(signalId);
769
955
  return await this.exchangeService.getRangeCandles({
770
956
  symbol: signal.symbol,
771
957
  exchangeName: signal.exchangeName,
772
958
  signalStartTime: eventAt,
773
- signalStopTime: eventAt + minuteEstimatedTime * MS_PER_MINUTE,
959
+ signalStopTime: backtestKit.alignToInterval(new Date(updatedAt), interval).getTime(),
960
+ interval,
961
+ });
962
+ };
963
+ this.getLastCandles = async (symbol, interval) => {
964
+ this.loggerService.log("exchangeViewService getLastCandles", {
965
+ symbol,
774
966
  interval,
775
967
  });
968
+ if (CC_ENABLE_MOCK) {
969
+ return await this.exchangeMockService.getLastCandles(symbol, interval);
970
+ }
971
+ const [backtestItem] = await backtestKit.Backtest.list();
972
+ const [liveItem] = await backtestKit.Live.list();
973
+ const [exchangeItem] = await backtestKit.listExchangeSchema();
974
+ if (backtestItem) {
975
+ return await this.exchangeService.getLastCandles({
976
+ symbol,
977
+ limit: HISTORY_LAST_CANDLES_LIMIT,
978
+ exchangeName: backtestItem.exchangeName,
979
+ interval,
980
+ });
981
+ }
982
+ if (liveItem) {
983
+ return await this.exchangeService.getLastCandles({
984
+ symbol,
985
+ limit: HISTORY_LAST_CANDLES_LIMIT,
986
+ exchangeName: liveItem.exchangeName,
987
+ interval,
988
+ });
989
+ }
990
+ if (exchangeItem) {
991
+ return await this.exchangeService.getLastCandles({
992
+ symbol,
993
+ limit: HISTORY_LAST_CANDLES_LIMIT,
994
+ exchangeName: exchangeItem.exchangeName,
995
+ interval,
996
+ });
997
+ }
998
+ throw new Error(`exchangeViewService getLastCandles no pending strategy symbol=${symbol} interval=${interval}`);
776
999
  };
777
1000
  }
778
1001
  }
@@ -836,6 +1059,7 @@ class StatusViewService {
836
1059
  constructor() {
837
1060
  this.loggerService = inject(TYPES.loggerService);
838
1061
  this.statusMockService = inject(TYPES.statusMockService);
1062
+ this.signalViewService = inject(TYPES.signalViewService);
839
1063
  this.getStatusList = async () => {
840
1064
  this.loggerService.log("statusViewService getStatusList");
841
1065
  if (CC_ENABLE_MOCK) {
@@ -898,6 +1122,12 @@ class StatusViewService {
898
1122
  if (!positionPartials) {
899
1123
  return null;
900
1124
  }
1125
+ const timestamp = await backtestKit.lib.timeMetaService.getTimestamp(pendingSignal.symbol, {
1126
+ strategyName: pendingSignal.strategyName,
1127
+ exchangeName: pendingSignal.exchangeName,
1128
+ frameName: pendingSignal.frameName,
1129
+ }, false);
1130
+ const updatedAt = await this.signalViewService.getLastUpdateTimestamp(pendingSignal.id);
901
1131
  return {
902
1132
  signalId: pendingSignal.id,
903
1133
  position: pendingSignal.position,
@@ -918,11 +1148,80 @@ class StatusViewService {
918
1148
  partialExecuted: pendingSignal.partialExecuted,
919
1149
  pendingAt: pendingSignal.pendingAt,
920
1150
  minuteEstimatedTime: pendingSignal.minuteEstimatedTime,
1151
+ timestamp,
1152
+ updatedAt,
921
1153
  positionEntries,
922
1154
  positionLevels,
923
1155
  positionPartials,
924
1156
  };
925
1157
  };
1158
+ this.getStatusInfo = async () => {
1159
+ this.loggerService.log("statusViewService getStatusInfo");
1160
+ if (CC_ENABLE_MOCK) {
1161
+ return this.statusMockService.getStatusInfo();
1162
+ }
1163
+ {
1164
+ const [backtestTarget = null] = await backtestKit.Backtest.list();
1165
+ if (backtestTarget) {
1166
+ const currentHeat = await backtestKit.Heat.getData({
1167
+ strategyName: backtestTarget.strategyName,
1168
+ exchangeName: backtestTarget.exchangeName,
1169
+ frameName: backtestTarget.frameName,
1170
+ });
1171
+ return {
1172
+ context: {
1173
+ strategyName: backtestTarget.strategyName,
1174
+ exchangeName: backtestTarget.exchangeName,
1175
+ frameName: backtestTarget.frameName,
1176
+ },
1177
+ portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1178
+ portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1179
+ portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1180
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1181
+ symbol,
1182
+ totalPnl,
1183
+ winRate,
1184
+ profitFactor,
1185
+ maxDrawdown,
1186
+ expectancy,
1187
+ totalTrades,
1188
+ })),
1189
+ backtest: true,
1190
+ };
1191
+ }
1192
+ }
1193
+ {
1194
+ const [liveTarget = null] = await backtestKit.Live.list();
1195
+ if (liveTarget) {
1196
+ const currentHeat = await backtestKit.Heat.getData({
1197
+ strategyName: liveTarget.strategyName,
1198
+ exchangeName: liveTarget.exchangeName,
1199
+ frameName: "",
1200
+ });
1201
+ return {
1202
+ context: {
1203
+ strategyName: liveTarget.strategyName,
1204
+ exchangeName: liveTarget.exchangeName,
1205
+ frameName: "",
1206
+ },
1207
+ portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1208
+ portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1209
+ portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1210
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1211
+ symbol,
1212
+ totalPnl,
1213
+ winRate,
1214
+ profitFactor,
1215
+ maxDrawdown,
1216
+ expectancy,
1217
+ totalTrades,
1218
+ })),
1219
+ backtest: false,
1220
+ };
1221
+ }
1222
+ }
1223
+ return null;
1224
+ };
926
1225
  }
927
1226
  }
928
1227
 
@@ -1113,6 +1412,185 @@ class MarkdownViewService {
1113
1412
  }
1114
1413
  }
1115
1414
 
1415
+ const pathId = (p) => crypto.createHash("sha1").update(p).digest("hex").slice(0, 16);
1416
+ const buildTree = async (dir, visited) => {
1417
+ const realDir = await fs.realpath(dir);
1418
+ if (visited.has(realDir)) {
1419
+ return [];
1420
+ }
1421
+ visited.add(realDir);
1422
+ const entries = await fs.readdir(dir, { withFileTypes: true });
1423
+ const nodes = [];
1424
+ for (const entry of entries) {
1425
+ const childPath = path.join(dir, entry.name);
1426
+ const childRelPath = path.relative(process.cwd(), childPath).replace(/\\/g, "/");
1427
+ if (entry.isDirectory()) {
1428
+ nodes.push({
1429
+ id: pathId(childRelPath),
1430
+ path: childRelPath,
1431
+ label: entry.name,
1432
+ type: "directory",
1433
+ nodes: await buildTree(childPath, visited),
1434
+ });
1435
+ }
1436
+ else {
1437
+ nodes.push({
1438
+ id: pathId(childRelPath),
1439
+ path: childRelPath,
1440
+ label: entry.name,
1441
+ type: "file",
1442
+ mimeType: mime.lookup(entry.name) || "application/octet-stream",
1443
+ });
1444
+ }
1445
+ }
1446
+ return nodes;
1447
+ };
1448
+ class ExplorerViewService {
1449
+ constructor() {
1450
+ this.loggerService = inject(TYPES.loggerService);
1451
+ this.explorerMockService = inject(TYPES.explorerMockService);
1452
+ this.getDir = functoolsKit.singleshot(async () => {
1453
+ this.loggerService.log("explorerViewService getDir");
1454
+ const dir = path.join(process.cwd(), "dump");
1455
+ await fs.mkdir(dir, { recursive: true });
1456
+ return dir;
1457
+ });
1458
+ this.getNode = async (nodePath) => {
1459
+ this.loggerService.log("explorerViewService getNode", {
1460
+ nodePath,
1461
+ });
1462
+ if (CC_ENABLE_MOCK) {
1463
+ return await this.explorerMockService.getNode(nodePath);
1464
+ }
1465
+ const dir = await this.getDir();
1466
+ const absPath = path.resolve(process.cwd(), nodePath);
1467
+ if (!absPath.startsWith(dir + path.sep) && !absPath.startsWith(dir + "/") && absPath !== dir) {
1468
+ throw new Error(`Path is outside of dump dir: ${nodePath}`);
1469
+ }
1470
+ return await fs.readFile(absPath, "utf-8");
1471
+ };
1472
+ this.getTree = async () => {
1473
+ this.loggerService.log("explorerViewService getTree");
1474
+ if (CC_ENABLE_MOCK) {
1475
+ return await this.explorerMockService.getTree();
1476
+ }
1477
+ const dir = await this.getDir();
1478
+ const root = path.relative(process.cwd(), dir).replace(/\\/g, "/");
1479
+ const rootNode = {
1480
+ id: pathId(root),
1481
+ path: root,
1482
+ label: path.basename(root),
1483
+ type: "directory",
1484
+ nodes: await buildTree(dir, new Set([path.join(dir, "data")])),
1485
+ };
1486
+ return [rootNode];
1487
+ };
1488
+ }
1489
+ }
1490
+
1491
+ class SignalViewService {
1492
+ constructor() {
1493
+ this.loggerService = inject(TYPES.loggerService);
1494
+ this.signalMockService = inject(TYPES.signalMockService);
1495
+ this.getLastUpdateTimestamp = async (signalId) => {
1496
+ this.loggerService.log("signalViewService getLastUpdateTimestamp", {
1497
+ signalId,
1498
+ });
1499
+ if (CC_ENABLE_MOCK) {
1500
+ return await this.signalMockService.getLastUpdateTimestamp(signalId);
1501
+ }
1502
+ {
1503
+ const liveSignal = await backtestKit.StorageLive.findById(signalId);
1504
+ if (liveSignal) {
1505
+ return liveSignal.updatedAt;
1506
+ }
1507
+ }
1508
+ {
1509
+ const backtestSignal = await backtestKit.StorageBacktest.findById(signalId);
1510
+ if (backtestSignal) {
1511
+ return backtestSignal.updatedAt;
1512
+ }
1513
+ }
1514
+ throw new Error(`SignalViewService getLastUpdateTimestamp signal not found signalId=${signalId}`);
1515
+ };
1516
+ this.getPendingSignal = async (symbol) => {
1517
+ this.loggerService.log("signalViewService getPendingSignal", {
1518
+ symbol,
1519
+ });
1520
+ if (CC_ENABLE_MOCK) {
1521
+ return await this.signalMockService.getPendingSignal(symbol);
1522
+ }
1523
+ {
1524
+ const liveList = await backtestKit.Live.list();
1525
+ const liveTarget = liveList.find((live) => live.symbol === symbol);
1526
+ if (liveTarget) {
1527
+ const currentPrice = await backtestKit.Exchange.getAveragePrice(symbol, {
1528
+ exchangeName: liveTarget.exchangeName,
1529
+ });
1530
+ return await backtestKit.Live.getPendingSignal(symbol, currentPrice, {
1531
+ strategyName: liveTarget.strategyName,
1532
+ exchangeName: liveTarget.exchangeName,
1533
+ });
1534
+ }
1535
+ }
1536
+ return null;
1537
+ };
1538
+ }
1539
+ }
1540
+
1541
+ class HeatViewService {
1542
+ constructor() {
1543
+ this.loggerService = inject(TYPES.loggerService);
1544
+ this.heatMockService = inject(TYPES.heatMockService);
1545
+ this.getStrategyHeatData = async () => {
1546
+ this.loggerService.log("heatViewService getStrategyHeatData");
1547
+ if (CC_ENABLE_MOCK) {
1548
+ return await this.heatMockService.getStrategyHeatData();
1549
+ }
1550
+ const [backtestItem] = await backtestKit.Backtest.list();
1551
+ const [liveItem] = await backtestKit.Live.list();
1552
+ if (backtestItem) {
1553
+ return await backtestKit.Heat.getData({
1554
+ strategyName: backtestItem.strategyName,
1555
+ exchangeName: backtestItem.exchangeName,
1556
+ frameName: backtestItem.frameName,
1557
+ });
1558
+ }
1559
+ if (liveItem) {
1560
+ return await backtestKit.Heat.getData({
1561
+ strategyName: liveItem.strategyName,
1562
+ exchangeName: liveItem.exchangeName,
1563
+ frameName: "",
1564
+ });
1565
+ }
1566
+ return null;
1567
+ };
1568
+ this.getStrategyHeatReport = async () => {
1569
+ this.loggerService.log("heatViewService getStrategyHeatReport");
1570
+ if (CC_ENABLE_MOCK) {
1571
+ return await this.heatMockService.getStrategyHeatReport();
1572
+ }
1573
+ const [backtestItem] = await backtestKit.Backtest.list();
1574
+ const [liveItem] = await backtestKit.Live.list();
1575
+ if (backtestItem) {
1576
+ return await backtestKit.Heat.getReport({
1577
+ strategyName: backtestItem.strategyName,
1578
+ exchangeName: backtestItem.exchangeName,
1579
+ frameName: backtestItem.frameName,
1580
+ });
1581
+ }
1582
+ if (liveItem) {
1583
+ return await backtestKit.Heat.getReport({
1584
+ strategyName: liveItem.strategyName,
1585
+ exchangeName: liveItem.exchangeName,
1586
+ frameName: "",
1587
+ });
1588
+ }
1589
+ return null;
1590
+ };
1591
+ }
1592
+ }
1593
+
1116
1594
  const symbol_list = [
1117
1595
  {
1118
1596
  icon: "/icon/btc.png",
@@ -1309,6 +1787,9 @@ class LiveMetaService {
1309
1787
  provide(TYPES.logMockService, () => new LogMockService());
1310
1788
  provide(TYPES.statusMockService, () => new StatusMockService());
1311
1789
  provide(TYPES.markdownMockService, () => new MarkdownMockService());
1790
+ provide(TYPES.explorerMockService, () => new ExplorerMockService());
1791
+ provide(TYPES.signalMockService, () => new SignalMockService());
1792
+ provide(TYPES.heatMockService, () => new HeatMockService());
1312
1793
  }
1313
1794
  {
1314
1795
  provide(TYPES.notificationViewService, () => new NotificationViewService());
@@ -1317,6 +1798,9 @@ class LiveMetaService {
1317
1798
  provide(TYPES.logViewService, () => new LogViewService());
1318
1799
  provide(TYPES.statusViewService, () => new StatusViewService());
1319
1800
  provide(TYPES.markdownViewService, () => new MarkdownViewService());
1801
+ provide(TYPES.explorerViewService, () => new ExplorerViewService());
1802
+ provide(TYPES.signalViewService, () => new SignalViewService());
1803
+ provide(TYPES.heatViewService, () => new HeatViewService());
1320
1804
  }
1321
1805
 
1322
1806
  const baseServices = {
@@ -1339,6 +1823,9 @@ const mockServices = {
1339
1823
  logMockService: inject(TYPES.logMockService),
1340
1824
  statusMockService: inject(TYPES.statusMockService),
1341
1825
  markdownMockService: inject(TYPES.markdownMockService),
1826
+ explorerMockService: inject(TYPES.explorerMockService),
1827
+ signalMockService: inject(TYPES.signalMockService),
1828
+ heatMockService: inject(TYPES.heatMockService),
1342
1829
  };
1343
1830
  const viewServices = {
1344
1831
  notificationViewService: inject(TYPES.notificationViewService),
@@ -1347,6 +1834,9 @@ const viewServices = {
1347
1834
  logViewService: inject(TYPES.logViewService),
1348
1835
  statusViewService: inject(TYPES.statusViewService),
1349
1836
  markdownViewService: inject(TYPES.markdownViewService),
1837
+ explorerViewService: inject(TYPES.explorerViewService),
1838
+ signalViewService: inject(TYPES.signalViewService),
1839
+ heatViewService: inject(TYPES.heatViewService),
1350
1840
  };
1351
1841
  const ioc = {
1352
1842
  ...baseServices,
@@ -1357,11 +1847,11 @@ const ioc = {
1357
1847
  };
1358
1848
  init();
1359
1849
 
1360
- const router$8 = Router({
1850
+ const router$a = Router({
1361
1851
  params: true,
1362
1852
  });
1363
1853
  // ExchangeMockService endpoints
1364
- router$8.post("/api/v1/mock/candles_signal", async (req, res) => {
1854
+ router$a.post("/api/v1/mock/candles_signal", async (req, res) => {
1365
1855
  try {
1366
1856
  const request = await micro.json(req);
1367
1857
  const { signalId, interval, requestId, serviceName } = request;
@@ -1389,7 +1879,7 @@ router$8.post("/api/v1/mock/candles_signal", async (req, res) => {
1389
1879
  });
1390
1880
  }
1391
1881
  });
1392
- router$8.post("/api/v1/mock/candles_point", async (req, res) => {
1882
+ router$a.post("/api/v1/mock/candles_point", async (req, res) => {
1393
1883
  try {
1394
1884
  const request = await micro.json(req);
1395
1885
  const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
@@ -1423,7 +1913,7 @@ router$8.post("/api/v1/mock/candles_point", async (req, res) => {
1423
1913
  }
1424
1914
  });
1425
1915
  // NotificationMockService endpoints
1426
- router$8.post("/api/v1/mock/notification_list", async (req, res) => {
1916
+ router$a.post("/api/v1/mock/notification_list", async (req, res) => {
1427
1917
  try {
1428
1918
  const request = await micro.json(req);
1429
1919
  const { requestId, serviceName } = request;
@@ -1451,7 +1941,7 @@ router$8.post("/api/v1/mock/notification_list", async (req, res) => {
1451
1941
  });
1452
1942
  }
1453
1943
  });
1454
- router$8.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1944
+ router$a.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1455
1945
  try {
1456
1946
  const request = await micro.json(req);
1457
1947
  const { requestId, serviceName } = request;
@@ -1480,7 +1970,7 @@ router$8.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1480
1970
  });
1481
1971
  }
1482
1972
  });
1483
- router$8.post("/api/v1/mock/notification_filter", async (req, res) => {
1973
+ router$a.post("/api/v1/mock/notification_filter", async (req, res) => {
1484
1974
  try {
1485
1975
  const request = await micro.json(req);
1486
1976
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1509,7 +1999,7 @@ router$8.post("/api/v1/mock/notification_filter", async (req, res) => {
1509
1999
  }
1510
2000
  });
1511
2001
  // StorageMockService endpoints
1512
- router$8.post("/api/v1/mock/storage_one/:id", async (req, res) => {
2002
+ router$a.post("/api/v1/mock/storage_one/:id", async (req, res) => {
1513
2003
  try {
1514
2004
  const request = await micro.json(req);
1515
2005
  const { requestId, serviceName } = request;
@@ -1538,7 +2028,7 @@ router$8.post("/api/v1/mock/storage_one/:id", async (req, res) => {
1538
2028
  });
1539
2029
  }
1540
2030
  });
1541
- router$8.post("/api/v1/mock/storage_list/live", async (req, res) => {
2031
+ router$a.post("/api/v1/mock/storage_list/live", async (req, res) => {
1542
2032
  try {
1543
2033
  const request = await micro.json(req);
1544
2034
  const { requestId, serviceName } = request;
@@ -1566,7 +2056,7 @@ router$8.post("/api/v1/mock/storage_list/live", async (req, res) => {
1566
2056
  });
1567
2057
  }
1568
2058
  });
1569
- router$8.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
2059
+ router$a.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
1570
2060
  try {
1571
2061
  const request = await micro.json(req);
1572
2062
  const { requestId, serviceName } = request;
@@ -1595,7 +2085,7 @@ router$8.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
1595
2085
  }
1596
2086
  });
1597
2087
  // LogMockService endpoints
1598
- router$8.post("/api/v1/mock/log_list", async (req, res) => {
2088
+ router$a.post("/api/v1/mock/log_list", async (req, res) => {
1599
2089
  try {
1600
2090
  const request = await micro.json(req);
1601
2091
  const { requestId, serviceName } = request;
@@ -1623,7 +2113,7 @@ router$8.post("/api/v1/mock/log_list", async (req, res) => {
1623
2113
  });
1624
2114
  }
1625
2115
  });
1626
- router$8.post("/api/v1/mock/log_one/:id", async (req, res) => {
2116
+ router$a.post("/api/v1/mock/log_one/:id", async (req, res) => {
1627
2117
  try {
1628
2118
  const request = await micro.json(req);
1629
2119
  const { requestId, serviceName } = request;
@@ -1652,7 +2142,7 @@ router$8.post("/api/v1/mock/log_one/:id", async (req, res) => {
1652
2142
  });
1653
2143
  }
1654
2144
  });
1655
- router$8.post("/api/v1/mock/log_filter", async (req, res) => {
2145
+ router$a.post("/api/v1/mock/log_filter", async (req, res) => {
1656
2146
  try {
1657
2147
  const request = await micro.json(req);
1658
2148
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1680,7 +2170,7 @@ router$8.post("/api/v1/mock/log_filter", async (req, res) => {
1680
2170
  });
1681
2171
  }
1682
2172
  });
1683
- router$8.post("/api/v1/mock/candles_live", async (req, res) => {
2173
+ router$a.post("/api/v1/mock/candles_live", async (req, res) => {
1684
2174
  try {
1685
2175
  const request = await micro.json(req);
1686
2176
  const { signalId, interval, requestId, serviceName } = request;
@@ -1708,8 +2198,94 @@ router$8.post("/api/v1/mock/candles_live", async (req, res) => {
1708
2198
  });
1709
2199
  }
1710
2200
  });
2201
+ router$a.post("/api/v1/mock/candles_last", async (req, res) => {
2202
+ try {
2203
+ const request = await micro.json(req);
2204
+ const { symbol, interval, requestId, serviceName } = request;
2205
+ const data = await ioc.exchangeMockService.getLastCandles(symbol, interval);
2206
+ const result = {
2207
+ data,
2208
+ status: "ok",
2209
+ error: "",
2210
+ requestId,
2211
+ serviceName,
2212
+ };
2213
+ ioc.loggerService.log("/api/v1/mock/candles_last ok", {
2214
+ request,
2215
+ result: omit(result, "data"),
2216
+ });
2217
+ return await micro.send(res, 200, result);
2218
+ }
2219
+ catch (error) {
2220
+ ioc.loggerService.log("/api/v1/mock/candles_last error", {
2221
+ error: functoolsKit.errorData(error),
2222
+ });
2223
+ return await micro.send(res, 200, {
2224
+ status: "error",
2225
+ error: functoolsKit.getErrorMessage(error),
2226
+ });
2227
+ }
2228
+ });
2229
+ // SignalMockService endpoints
2230
+ router$a.post("/api/v1/mock/signal_last_update/:id", async (req, res) => {
2231
+ try {
2232
+ const request = await micro.json(req);
2233
+ const { requestId, serviceName } = request;
2234
+ const signalId = req.params.id;
2235
+ const data = await ioc.signalMockService.getLastUpdateTimestamp(signalId);
2236
+ const result = {
2237
+ data,
2238
+ status: "ok",
2239
+ error: "",
2240
+ requestId,
2241
+ serviceName,
2242
+ };
2243
+ ioc.loggerService.log("/api/v1/mock/signal_last_update/:id ok", {
2244
+ request,
2245
+ result: omit(result, "data"),
2246
+ });
2247
+ return await micro.send(res, 200, result);
2248
+ }
2249
+ catch (error) {
2250
+ ioc.loggerService.log("/api/v1/mock/signal_last_update/:id error", {
2251
+ error: functoolsKit.errorData(error),
2252
+ });
2253
+ return await micro.send(res, 200, {
2254
+ status: "error",
2255
+ error: functoolsKit.getErrorMessage(error),
2256
+ });
2257
+ }
2258
+ });
2259
+ router$a.post("/api/v1/mock/signal_pending", async (req, res) => {
2260
+ try {
2261
+ const request = await micro.json(req);
2262
+ const { symbol, requestId, serviceName } = request;
2263
+ const data = await ioc.signalMockService.getPendingSignal(symbol);
2264
+ const result = {
2265
+ data,
2266
+ status: "ok",
2267
+ error: "",
2268
+ requestId,
2269
+ serviceName,
2270
+ };
2271
+ ioc.loggerService.log("/api/v1/mock/signal_pending ok", {
2272
+ request,
2273
+ result: omit(result, "data"),
2274
+ });
2275
+ return await micro.send(res, 200, result);
2276
+ }
2277
+ catch (error) {
2278
+ ioc.loggerService.log("/api/v1/mock/signal_pending error", {
2279
+ error: functoolsKit.errorData(error),
2280
+ });
2281
+ return await micro.send(res, 200, {
2282
+ status: "error",
2283
+ error: functoolsKit.getErrorMessage(error),
2284
+ });
2285
+ }
2286
+ });
1711
2287
  // StatusMockService endpoints
1712
- router$8.post("/api/v1/mock/status_list", async (req, res) => {
2288
+ router$a.post("/api/v1/mock/status_list", async (req, res) => {
1713
2289
  try {
1714
2290
  const request = await micro.json(req);
1715
2291
  const { requestId, serviceName } = request;
@@ -1737,7 +2313,7 @@ router$8.post("/api/v1/mock/status_list", async (req, res) => {
1737
2313
  });
1738
2314
  }
1739
2315
  });
1740
- router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
2316
+ router$a.post("/api/v1/mock/status_one/:id", async (req, res) => {
1741
2317
  try {
1742
2318
  const request = await micro.json(req);
1743
2319
  const { requestId, serviceName } = request;
@@ -1766,12 +2342,97 @@ router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
1766
2342
  });
1767
2343
  }
1768
2344
  });
2345
+ // HeatMockService endpoints
2346
+ router$a.post("/api/v1/mock/heat_data", async (req, res) => {
2347
+ try {
2348
+ const request = await micro.json(req);
2349
+ const { requestId, serviceName } = request;
2350
+ const data = await ioc.heatMockService.getStrategyHeatData();
2351
+ const result = {
2352
+ data,
2353
+ status: "ok",
2354
+ error: "",
2355
+ requestId,
2356
+ serviceName,
2357
+ };
2358
+ ioc.loggerService.log("/api/v1/mock/heat_data ok", {
2359
+ request,
2360
+ result: omit(result, "data"),
2361
+ });
2362
+ return await micro.send(res, 200, result);
2363
+ }
2364
+ catch (error) {
2365
+ ioc.loggerService.log("/api/v1/mock/heat_data error", {
2366
+ error: functoolsKit.errorData(error),
2367
+ });
2368
+ return await micro.send(res, 200, {
2369
+ status: "error",
2370
+ error: functoolsKit.getErrorMessage(error),
2371
+ });
2372
+ }
2373
+ });
2374
+ router$a.post("/api/v1/mock/heat_report", async (req, res) => {
2375
+ try {
2376
+ const request = await micro.json(req);
2377
+ const { requestId, serviceName } = request;
2378
+ const data = await ioc.heatMockService.getStrategyHeatReport();
2379
+ const result = {
2380
+ data,
2381
+ status: "ok",
2382
+ error: "",
2383
+ requestId,
2384
+ serviceName,
2385
+ };
2386
+ ioc.loggerService.log("/api/v1/mock/heat_report ok", {
2387
+ request,
2388
+ result: omit(result, "data"),
2389
+ });
2390
+ return await micro.send(res, 200, result);
2391
+ }
2392
+ catch (error) {
2393
+ ioc.loggerService.log("/api/v1/mock/heat_report error", {
2394
+ error: functoolsKit.errorData(error),
2395
+ });
2396
+ return await micro.send(res, 200, {
2397
+ status: "error",
2398
+ error: functoolsKit.getErrorMessage(error),
2399
+ });
2400
+ }
2401
+ });
2402
+ router$a.post("/api/v1/mock/status_info", async (req, res) => {
2403
+ try {
2404
+ const request = await micro.json(req);
2405
+ const { requestId, serviceName } = request;
2406
+ const data = await ioc.statusMockService.getStatusInfo();
2407
+ const result = {
2408
+ data,
2409
+ status: "ok",
2410
+ error: "",
2411
+ requestId,
2412
+ serviceName,
2413
+ };
2414
+ ioc.loggerService.log("/api/v1/mock/status_info ok", {
2415
+ request,
2416
+ result: omit(result, "data"),
2417
+ });
2418
+ return await micro.send(res, 200, result);
2419
+ }
2420
+ catch (error) {
2421
+ ioc.loggerService.log("/api/v1/mock/status_info error", {
2422
+ error: functoolsKit.errorData(error),
2423
+ });
2424
+ return await micro.send(res, 200, {
2425
+ status: "error",
2426
+ error: functoolsKit.getErrorMessage(error),
2427
+ });
2428
+ }
2429
+ });
1769
2430
 
1770
- const router$7 = Router({
2431
+ const router$9 = Router({
1771
2432
  params: true,
1772
2433
  });
1773
2434
  // ExchangeViewService endpoints
1774
- router$7.post("/api/v1/view/candles_signal", async (req, res) => {
2435
+ router$9.post("/api/v1/view/candles_signal", async (req, res) => {
1775
2436
  try {
1776
2437
  const request = await micro.json(req);
1777
2438
  const { signalId, interval, requestId, serviceName } = request;
@@ -1799,7 +2460,7 @@ router$7.post("/api/v1/view/candles_signal", async (req, res) => {
1799
2460
  });
1800
2461
  }
1801
2462
  });
1802
- router$7.post("/api/v1/view/candles_point", async (req, res) => {
2463
+ router$9.post("/api/v1/view/candles_point", async (req, res) => {
1803
2464
  try {
1804
2465
  const request = await micro.json(req);
1805
2466
  const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
@@ -1832,7 +2493,7 @@ router$7.post("/api/v1/view/candles_point", async (req, res) => {
1832
2493
  });
1833
2494
  }
1834
2495
  });
1835
- router$7.post("/api/v1/view/candles_live", async (req, res) => {
2496
+ router$9.post("/api/v1/view/candles_live", async (req, res) => {
1836
2497
  try {
1837
2498
  const request = await micro.json(req);
1838
2499
  const { signalId, interval, requestId, serviceName } = request;
@@ -1860,8 +2521,36 @@ router$7.post("/api/v1/view/candles_live", async (req, res) => {
1860
2521
  });
1861
2522
  }
1862
2523
  });
2524
+ router$9.post("/api/v1/view/candles_last", async (req, res) => {
2525
+ try {
2526
+ const request = await micro.json(req);
2527
+ const { symbol, interval, requestId, serviceName } = request;
2528
+ const data = await ioc.exchangeViewService.getLastCandles(symbol, interval);
2529
+ const result = {
2530
+ data,
2531
+ status: "ok",
2532
+ error: "",
2533
+ requestId,
2534
+ serviceName,
2535
+ };
2536
+ ioc.loggerService.log("/api/v1/view/candles_last ok", {
2537
+ request,
2538
+ result: omit(result, "data"),
2539
+ });
2540
+ return await micro.send(res, 200, result);
2541
+ }
2542
+ catch (error) {
2543
+ ioc.loggerService.log("/api/v1/view/candles_last error", {
2544
+ error: functoolsKit.errorData(error),
2545
+ });
2546
+ return await micro.send(res, 200, {
2547
+ status: "error",
2548
+ error: functoolsKit.getErrorMessage(error),
2549
+ });
2550
+ }
2551
+ });
1863
2552
  // NotificationViewService endpoints
1864
- router$7.post("/api/v1/view/notification_list", async (req, res) => {
2553
+ router$9.post("/api/v1/view/notification_list", async (req, res) => {
1865
2554
  try {
1866
2555
  const request = await micro.json(req);
1867
2556
  const { requestId, serviceName } = request;
@@ -1889,7 +2578,7 @@ router$7.post("/api/v1/view/notification_list", async (req, res) => {
1889
2578
  });
1890
2579
  }
1891
2580
  });
1892
- router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
2581
+ router$9.post("/api/v1/view/notification_one/:id", async (req, res) => {
1893
2582
  try {
1894
2583
  const request = await micro.json(req);
1895
2584
  const { requestId, serviceName } = request;
@@ -1918,7 +2607,7 @@ router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
1918
2607
  });
1919
2608
  }
1920
2609
  });
1921
- router$7.post("/api/v1/view/notification_filter", async (req, res) => {
2610
+ router$9.post("/api/v1/view/notification_filter", async (req, res) => {
1922
2611
  try {
1923
2612
  const request = await micro.json(req);
1924
2613
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1947,7 +2636,7 @@ router$7.post("/api/v1/view/notification_filter", async (req, res) => {
1947
2636
  }
1948
2637
  });
1949
2638
  // StorageViewService endpoints
1950
- router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
2639
+ router$9.post("/api/v1/view/storage_one/:id", async (req, res) => {
1951
2640
  try {
1952
2641
  const request = await micro.json(req);
1953
2642
  const { requestId, serviceName } = request;
@@ -1976,7 +2665,7 @@ router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
1976
2665
  });
1977
2666
  }
1978
2667
  });
1979
- router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
2668
+ router$9.post("/api/v1/view/storage_list/live", async (req, res) => {
1980
2669
  try {
1981
2670
  const request = await micro.json(req);
1982
2671
  const { requestId, serviceName } = request;
@@ -2004,7 +2693,7 @@ router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
2004
2693
  });
2005
2694
  }
2006
2695
  });
2007
- router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2696
+ router$9.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2008
2697
  try {
2009
2698
  const request = await micro.json(req);
2010
2699
  const { requestId, serviceName } = request;
@@ -2033,7 +2722,7 @@ router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2033
2722
  }
2034
2723
  });
2035
2724
  // LogViewService endpoints
2036
- router$7.post("/api/v1/view/log_list", async (req, res) => {
2725
+ router$9.post("/api/v1/view/log_list", async (req, res) => {
2037
2726
  try {
2038
2727
  const request = await micro.json(req);
2039
2728
  const { requestId, serviceName } = request;
@@ -2061,7 +2750,7 @@ router$7.post("/api/v1/view/log_list", async (req, res) => {
2061
2750
  });
2062
2751
  }
2063
2752
  });
2064
- router$7.post("/api/v1/view/log_one/:id", async (req, res) => {
2753
+ router$9.post("/api/v1/view/log_one/:id", async (req, res) => {
2065
2754
  try {
2066
2755
  const request = await micro.json(req);
2067
2756
  const { requestId, serviceName } = request;
@@ -2090,7 +2779,7 @@ router$7.post("/api/v1/view/log_one/:id", async (req, res) => {
2090
2779
  });
2091
2780
  }
2092
2781
  });
2093
- router$7.post("/api/v1/view/log_filter", async (req, res) => {
2782
+ router$9.post("/api/v1/view/log_filter", async (req, res) => {
2094
2783
  try {
2095
2784
  const request = await micro.json(req);
2096
2785
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -2118,8 +2807,66 @@ router$7.post("/api/v1/view/log_filter", async (req, res) => {
2118
2807
  });
2119
2808
  }
2120
2809
  });
2810
+ // SignalViewService endpoints
2811
+ router$9.post("/api/v1/view/signal_last_update/:id", async (req, res) => {
2812
+ try {
2813
+ const request = await micro.json(req);
2814
+ const { requestId, serviceName } = request;
2815
+ const signalId = req.params.id;
2816
+ const data = await ioc.signalViewService.getLastUpdateTimestamp(signalId);
2817
+ const result = {
2818
+ data,
2819
+ status: "ok",
2820
+ error: "",
2821
+ requestId,
2822
+ serviceName,
2823
+ };
2824
+ ioc.loggerService.log("/api/v1/view/signal_last_update/:id ok", {
2825
+ request,
2826
+ result: omit(result, "data"),
2827
+ });
2828
+ return await micro.send(res, 200, result);
2829
+ }
2830
+ catch (error) {
2831
+ ioc.loggerService.log("/api/v1/view/signal_last_update/:id error", {
2832
+ error: functoolsKit.errorData(error),
2833
+ });
2834
+ return await micro.send(res, 200, {
2835
+ status: "error",
2836
+ error: functoolsKit.getErrorMessage(error),
2837
+ });
2838
+ }
2839
+ });
2840
+ router$9.post("/api/v1/view/signal_pending", async (req, res) => {
2841
+ try {
2842
+ const request = await micro.json(req);
2843
+ const { symbol, requestId, serviceName } = request;
2844
+ const data = await ioc.signalViewService.getPendingSignal(symbol);
2845
+ const result = {
2846
+ data,
2847
+ status: "ok",
2848
+ error: "",
2849
+ requestId,
2850
+ serviceName,
2851
+ };
2852
+ ioc.loggerService.log("/api/v1/view/signal_pending ok", {
2853
+ request,
2854
+ result: omit(result, "data"),
2855
+ });
2856
+ return await micro.send(res, 200, result);
2857
+ }
2858
+ catch (error) {
2859
+ ioc.loggerService.log("/api/v1/view/signal_pending error", {
2860
+ error: functoolsKit.errorData(error),
2861
+ });
2862
+ return await micro.send(res, 200, {
2863
+ status: "error",
2864
+ error: functoolsKit.getErrorMessage(error),
2865
+ });
2866
+ }
2867
+ });
2121
2868
  // StatusViewService endpoints
2122
- router$7.post("/api/v1/view/status_list", async (req, res) => {
2869
+ router$9.post("/api/v1/view/status_list", async (req, res) => {
2123
2870
  try {
2124
2871
  const request = await micro.json(req);
2125
2872
  const { requestId, serviceName } = request;
@@ -2147,7 +2894,7 @@ router$7.post("/api/v1/view/status_list", async (req, res) => {
2147
2894
  });
2148
2895
  }
2149
2896
  });
2150
- router$7.post("/api/v1/view/status_one/:id", async (req, res) => {
2897
+ router$9.post("/api/v1/view/status_one/:id", async (req, res) => {
2151
2898
  try {
2152
2899
  const request = await micro.json(req);
2153
2900
  const { requestId, serviceName } = request;
@@ -2176,6 +2923,91 @@ router$7.post("/api/v1/view/status_one/:id", async (req, res) => {
2176
2923
  });
2177
2924
  }
2178
2925
  });
2926
+ // HeatViewService endpoints
2927
+ router$9.post("/api/v1/view/heat_data", async (req, res) => {
2928
+ try {
2929
+ const request = await micro.json(req);
2930
+ const { requestId, serviceName } = request;
2931
+ const data = await ioc.heatViewService.getStrategyHeatData();
2932
+ const result = {
2933
+ data,
2934
+ status: "ok",
2935
+ error: "",
2936
+ requestId,
2937
+ serviceName,
2938
+ };
2939
+ ioc.loggerService.log("/api/v1/view/heat_data ok", {
2940
+ request,
2941
+ result: omit(result, "data"),
2942
+ });
2943
+ return await micro.send(res, 200, result);
2944
+ }
2945
+ catch (error) {
2946
+ ioc.loggerService.log("/api/v1/view/heat_data error", {
2947
+ error: functoolsKit.errorData(error),
2948
+ });
2949
+ return await micro.send(res, 200, {
2950
+ status: "error",
2951
+ error: functoolsKit.getErrorMessage(error),
2952
+ });
2953
+ }
2954
+ });
2955
+ router$9.post("/api/v1/view/heat_report", async (req, res) => {
2956
+ try {
2957
+ const request = await micro.json(req);
2958
+ const { requestId, serviceName } = request;
2959
+ const data = await ioc.heatViewService.getStrategyHeatReport();
2960
+ const result = {
2961
+ data,
2962
+ status: "ok",
2963
+ error: "",
2964
+ requestId,
2965
+ serviceName,
2966
+ };
2967
+ ioc.loggerService.log("/api/v1/view/heat_report ok", {
2968
+ request,
2969
+ result: omit(result, "data"),
2970
+ });
2971
+ return await micro.send(res, 200, result);
2972
+ }
2973
+ catch (error) {
2974
+ ioc.loggerService.log("/api/v1/view/heat_report error", {
2975
+ error: functoolsKit.errorData(error),
2976
+ });
2977
+ return await micro.send(res, 200, {
2978
+ status: "error",
2979
+ error: functoolsKit.getErrorMessage(error),
2980
+ });
2981
+ }
2982
+ });
2983
+ router$9.post("/api/v1/view/status_info", async (req, res) => {
2984
+ try {
2985
+ const request = await micro.json(req);
2986
+ const { requestId, serviceName } = request;
2987
+ const data = await ioc.statusViewService.getStatusInfo();
2988
+ const result = {
2989
+ data,
2990
+ status: "ok",
2991
+ error: "",
2992
+ requestId,
2993
+ serviceName,
2994
+ };
2995
+ ioc.loggerService.log("/api/v1/view/status_info ok", {
2996
+ request,
2997
+ result: omit(result, "data"),
2998
+ });
2999
+ return await micro.send(res, 200, result);
3000
+ }
3001
+ catch (error) {
3002
+ ioc.loggerService.log("/api/v1/view/status_info error", {
3003
+ error: functoolsKit.errorData(error),
3004
+ });
3005
+ return await micro.send(res, 200, {
3006
+ status: "error",
3007
+ error: functoolsKit.getErrorMessage(error),
3008
+ });
3009
+ }
3010
+ });
2179
3011
 
2180
3012
  const require$2 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
2181
3013
  function getModulesPath() {
@@ -2184,7 +3016,7 @@ function getModulesPath() {
2184
3016
  return path.join(basePath, "../../../");
2185
3017
  }
2186
3018
 
2187
- const router$6 = Router({
3019
+ const router$8 = Router({
2188
3020
  params: true,
2189
3021
  });
2190
3022
  // getModulesPath
@@ -2201,7 +3033,7 @@ const ASSET_32 = CC_ENABLE_MOCK
2201
3033
  const cache128 = new Map();
2202
3034
  const cache32 = new Map();
2203
3035
  const cacheSvg = new Map();
2204
- router$6.get("/icon/128/:filename", async (req, res) => {
3036
+ router$8.get("/icon/128/:filename", async (req, res) => {
2205
3037
  const filename = req.params.filename;
2206
3038
  // Check cache first
2207
3039
  if (cache128.has(filename)) {
@@ -2217,7 +3049,7 @@ router$6.get("/icon/128/:filename", async (req, res) => {
2217
3049
  }
2218
3050
  return await micro.send(res, 404, "File not found (128)");
2219
3051
  });
2220
- router$6.get("/icon/32/:filename", async (req, res) => {
3052
+ router$8.get("/icon/32/:filename", async (req, res) => {
2221
3053
  const filename = req.params.filename;
2222
3054
  // Check cache first
2223
3055
  if (cache32.has(filename)) {
@@ -2233,7 +3065,7 @@ router$6.get("/icon/32/:filename", async (req, res) => {
2233
3065
  }
2234
3066
  return await micro.send(res, 404, "File not found (32)");
2235
3067
  });
2236
- router$6.get("/icon/svg/:filename", async (req, res) => {
3068
+ router$8.get("/icon/svg/:filename", async (req, res) => {
2237
3069
  const filename = req.params.filename;
2238
3070
  // Check cache first
2239
3071
  if (cacheSvg.has(filename)) {
@@ -2249,7 +3081,7 @@ router$6.get("/icon/svg/:filename", async (req, res) => {
2249
3081
  }
2250
3082
  return await micro.send(res, 404, "File not found (svg)");
2251
3083
  });
2252
- router$6.get("/icon/:filename", async (req, res) => {
3084
+ router$8.get("/icon/:filename", async (req, res) => {
2253
3085
  const filename = req.params.filename;
2254
3086
  // Check cache first
2255
3087
  if (cache32.has(filename)) {
@@ -2266,10 +3098,10 @@ router$6.get("/icon/:filename", async (req, res) => {
2266
3098
  return await micro.send(res, 404, "File not found (root)");
2267
3099
  });
2268
3100
 
2269
- const router$5 = Router({
3101
+ const router$7 = Router({
2270
3102
  params: true,
2271
3103
  });
2272
- router$5.post("/api/v1/dict/symbol/list", async (req, res) => {
3104
+ router$7.post("/api/v1/dict/symbol/list", async (req, res) => {
2273
3105
  try {
2274
3106
  const request = await micro.json(req);
2275
3107
  const { requestId, serviceName } = request;
@@ -2297,7 +3129,7 @@ router$5.post("/api/v1/dict/symbol/list", async (req, res) => {
2297
3129
  });
2298
3130
  }
2299
3131
  });
2300
- router$5.post("/api/v1/dict/symbol/map", async (req, res) => {
3132
+ router$7.post("/api/v1/dict/symbol/map", async (req, res) => {
2301
3133
  try {
2302
3134
  const request = await micro.json(req);
2303
3135
  const { requestId, serviceName } = request;
@@ -2325,7 +3157,7 @@ router$5.post("/api/v1/dict/symbol/map", async (req, res) => {
2325
3157
  });
2326
3158
  }
2327
3159
  });
2328
- router$5.post("/api/v1/dict/symbol/one", async (req, res) => {
3160
+ router$7.post("/api/v1/dict/symbol/one", async (req, res) => {
2329
3161
  try {
2330
3162
  const request = await micro.json(req);
2331
3163
  const { requestId, serviceName, id } = request;
@@ -2354,10 +3186,10 @@ router$5.post("/api/v1/dict/symbol/one", async (req, res) => {
2354
3186
  }
2355
3187
  });
2356
3188
 
2357
- const router$4 = Router({
3189
+ const router$6 = Router({
2358
3190
  params: true,
2359
3191
  });
2360
- router$4.post("/api/v1/markdown_mock/strategy_data", async (req, res) => {
3192
+ router$6.post("/api/v1/markdown_mock/strategy_data", async (req, res) => {
2361
3193
  try {
2362
3194
  const request = await micro.json(req);
2363
3195
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2371,7 +3203,7 @@ router$4.post("/api/v1/markdown_mock/strategy_data", async (req, res) => {
2371
3203
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2372
3204
  }
2373
3205
  });
2374
- router$4.post("/api/v1/markdown_mock/strategy_report", async (req, res) => {
3206
+ router$6.post("/api/v1/markdown_mock/strategy_report", async (req, res) => {
2375
3207
  try {
2376
3208
  const request = await micro.json(req);
2377
3209
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2385,7 +3217,7 @@ router$4.post("/api/v1/markdown_mock/strategy_report", async (req, res) => {
2385
3217
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2386
3218
  }
2387
3219
  });
2388
- router$4.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
3220
+ router$6.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
2389
3221
  try {
2390
3222
  const request = await micro.json(req);
2391
3223
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2399,7 +3231,7 @@ router$4.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
2399
3231
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2400
3232
  }
2401
3233
  });
2402
- router$4.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
3234
+ router$6.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
2403
3235
  try {
2404
3236
  const request = await micro.json(req);
2405
3237
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2413,7 +3245,7 @@ router$4.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
2413
3245
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2414
3246
  }
2415
3247
  });
2416
- router$4.post("/api/v1/markdown_mock/live_data", async (req, res) => {
3248
+ router$6.post("/api/v1/markdown_mock/live_data", async (req, res) => {
2417
3249
  try {
2418
3250
  const request = await micro.json(req);
2419
3251
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2427,7 +3259,7 @@ router$4.post("/api/v1/markdown_mock/live_data", async (req, res) => {
2427
3259
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2428
3260
  }
2429
3261
  });
2430
- router$4.post("/api/v1/markdown_mock/live_report", async (req, res) => {
3262
+ router$6.post("/api/v1/markdown_mock/live_report", async (req, res) => {
2431
3263
  try {
2432
3264
  const request = await micro.json(req);
2433
3265
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2441,7 +3273,7 @@ router$4.post("/api/v1/markdown_mock/live_report", async (req, res) => {
2441
3273
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2442
3274
  }
2443
3275
  });
2444
- router$4.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
3276
+ router$6.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
2445
3277
  try {
2446
3278
  const request = await micro.json(req);
2447
3279
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2455,7 +3287,7 @@ router$4.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
2455
3287
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2456
3288
  }
2457
3289
  });
2458
- router$4.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
3290
+ router$6.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
2459
3291
  try {
2460
3292
  const request = await micro.json(req);
2461
3293
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2469,7 +3301,7 @@ router$4.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
2469
3301
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2470
3302
  }
2471
3303
  });
2472
- router$4.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
3304
+ router$6.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
2473
3305
  try {
2474
3306
  const request = await micro.json(req);
2475
3307
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2483,7 +3315,7 @@ router$4.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
2483
3315
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2484
3316
  }
2485
3317
  });
2486
- router$4.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
3318
+ router$6.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
2487
3319
  try {
2488
3320
  const request = await micro.json(req);
2489
3321
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2497,7 +3329,7 @@ router$4.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
2497
3329
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2498
3330
  }
2499
3331
  });
2500
- router$4.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
3332
+ router$6.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
2501
3333
  try {
2502
3334
  const request = await micro.json(req);
2503
3335
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2511,7 +3343,7 @@ router$4.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
2511
3343
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2512
3344
  }
2513
3345
  });
2514
- router$4.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
3346
+ router$6.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
2515
3347
  try {
2516
3348
  const request = await micro.json(req);
2517
3349
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2525,7 +3357,7 @@ router$4.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
2525
3357
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2526
3358
  }
2527
3359
  });
2528
- router$4.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
3360
+ router$6.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
2529
3361
  try {
2530
3362
  const request = await micro.json(req);
2531
3363
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2539,7 +3371,7 @@ router$4.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
2539
3371
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2540
3372
  }
2541
3373
  });
2542
- router$4.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) => {
3374
+ router$6.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) => {
2543
3375
  try {
2544
3376
  const request = await micro.json(req);
2545
3377
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2553,7 +3385,7 @@ router$4.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) =>
2553
3385
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2554
3386
  }
2555
3387
  });
2556
- router$4.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
3388
+ router$6.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
2557
3389
  try {
2558
3390
  const request = await micro.json(req);
2559
3391
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2567,7 +3399,7 @@ router$4.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
2567
3399
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2568
3400
  }
2569
3401
  });
2570
- router$4.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
3402
+ router$6.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
2571
3403
  try {
2572
3404
  const request = await micro.json(req);
2573
3405
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2581,7 +3413,7 @@ router$4.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
2581
3413
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2582
3414
  }
2583
3415
  });
2584
- router$4.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
3416
+ router$6.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
2585
3417
  try {
2586
3418
  const request = await micro.json(req);
2587
3419
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2595,7 +3427,7 @@ router$4.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
2595
3427
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2596
3428
  }
2597
3429
  });
2598
- router$4.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
3430
+ router$6.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
2599
3431
  try {
2600
3432
  const request = await micro.json(req);
2601
3433
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2609,7 +3441,7 @@ router$4.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
2609
3441
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2610
3442
  }
2611
3443
  });
2612
- router$4.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
3444
+ router$6.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
2613
3445
  try {
2614
3446
  const request = await micro.json(req);
2615
3447
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2623,7 +3455,7 @@ router$4.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
2623
3455
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2624
3456
  }
2625
3457
  });
2626
- router$4.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
3458
+ router$6.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
2627
3459
  try {
2628
3460
  const request = await micro.json(req);
2629
3461
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2637,7 +3469,7 @@ router$4.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
2637
3469
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2638
3470
  }
2639
3471
  });
2640
- router$4.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
3472
+ router$6.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
2641
3473
  try {
2642
3474
  const request = await micro.json(req);
2643
3475
  const { requestId, serviceName, strategyName, exchangeName, frameName } = request;
@@ -2651,7 +3483,7 @@ router$4.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
2651
3483
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2652
3484
  }
2653
3485
  });
2654
- router$4.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
3486
+ router$6.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
2655
3487
  try {
2656
3488
  const request = await micro.json(req);
2657
3489
  const { requestId, serviceName, strategyName, exchangeName, frameName } = request;
@@ -2665,7 +3497,7 @@ router$4.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
2665
3497
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2666
3498
  }
2667
3499
  });
2668
- router$4.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
3500
+ router$6.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
2669
3501
  try {
2670
3502
  const request = await micro.json(req);
2671
3503
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2679,7 +3511,7 @@ router$4.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
2679
3511
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2680
3512
  }
2681
3513
  });
2682
- router$4.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
3514
+ router$6.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
2683
3515
  try {
2684
3516
  const request = await micro.json(req);
2685
3517
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2694,10 +3526,10 @@ router$4.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
2694
3526
  }
2695
3527
  });
2696
3528
 
2697
- const router$3 = Router({
3529
+ const router$5 = Router({
2698
3530
  params: true,
2699
3531
  });
2700
- router$3.post("/api/v1/markdown_view/strategy_data", async (req, res) => {
3532
+ router$5.post("/api/v1/markdown_view/strategy_data", async (req, res) => {
2701
3533
  try {
2702
3534
  const request = await micro.json(req);
2703
3535
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2711,7 +3543,7 @@ router$3.post("/api/v1/markdown_view/strategy_data", async (req, res) => {
2711
3543
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2712
3544
  }
2713
3545
  });
2714
- router$3.post("/api/v1/markdown_view/strategy_report", async (req, res) => {
3546
+ router$5.post("/api/v1/markdown_view/strategy_report", async (req, res) => {
2715
3547
  try {
2716
3548
  const request = await micro.json(req);
2717
3549
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2725,7 +3557,7 @@ router$3.post("/api/v1/markdown_view/strategy_report", async (req, res) => {
2725
3557
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2726
3558
  }
2727
3559
  });
2728
- router$3.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
3560
+ router$5.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
2729
3561
  try {
2730
3562
  const request = await micro.json(req);
2731
3563
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2739,7 +3571,7 @@ router$3.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
2739
3571
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2740
3572
  }
2741
3573
  });
2742
- router$3.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
3574
+ router$5.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
2743
3575
  try {
2744
3576
  const request = await micro.json(req);
2745
3577
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2753,7 +3585,7 @@ router$3.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
2753
3585
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2754
3586
  }
2755
3587
  });
2756
- router$3.post("/api/v1/markdown_view/live_data", async (req, res) => {
3588
+ router$5.post("/api/v1/markdown_view/live_data", async (req, res) => {
2757
3589
  try {
2758
3590
  const request = await micro.json(req);
2759
3591
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2767,7 +3599,7 @@ router$3.post("/api/v1/markdown_view/live_data", async (req, res) => {
2767
3599
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2768
3600
  }
2769
3601
  });
2770
- router$3.post("/api/v1/markdown_view/live_report", async (req, res) => {
3602
+ router$5.post("/api/v1/markdown_view/live_report", async (req, res) => {
2771
3603
  try {
2772
3604
  const request = await micro.json(req);
2773
3605
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2781,7 +3613,7 @@ router$3.post("/api/v1/markdown_view/live_report", async (req, res) => {
2781
3613
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2782
3614
  }
2783
3615
  });
2784
- router$3.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
3616
+ router$5.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
2785
3617
  try {
2786
3618
  const request = await micro.json(req);
2787
3619
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2795,7 +3627,7 @@ router$3.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
2795
3627
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2796
3628
  }
2797
3629
  });
2798
- router$3.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
3630
+ router$5.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
2799
3631
  try {
2800
3632
  const request = await micro.json(req);
2801
3633
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2809,7 +3641,7 @@ router$3.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
2809
3641
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2810
3642
  }
2811
3643
  });
2812
- router$3.post("/api/v1/markdown_view/risk_data", async (req, res) => {
3644
+ router$5.post("/api/v1/markdown_view/risk_data", async (req, res) => {
2813
3645
  try {
2814
3646
  const request = await micro.json(req);
2815
3647
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2823,7 +3655,7 @@ router$3.post("/api/v1/markdown_view/risk_data", async (req, res) => {
2823
3655
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2824
3656
  }
2825
3657
  });
2826
- router$3.post("/api/v1/markdown_view/risk_report", async (req, res) => {
3658
+ router$5.post("/api/v1/markdown_view/risk_report", async (req, res) => {
2827
3659
  try {
2828
3660
  const request = await micro.json(req);
2829
3661
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2837,7 +3669,7 @@ router$3.post("/api/v1/markdown_view/risk_report", async (req, res) => {
2837
3669
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2838
3670
  }
2839
3671
  });
2840
- router$3.post("/api/v1/markdown_view/partial_data", async (req, res) => {
3672
+ router$5.post("/api/v1/markdown_view/partial_data", async (req, res) => {
2841
3673
  try {
2842
3674
  const request = await micro.json(req);
2843
3675
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2851,7 +3683,7 @@ router$3.post("/api/v1/markdown_view/partial_data", async (req, res) => {
2851
3683
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2852
3684
  }
2853
3685
  });
2854
- router$3.post("/api/v1/markdown_view/partial_report", async (req, res) => {
3686
+ router$5.post("/api/v1/markdown_view/partial_report", async (req, res) => {
2855
3687
  try {
2856
3688
  const request = await micro.json(req);
2857
3689
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2865,7 +3697,7 @@ router$3.post("/api/v1/markdown_view/partial_report", async (req, res) => {
2865
3697
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2866
3698
  }
2867
3699
  });
2868
- router$3.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
3700
+ router$5.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
2869
3701
  try {
2870
3702
  const request = await micro.json(req);
2871
3703
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2879,7 +3711,7 @@ router$3.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
2879
3711
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2880
3712
  }
2881
3713
  });
2882
- router$3.post("/api/v1/markdown_view/highest_profit_report", async (req, res) => {
3714
+ router$5.post("/api/v1/markdown_view/highest_profit_report", async (req, res) => {
2883
3715
  try {
2884
3716
  const request = await micro.json(req);
2885
3717
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2893,7 +3725,7 @@ router$3.post("/api/v1/markdown_view/highest_profit_report", async (req, res) =>
2893
3725
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2894
3726
  }
2895
3727
  });
2896
- router$3.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
3728
+ router$5.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
2897
3729
  try {
2898
3730
  const request = await micro.json(req);
2899
3731
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2907,7 +3739,7 @@ router$3.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
2907
3739
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2908
3740
  }
2909
3741
  });
2910
- router$3.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
3742
+ router$5.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
2911
3743
  try {
2912
3744
  const request = await micro.json(req);
2913
3745
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2921,7 +3753,7 @@ router$3.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
2921
3753
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2922
3754
  }
2923
3755
  });
2924
- router$3.post("/api/v1/markdown_view/performance_data", async (req, res) => {
3756
+ router$5.post("/api/v1/markdown_view/performance_data", async (req, res) => {
2925
3757
  try {
2926
3758
  const request = await micro.json(req);
2927
3759
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2935,7 +3767,7 @@ router$3.post("/api/v1/markdown_view/performance_data", async (req, res) => {
2935
3767
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2936
3768
  }
2937
3769
  });
2938
- router$3.post("/api/v1/markdown_view/performance_report", async (req, res) => {
3770
+ router$5.post("/api/v1/markdown_view/performance_report", async (req, res) => {
2939
3771
  try {
2940
3772
  const request = await micro.json(req);
2941
3773
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2949,7 +3781,7 @@ router$3.post("/api/v1/markdown_view/performance_report", async (req, res) => {
2949
3781
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2950
3782
  }
2951
3783
  });
2952
- router$3.post("/api/v1/markdown_view/sync_data", async (req, res) => {
3784
+ router$5.post("/api/v1/markdown_view/sync_data", async (req, res) => {
2953
3785
  try {
2954
3786
  const request = await micro.json(req);
2955
3787
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2963,7 +3795,7 @@ router$3.post("/api/v1/markdown_view/sync_data", async (req, res) => {
2963
3795
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2964
3796
  }
2965
3797
  });
2966
- router$3.post("/api/v1/markdown_view/sync_report", async (req, res) => {
3798
+ router$5.post("/api/v1/markdown_view/sync_report", async (req, res) => {
2967
3799
  try {
2968
3800
  const request = await micro.json(req);
2969
3801
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2977,7 +3809,7 @@ router$3.post("/api/v1/markdown_view/sync_report", async (req, res) => {
2977
3809
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2978
3810
  }
2979
3811
  });
2980
- router$3.post("/api/v1/markdown_view/heat_data", async (req, res) => {
3812
+ router$5.post("/api/v1/markdown_view/heat_data", async (req, res) => {
2981
3813
  try {
2982
3814
  const request = await micro.json(req);
2983
3815
  const { requestId, serviceName, strategyName, exchangeName, frameName, backtest } = request;
@@ -2991,7 +3823,7 @@ router$3.post("/api/v1/markdown_view/heat_data", async (req, res) => {
2991
3823
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2992
3824
  }
2993
3825
  });
2994
- router$3.post("/api/v1/markdown_view/heat_report", async (req, res) => {
3826
+ router$5.post("/api/v1/markdown_view/heat_report", async (req, res) => {
2995
3827
  try {
2996
3828
  const request = await micro.json(req);
2997
3829
  const { requestId, serviceName, strategyName, exchangeName, frameName, backtest } = request;
@@ -3005,7 +3837,7 @@ router$3.post("/api/v1/markdown_view/heat_report", async (req, res) => {
3005
3837
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3006
3838
  }
3007
3839
  });
3008
- router$3.post("/api/v1/markdown_view/walker_data", async (req, res) => {
3840
+ router$5.post("/api/v1/markdown_view/walker_data", async (req, res) => {
3009
3841
  try {
3010
3842
  const request = await micro.json(req);
3011
3843
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -3019,7 +3851,7 @@ router$3.post("/api/v1/markdown_view/walker_data", async (req, res) => {
3019
3851
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3020
3852
  }
3021
3853
  });
3022
- router$3.post("/api/v1/markdown_view/walker_report", async (req, res) => {
3854
+ router$5.post("/api/v1/markdown_view/walker_report", async (req, res) => {
3023
3855
  try {
3024
3856
  const request = await micro.json(req);
3025
3857
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -3034,6 +3866,70 @@ router$3.post("/api/v1/markdown_view/walker_report", async (req, res) => {
3034
3866
  }
3035
3867
  });
3036
3868
 
3869
+ const router$4 = Router({
3870
+ params: true,
3871
+ });
3872
+ router$4.post("/api/v1/explorer_mock/tree", async (req, res) => {
3873
+ try {
3874
+ const request = await micro.json(req);
3875
+ const { requestId, serviceName } = request;
3876
+ const data = await ioc.explorerMockService.getTree();
3877
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3878
+ ioc.loggerService.log("/api/v1/explorer_mock/tree ok", { request, result: omit(result, "data") });
3879
+ return await micro.send(res, 200, result);
3880
+ }
3881
+ catch (error) {
3882
+ ioc.loggerService.log("/api/v1/explorer_mock/tree error", { error: functoolsKit.errorData(error) });
3883
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3884
+ }
3885
+ });
3886
+ router$4.post("/api/v1/explorer_mock/node", async (req, res) => {
3887
+ try {
3888
+ const request = await micro.json(req);
3889
+ const { requestId, serviceName, path } = request;
3890
+ const data = await ioc.explorerMockService.getNode(path);
3891
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3892
+ ioc.loggerService.log("/api/v1/explorer_mock/node ok", { request, result: omit(result, "data") });
3893
+ return await micro.send(res, 200, result);
3894
+ }
3895
+ catch (error) {
3896
+ ioc.loggerService.log("/api/v1/explorer_mock/node error", { error: functoolsKit.errorData(error) });
3897
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3898
+ }
3899
+ });
3900
+
3901
+ const router$3 = Router({
3902
+ params: true,
3903
+ });
3904
+ router$3.post("/api/v1/explorer_view/tree", async (req, res) => {
3905
+ try {
3906
+ const request = await micro.json(req);
3907
+ const { requestId, serviceName } = request;
3908
+ const data = await ioc.explorerViewService.getTree();
3909
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3910
+ ioc.loggerService.log("/api/v1/explorer_view/tree ok", { request, result: omit(result, "data") });
3911
+ return await micro.send(res, 200, result);
3912
+ }
3913
+ catch (error) {
3914
+ ioc.loggerService.log("/api/v1/explorer_view/tree error", { error: functoolsKit.errorData(error) });
3915
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3916
+ }
3917
+ });
3918
+ router$3.post("/api/v1/explorer_view/node", async (req, res) => {
3919
+ try {
3920
+ const request = await micro.json(req);
3921
+ const { requestId, serviceName, path } = request;
3922
+ const data = await ioc.explorerViewService.getNode(path);
3923
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3924
+ ioc.loggerService.log("/api/v1/explorer_view/node ok", { request, result: omit(result, "data") });
3925
+ return await micro.send(res, 200, result);
3926
+ }
3927
+ catch (error) {
3928
+ ioc.loggerService.log("/api/v1/explorer_view/node error", { error: functoolsKit.errorData(error) });
3929
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3930
+ }
3931
+ });
3932
+
3037
3933
  const router$2 = Router({
3038
3934
  params: true,
3039
3935
  });
@@ -3105,25 +4001,31 @@ const router = Router({
3105
4001
  params: true,
3106
4002
  });
3107
4003
  router.all("/api/v1/health/*", (req, res) => {
3108
- return router$9(req, res, finalhandler(req, res));
4004
+ return router$b(req, res, finalhandler(req, res));
3109
4005
  });
3110
4006
  router.all("/api/v1/mock/*", (req, res) => {
3111
- return router$8(req, res, finalhandler(req, res));
4007
+ return router$a(req, res, finalhandler(req, res));
3112
4008
  });
3113
4009
  router.all("/api/v1/view/*", (req, res) => {
3114
- return router$7(req, res, finalhandler(req, res));
4010
+ return router$9(req, res, finalhandler(req, res));
3115
4011
  });
3116
4012
  router.all("/api/v1/markdown_mock/*", (req, res) => {
3117
- return router$4(req, res, finalhandler(req, res));
4013
+ return router$6(req, res, finalhandler(req, res));
3118
4014
  });
3119
4015
  router.all("/api/v1/markdown_view/*", (req, res) => {
4016
+ return router$5(req, res, finalhandler(req, res));
4017
+ });
4018
+ router.all("/api/v1/explorer_mock/*", (req, res) => {
4019
+ return router$4(req, res, finalhandler(req, res));
4020
+ });
4021
+ router.all("/api/v1/explorer_view/*", (req, res) => {
3120
4022
  return router$3(req, res, finalhandler(req, res));
3121
4023
  });
3122
4024
  router.all("/icon/*", (req, res) => {
3123
- return router$6(req, res, finalhandler(req, res));
4025
+ return router$8(req, res, finalhandler(req, res));
3124
4026
  });
3125
4027
  router.all("/api/v1/dict/*", (req, res) => {
3126
- return router$5(req, res, finalhandler(req, res));
4028
+ return router$7(req, res, finalhandler(req, res));
3127
4029
  });
3128
4030
  router.all("/api/v1/global/*", (req, res) => {
3129
4031
  return router$2(req, res, finalhandler(req, res));