@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.mjs CHANGED
@@ -6,9 +6,11 @@ import finalhandler from 'finalhandler';
6
6
  import serveHandler from 'serve-handler';
7
7
  import os from 'os';
8
8
  import { createActivator } from 'di-kit';
9
- import { alignToInterval, Exchange, Notification, Storage, Log, Live, Strategy, Backtest, Breakeven, Risk, Partial, HighestProfit, Schedule, Performance, Sync, Heat, Walker, lib } from 'backtest-kit';
9
+ import { alignToInterval, Exchange, Backtest, Live, listExchangeSchema, Notification, Storage, Log, lib, Heat, Strategy, Breakeven, Risk, Partial, HighestProfit, Schedule, Performance, Sync, Walker, StorageLive, StorageBacktest } from 'backtest-kit';
10
10
  import fs, { readdir, readFile } from 'fs/promises';
11
11
  import path, { join, dirname } from 'path';
12
+ import mime from 'mime-types';
13
+ import { createHash } from 'crypto';
12
14
  import { createRequire } from 'module';
13
15
  import { existsSync } from 'fs';
14
16
 
@@ -17,10 +19,10 @@ const CC_WWWROOT_HOST = process.env.CC_WWWROOT_HOST || "0.0.0.0";
17
19
  const CC_WWWROOT_PORT = parseInt(process.env.CC_WWWROOT_PORT) || 60050;
18
20
  const CC_ENABLE_MOCK = !!parseInt(process.env.CC_ENABLE_MOCK) || false;
19
21
 
20
- const router$9 = Router({
22
+ const router$b = Router({
21
23
  params: true,
22
24
  });
23
- router$9.get("/api/v1/health/health_check", async (req, res) => {
25
+ router$b.get("/api/v1/health/health_check", async (req, res) => {
24
26
  const [cpuLoad] = os.loadavg();
25
27
  return await micro.send(res, 200, {
26
28
  uptime: process.uptime(),
@@ -69,6 +71,9 @@ const mockServices$1 = {
69
71
  logMockService: Symbol("logMockService"),
70
72
  statusMockService: Symbol("statusMockService"),
71
73
  markdownMockService: Symbol("markdownMockService"),
74
+ explorerMockService: Symbol("explorerMockService"),
75
+ signalMockService: Symbol("signalMockService"),
76
+ heatMockService: Symbol("heatMockService"),
72
77
  };
73
78
  const viewServices$1 = {
74
79
  notificationViewService: Symbol("notificationViewService"),
@@ -77,6 +82,9 @@ const viewServices$1 = {
77
82
  logViewService: Symbol("logViewService"),
78
83
  statusViewService: Symbol("statusViewService"),
79
84
  markdownViewService: Symbol("markdownViewService"),
85
+ explorerViewService: Symbol("explorerViewService"),
86
+ signalViewService: Symbol("signalViewService"),
87
+ heatViewService: Symbol("heatViewService"),
80
88
  };
81
89
  const TYPES = {
82
90
  ...baseServices$1,
@@ -145,6 +153,14 @@ class ExchangeService {
145
153
  exchangeName: dto.exchangeName,
146
154
  }, undefined, sDate, eDate);
147
155
  };
156
+ this.getLastCandles = async (dto) => {
157
+ this.loggerService.log("exchangeService getLastCandles", {
158
+ dto,
159
+ });
160
+ return await Exchange.getCandles(dto.symbol, dto.interval, dto.limit, {
161
+ exchangeName: dto.exchangeName,
162
+ });
163
+ };
148
164
  }
149
165
  }
150
166
 
@@ -179,9 +195,9 @@ class LoggerService {
179
195
  }
180
196
  }
181
197
 
182
- const MOCK_PATH$3 = "./mock/notifications.json";
198
+ const MOCK_PATH$5 = "./mock/notifications.json";
183
199
  const READ_NOTIFICATION_LIST_FN = singleshot(async () => {
184
- const data = await fs.readFile(MOCK_PATH$3, "utf-8");
200
+ const data = await fs.readFile(MOCK_PATH$5, "utf-8");
185
201
  return JSON.parse(data);
186
202
  });
187
203
  const DEFAULT_LIMIT$3 = 25;
@@ -241,9 +257,9 @@ class NotificationMockService {
241
257
  }
242
258
  }
243
259
 
244
- const MOCK_PATH$2 = "./mock/db";
260
+ const MOCK_PATH$4 = "./mock/db";
245
261
  const READ_BACKTEST_STORAGE_FN = singleshot(async () => {
246
- const dbPath = join(process.cwd(), MOCK_PATH$2);
262
+ const dbPath = join(process.cwd(), MOCK_PATH$4);
247
263
  const files = await readdir(dbPath);
248
264
  const signals = [];
249
265
  for (const file of files) {
@@ -278,7 +294,7 @@ class StorageMockService {
278
294
  }
279
295
  }
280
296
 
281
- const MS_PER_MINUTE$1 = 60000;
297
+ const HISTORY_LAST_CANDLES_LIMIT$1 = 200;
282
298
  class ExchangeMockService {
283
299
  constructor() {
284
300
  this.loggerService = inject(TYPES.loggerService);
@@ -311,22 +327,56 @@ class ExchangeMockService {
311
327
  if (!signal) {
312
328
  throw new Error(`Signal with ID ${signalId} not found`);
313
329
  }
314
- const { pendingAt, scheduledAt, minuteEstimatedTime, } = signal;
330
+ const { pendingAt, scheduledAt, updatedAt } = signal;
315
331
  const eventAt = pendingAt || scheduledAt;
316
332
  return await this.exchangeService.getRangeCandles({
317
333
  symbol: signal.symbol,
318
334
  exchangeName: signal.exchangeName,
319
335
  signalStartTime: eventAt,
320
- signalStopTime: eventAt + minuteEstimatedTime * MS_PER_MINUTE$1,
336
+ signalStopTime: alignToInterval(new Date(updatedAt), interval).getTime(),
337
+ interval,
338
+ });
339
+ };
340
+ this.getLastCandles = async (symbol, interval) => {
341
+ this.loggerService.log("exchangeMockService getLastCandles", {
342
+ symbol,
321
343
  interval,
322
344
  });
345
+ const [backtestItem] = await Backtest.list();
346
+ const [liveItem] = await Live.list();
347
+ const [exchangeItem] = await listExchangeSchema();
348
+ if (backtestItem) {
349
+ return await this.exchangeService.getLastCandles({
350
+ symbol,
351
+ limit: HISTORY_LAST_CANDLES_LIMIT$1,
352
+ exchangeName: backtestItem.exchangeName,
353
+ interval,
354
+ });
355
+ }
356
+ if (liveItem) {
357
+ return await this.exchangeService.getLastCandles({
358
+ symbol,
359
+ limit: HISTORY_LAST_CANDLES_LIMIT$1,
360
+ exchangeName: liveItem.exchangeName,
361
+ interval,
362
+ });
363
+ }
364
+ if (exchangeItem) {
365
+ return await this.exchangeService.getLastCandles({
366
+ symbol,
367
+ limit: HISTORY_LAST_CANDLES_LIMIT$1,
368
+ exchangeName: exchangeItem.exchangeName,
369
+ interval,
370
+ });
371
+ }
372
+ throw new Error(`exchangeMockService getLastCandles no pending strategy symbol=${symbol} interval=${interval}`);
323
373
  };
324
374
  }
325
375
  }
326
376
 
327
- const MOCK_PATH$1 = "./mock/logs.json";
377
+ const MOCK_PATH$3 = "./mock/logs.json";
328
378
  const READ_LOG_LIST_FN = singleshot(async () => {
329
- const data = await fs.readFile(MOCK_PATH$1, "utf-8");
379
+ const data = await fs.readFile(MOCK_PATH$3, "utf-8");
330
380
  return JSON.parse(data);
331
381
  });
332
382
  const DEFAULT_LIMIT$2 = 25;
@@ -374,14 +424,24 @@ class LogMockService {
374
424
  }
375
425
  }
376
426
 
377
- const MOCK_PATH = "./mock/status.json";
427
+ const MOCK_PATH$2 = "./mock/status.json";
428
+ const MOCK_INFO_PATH = "./mock/status-info.json";
378
429
  const READ_STATUS_LIST_FN = singleshot(async () => {
379
- const data = await fs.readFile(MOCK_PATH, "utf-8");
430
+ const data = await fs.readFile(MOCK_PATH$2, "utf-8");
431
+ return JSON.parse(data);
432
+ });
433
+ const READ_STATUS_INFO_FN = singleshot(async () => {
434
+ const data = await fs.readFile(MOCK_INFO_PATH, "utf-8");
380
435
  return JSON.parse(data);
381
436
  });
382
437
  class StatusMockService {
383
438
  constructor() {
384
439
  this.loggerService = inject(TYPES.loggerService);
440
+ this.signalMockService = inject(TYPES.signalMockService);
441
+ this.getStatusInfo = async () => {
442
+ this.loggerService.log("statusMockService getStatusInfo");
443
+ return await READ_STATUS_INFO_FN();
444
+ };
385
445
  this.getStatusList = async () => {
386
446
  this.loggerService.log("statusMockService getStatusList");
387
447
  const list = await READ_STATUS_LIST_FN();
@@ -401,33 +461,36 @@ class StatusMockService {
401
461
  this.getStatusOne = async (id) => {
402
462
  this.loggerService.log("statusMockService getStatusOne", { id });
403
463
  const list = await READ_STATUS_LIST_FN();
404
- const signal = list.find((s) => s.id === id);
405
- if (!signal) {
464
+ const status = list.find((s) => s.id === id);
465
+ if (!status) {
406
466
  return null;
407
467
  }
408
- const positionEntries = signal._entry ?? [];
468
+ const updatedAt = await this.signalMockService.getLastUpdateTimestamp(status.signalId);
469
+ const positionEntries = status._entry ?? [];
409
470
  const positionLevels = positionEntries.map((e) => e.price);
410
- const positionPartials = signal._partial ?? [];
471
+ const positionPartials = status._partial ?? [];
411
472
  return {
412
- signalId: signal.signalId,
413
- position: signal.position,
414
- symbol: signal.symbol,
415
- exchangeName: signal.exchangeName,
416
- strategyName: signal.strategyName,
417
- totalEntries: signal.totalEntries,
418
- totalPartials: signal.totalPartials,
419
- originalPriceStopLoss: signal.originalPriceStopLoss,
420
- originalPriceTakeProfit: signal.originalPriceTakeProfit,
421
- originalPriceOpen: signal.originalPriceOpen,
422
- priceOpen: signal.priceOpen,
423
- priceTakeProfit: signal.priceTakeProfit,
424
- priceStopLoss: signal.priceStopLoss,
425
- pnlPercentage: signal.pnl.pnlPercentage,
426
- pnlCost: signal.pnl.pnlCost,
427
- pnlEntries: signal.pnl.pnlEntries,
428
- partialExecuted: signal.partialExecuted,
429
- minuteEstimatedTime: signal.minuteEstimatedTime,
430
- pendingAt: signal.pendingAt,
473
+ signalId: status.signalId,
474
+ position: status.position,
475
+ symbol: status.symbol,
476
+ exchangeName: status.exchangeName,
477
+ strategyName: status.strategyName,
478
+ totalEntries: status.totalEntries,
479
+ totalPartials: status.totalPartials,
480
+ originalPriceStopLoss: status.originalPriceStopLoss,
481
+ originalPriceTakeProfit: status.originalPriceTakeProfit,
482
+ originalPriceOpen: status.originalPriceOpen,
483
+ priceOpen: status.priceOpen,
484
+ priceTakeProfit: status.priceTakeProfit,
485
+ priceStopLoss: status.priceStopLoss,
486
+ pnlPercentage: status.pnl.pnlPercentage,
487
+ pnlCost: status.pnl.pnlCost,
488
+ pnlEntries: status.pnl.pnlEntries,
489
+ partialExecuted: status.partialExecuted,
490
+ minuteEstimatedTime: status.minuteEstimatedTime,
491
+ pendingAt: status.pendingAt,
492
+ timestamp: status.timestamp,
493
+ updatedAt,
431
494
  positionLevels,
432
495
  positionEntries,
433
496
  positionPartials,
@@ -577,6 +640,127 @@ class MarkdownMockService {
577
640
  }
578
641
  }
579
642
 
643
+ const deepFlat = (arr) => {
644
+ const result = [];
645
+ const seen = new Set();
646
+ const process = (entries = []) => entries.forEach((entry) => {
647
+ if (seen.has(entry)) {
648
+ return;
649
+ }
650
+ seen.add(entry);
651
+ if (entry.type === "directory") {
652
+ process(entry.nodes);
653
+ }
654
+ result.push(entry);
655
+ });
656
+ process(arr);
657
+ return result;
658
+ };
659
+ const MOCK_PATH$1 = "./mock/explorer.json";
660
+ const READ_EXPLORER_TREE_FN = singleshot(async () => {
661
+ const data = await fs.readFile(MOCK_PATH$1, "utf-8");
662
+ return JSON.parse(data);
663
+ });
664
+ const READ_EXPLORER_INDEX_FN = singleshot(async () => {
665
+ const tree = await READ_EXPLORER_TREE_FN();
666
+ const treeList = deepFlat(tree);
667
+ if (treeList.length === 0) {
668
+ return {};
669
+ }
670
+ return treeList.reduce((acm, cur) => {
671
+ if (cur.type === "file" && "content" in cur) {
672
+ return { ...acm, [cur.path]: cur };
673
+ }
674
+ return acm;
675
+ }, {});
676
+ });
677
+ class ExplorerMockService {
678
+ constructor() {
679
+ this.loggerService = inject(TYPES.loggerService);
680
+ this.getNode = async (nodePath) => {
681
+ this.loggerService.log("explorerMockService getNode", {
682
+ nodePath,
683
+ });
684
+ const index = await READ_EXPLORER_INDEX_FN();
685
+ return index[nodePath]?.content ?? "";
686
+ };
687
+ this.getTree = async () => {
688
+ this.loggerService.log("explorerMockService getTree");
689
+ return await READ_EXPLORER_TREE_FN();
690
+ };
691
+ }
692
+ }
693
+
694
+ const MOCK_PATH = "./mock/db";
695
+ const MOCK_SIGNAL_PATH = "./mock/signal.json";
696
+ const READ_SIGNAL_STORAGE_FN = singleshot(async () => {
697
+ const dbPath = join(process.cwd(), MOCK_PATH);
698
+ const files = await readdir(dbPath);
699
+ const signals = [];
700
+ for (const file of files) {
701
+ if (!file.endsWith(".json")) {
702
+ continue;
703
+ }
704
+ const filePath = join(dbPath, file);
705
+ signals.push(JSON.parse(await readFile(filePath, "utf-8")));
706
+ }
707
+ return signals;
708
+ });
709
+ const READ_PENDING_SIGNAL_FN = singleshot(async () => {
710
+ const filePath = join(process.cwd(), MOCK_SIGNAL_PATH);
711
+ return JSON.parse(await readFile(filePath, "utf-8"));
712
+ });
713
+ class SignalMockService {
714
+ constructor() {
715
+ this.loggerService = inject(TYPES.loggerService);
716
+ this.getLastUpdateTimestamp = async (signalId) => {
717
+ this.loggerService.log("signalMockService getLastUpdateTimestamp", {
718
+ signalId,
719
+ });
720
+ const signalList = await READ_SIGNAL_STORAGE_FN();
721
+ const signalMap = new Map(signalList.map((signal) => [signal.id, signal]));
722
+ const signal = signalMap.get(signalId);
723
+ if (!signal) {
724
+ throw new Error(`SignalMockService getLastUpdateTimestamp signal not found signalId=${signalId}`);
725
+ }
726
+ return signal.updatedAt;
727
+ };
728
+ this.getPendingSignal = async (symbol) => {
729
+ this.loggerService.log("signalMockService getPendingSignal", {
730
+ symbol,
731
+ });
732
+ const signal = await READ_PENDING_SIGNAL_FN();
733
+ if (signal.symbol !== symbol) {
734
+ return null;
735
+ }
736
+ return signal;
737
+ };
738
+ }
739
+ }
740
+
741
+ const MOCK_DATA_PATH = "./mock/heat.json";
742
+ const MOCK_REPORT_PATH = "./mock/heat-report.md";
743
+ const READ_HEAT_DATA_FN = singleshot(async () => {
744
+ const data = await fs.readFile(MOCK_DATA_PATH, "utf-8");
745
+ return JSON.parse(data);
746
+ });
747
+ const READ_HEAT_REPORT_FN = singleshot(async () => {
748
+ return await fs.readFile(MOCK_REPORT_PATH, "utf-8");
749
+ });
750
+ class HeatMockService {
751
+ constructor() {
752
+ this.loggerService = inject(TYPES.loggerService);
753
+ this.getStrategyHeatData = async () => {
754
+ this.loggerService.log("heatMockService getStrategyHeatData");
755
+ return await READ_HEAT_DATA_FN();
756
+ };
757
+ this.getStrategyHeatReport = async () => {
758
+ this.loggerService.log("heatMockService getStrategyHeatReport");
759
+ return await READ_HEAT_REPORT_FN();
760
+ };
761
+ }
762
+ }
763
+
580
764
  const DEFAULT_LIMIT$1 = 25;
581
765
  const DEFAULT_OFFSET$1 = 0;
582
766
  const CREATE_FILTER_LIST_FN$1 = (filterData) => Object.keys(filterData).map((key) => (row) => new RegExp(filterData[key], "i").test(row[key]));
@@ -721,13 +905,14 @@ class StorageViewService {
721
905
  }
722
906
  }
723
907
 
724
- const MS_PER_MINUTE = 60000;
908
+ const HISTORY_LAST_CANDLES_LIMIT = 200;
725
909
  class ExchangeViewService {
726
910
  constructor() {
727
911
  this.loggerService = inject(TYPES.loggerService);
728
912
  this.storageViewService = inject(TYPES.storageViewService);
729
913
  this.exchangeService = inject(TYPES.exchangeService);
730
914
  this.exchangeMockService = inject(TYPES.exchangeMockService);
915
+ this.signalViewService = inject(TYPES.signalViewService);
731
916
  this.getSignalCandles = async (signalId, interval) => {
732
917
  this.loggerService.log("exchangeViewService getCandles", {
733
918
  signalId,
@@ -761,15 +946,53 @@ class ExchangeViewService {
761
946
  if (!signal) {
762
947
  throw new Error(`Signal with ID ${signalId} not found`);
763
948
  }
764
- const { pendingAt, scheduledAt, minuteEstimatedTime, } = signal;
949
+ const { pendingAt, scheduledAt } = signal;
765
950
  const eventAt = pendingAt || scheduledAt;
951
+ const updatedAt = await this.signalViewService.getLastUpdateTimestamp(signalId);
766
952
  return await this.exchangeService.getRangeCandles({
767
953
  symbol: signal.symbol,
768
954
  exchangeName: signal.exchangeName,
769
955
  signalStartTime: eventAt,
770
- signalStopTime: eventAt + minuteEstimatedTime * MS_PER_MINUTE,
956
+ signalStopTime: alignToInterval(new Date(updatedAt), interval).getTime(),
957
+ interval,
958
+ });
959
+ };
960
+ this.getLastCandles = async (symbol, interval) => {
961
+ this.loggerService.log("exchangeViewService getLastCandles", {
962
+ symbol,
771
963
  interval,
772
964
  });
965
+ if (CC_ENABLE_MOCK) {
966
+ return await this.exchangeMockService.getLastCandles(symbol, interval);
967
+ }
968
+ const [backtestItem] = await Backtest.list();
969
+ const [liveItem] = await Live.list();
970
+ const [exchangeItem] = await listExchangeSchema();
971
+ if (backtestItem) {
972
+ return await this.exchangeService.getLastCandles({
973
+ symbol,
974
+ limit: HISTORY_LAST_CANDLES_LIMIT,
975
+ exchangeName: backtestItem.exchangeName,
976
+ interval,
977
+ });
978
+ }
979
+ if (liveItem) {
980
+ return await this.exchangeService.getLastCandles({
981
+ symbol,
982
+ limit: HISTORY_LAST_CANDLES_LIMIT,
983
+ exchangeName: liveItem.exchangeName,
984
+ interval,
985
+ });
986
+ }
987
+ if (exchangeItem) {
988
+ return await this.exchangeService.getLastCandles({
989
+ symbol,
990
+ limit: HISTORY_LAST_CANDLES_LIMIT,
991
+ exchangeName: exchangeItem.exchangeName,
992
+ interval,
993
+ });
994
+ }
995
+ throw new Error(`exchangeViewService getLastCandles no pending strategy symbol=${symbol} interval=${interval}`);
773
996
  };
774
997
  }
775
998
  }
@@ -833,6 +1056,7 @@ class StatusViewService {
833
1056
  constructor() {
834
1057
  this.loggerService = inject(TYPES.loggerService);
835
1058
  this.statusMockService = inject(TYPES.statusMockService);
1059
+ this.signalViewService = inject(TYPES.signalViewService);
836
1060
  this.getStatusList = async () => {
837
1061
  this.loggerService.log("statusViewService getStatusList");
838
1062
  if (CC_ENABLE_MOCK) {
@@ -895,6 +1119,12 @@ class StatusViewService {
895
1119
  if (!positionPartials) {
896
1120
  return null;
897
1121
  }
1122
+ const timestamp = await lib.timeMetaService.getTimestamp(pendingSignal.symbol, {
1123
+ strategyName: pendingSignal.strategyName,
1124
+ exchangeName: pendingSignal.exchangeName,
1125
+ frameName: pendingSignal.frameName,
1126
+ }, false);
1127
+ const updatedAt = await this.signalViewService.getLastUpdateTimestamp(pendingSignal.id);
898
1128
  return {
899
1129
  signalId: pendingSignal.id,
900
1130
  position: pendingSignal.position,
@@ -915,11 +1145,80 @@ class StatusViewService {
915
1145
  partialExecuted: pendingSignal.partialExecuted,
916
1146
  pendingAt: pendingSignal.pendingAt,
917
1147
  minuteEstimatedTime: pendingSignal.minuteEstimatedTime,
1148
+ timestamp,
1149
+ updatedAt,
918
1150
  positionEntries,
919
1151
  positionLevels,
920
1152
  positionPartials,
921
1153
  };
922
1154
  };
1155
+ this.getStatusInfo = async () => {
1156
+ this.loggerService.log("statusViewService getStatusInfo");
1157
+ if (CC_ENABLE_MOCK) {
1158
+ return this.statusMockService.getStatusInfo();
1159
+ }
1160
+ {
1161
+ const [backtestTarget = null] = await Backtest.list();
1162
+ if (backtestTarget) {
1163
+ const currentHeat = await Heat.getData({
1164
+ strategyName: backtestTarget.strategyName,
1165
+ exchangeName: backtestTarget.exchangeName,
1166
+ frameName: backtestTarget.frameName,
1167
+ });
1168
+ return {
1169
+ context: {
1170
+ strategyName: backtestTarget.strategyName,
1171
+ exchangeName: backtestTarget.exchangeName,
1172
+ frameName: backtestTarget.frameName,
1173
+ },
1174
+ portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1175
+ portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1176
+ portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1177
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1178
+ symbol,
1179
+ totalPnl,
1180
+ winRate,
1181
+ profitFactor,
1182
+ maxDrawdown,
1183
+ expectancy,
1184
+ totalTrades,
1185
+ })),
1186
+ backtest: true,
1187
+ };
1188
+ }
1189
+ }
1190
+ {
1191
+ const [liveTarget = null] = await Live.list();
1192
+ if (liveTarget) {
1193
+ const currentHeat = await Heat.getData({
1194
+ strategyName: liveTarget.strategyName,
1195
+ exchangeName: liveTarget.exchangeName,
1196
+ frameName: "",
1197
+ });
1198
+ return {
1199
+ context: {
1200
+ strategyName: liveTarget.strategyName,
1201
+ exchangeName: liveTarget.exchangeName,
1202
+ frameName: "",
1203
+ },
1204
+ portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1205
+ portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1206
+ portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1207
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1208
+ symbol,
1209
+ totalPnl,
1210
+ winRate,
1211
+ profitFactor,
1212
+ maxDrawdown,
1213
+ expectancy,
1214
+ totalTrades,
1215
+ })),
1216
+ backtest: false,
1217
+ };
1218
+ }
1219
+ }
1220
+ return null;
1221
+ };
923
1222
  }
924
1223
  }
925
1224
 
@@ -1110,6 +1409,185 @@ class MarkdownViewService {
1110
1409
  }
1111
1410
  }
1112
1411
 
1412
+ const pathId = (p) => createHash("sha1").update(p).digest("hex").slice(0, 16);
1413
+ const buildTree = async (dir, visited) => {
1414
+ const realDir = await fs.realpath(dir);
1415
+ if (visited.has(realDir)) {
1416
+ return [];
1417
+ }
1418
+ visited.add(realDir);
1419
+ const entries = await fs.readdir(dir, { withFileTypes: true });
1420
+ const nodes = [];
1421
+ for (const entry of entries) {
1422
+ const childPath = path.join(dir, entry.name);
1423
+ const childRelPath = path.relative(process.cwd(), childPath).replace(/\\/g, "/");
1424
+ if (entry.isDirectory()) {
1425
+ nodes.push({
1426
+ id: pathId(childRelPath),
1427
+ path: childRelPath,
1428
+ label: entry.name,
1429
+ type: "directory",
1430
+ nodes: await buildTree(childPath, visited),
1431
+ });
1432
+ }
1433
+ else {
1434
+ nodes.push({
1435
+ id: pathId(childRelPath),
1436
+ path: childRelPath,
1437
+ label: entry.name,
1438
+ type: "file",
1439
+ mimeType: mime.lookup(entry.name) || "application/octet-stream",
1440
+ });
1441
+ }
1442
+ }
1443
+ return nodes;
1444
+ };
1445
+ class ExplorerViewService {
1446
+ constructor() {
1447
+ this.loggerService = inject(TYPES.loggerService);
1448
+ this.explorerMockService = inject(TYPES.explorerMockService);
1449
+ this.getDir = singleshot(async () => {
1450
+ this.loggerService.log("explorerViewService getDir");
1451
+ const dir = path.join(process.cwd(), "dump");
1452
+ await fs.mkdir(dir, { recursive: true });
1453
+ return dir;
1454
+ });
1455
+ this.getNode = async (nodePath) => {
1456
+ this.loggerService.log("explorerViewService getNode", {
1457
+ nodePath,
1458
+ });
1459
+ if (CC_ENABLE_MOCK) {
1460
+ return await this.explorerMockService.getNode(nodePath);
1461
+ }
1462
+ const dir = await this.getDir();
1463
+ const absPath = path.resolve(process.cwd(), nodePath);
1464
+ if (!absPath.startsWith(dir + path.sep) && !absPath.startsWith(dir + "/") && absPath !== dir) {
1465
+ throw new Error(`Path is outside of dump dir: ${nodePath}`);
1466
+ }
1467
+ return await fs.readFile(absPath, "utf-8");
1468
+ };
1469
+ this.getTree = async () => {
1470
+ this.loggerService.log("explorerViewService getTree");
1471
+ if (CC_ENABLE_MOCK) {
1472
+ return await this.explorerMockService.getTree();
1473
+ }
1474
+ const dir = await this.getDir();
1475
+ const root = path.relative(process.cwd(), dir).replace(/\\/g, "/");
1476
+ const rootNode = {
1477
+ id: pathId(root),
1478
+ path: root,
1479
+ label: path.basename(root),
1480
+ type: "directory",
1481
+ nodes: await buildTree(dir, new Set([path.join(dir, "data")])),
1482
+ };
1483
+ return [rootNode];
1484
+ };
1485
+ }
1486
+ }
1487
+
1488
+ class SignalViewService {
1489
+ constructor() {
1490
+ this.loggerService = inject(TYPES.loggerService);
1491
+ this.signalMockService = inject(TYPES.signalMockService);
1492
+ this.getLastUpdateTimestamp = async (signalId) => {
1493
+ this.loggerService.log("signalViewService getLastUpdateTimestamp", {
1494
+ signalId,
1495
+ });
1496
+ if (CC_ENABLE_MOCK) {
1497
+ return await this.signalMockService.getLastUpdateTimestamp(signalId);
1498
+ }
1499
+ {
1500
+ const liveSignal = await StorageLive.findById(signalId);
1501
+ if (liveSignal) {
1502
+ return liveSignal.updatedAt;
1503
+ }
1504
+ }
1505
+ {
1506
+ const backtestSignal = await StorageBacktest.findById(signalId);
1507
+ if (backtestSignal) {
1508
+ return backtestSignal.updatedAt;
1509
+ }
1510
+ }
1511
+ throw new Error(`SignalViewService getLastUpdateTimestamp signal not found signalId=${signalId}`);
1512
+ };
1513
+ this.getPendingSignal = async (symbol) => {
1514
+ this.loggerService.log("signalViewService getPendingSignal", {
1515
+ symbol,
1516
+ });
1517
+ if (CC_ENABLE_MOCK) {
1518
+ return await this.signalMockService.getPendingSignal(symbol);
1519
+ }
1520
+ {
1521
+ const liveList = await Live.list();
1522
+ const liveTarget = liveList.find((live) => live.symbol === symbol);
1523
+ if (liveTarget) {
1524
+ const currentPrice = await Exchange.getAveragePrice(symbol, {
1525
+ exchangeName: liveTarget.exchangeName,
1526
+ });
1527
+ return await Live.getPendingSignal(symbol, currentPrice, {
1528
+ strategyName: liveTarget.strategyName,
1529
+ exchangeName: liveTarget.exchangeName,
1530
+ });
1531
+ }
1532
+ }
1533
+ return null;
1534
+ };
1535
+ }
1536
+ }
1537
+
1538
+ class HeatViewService {
1539
+ constructor() {
1540
+ this.loggerService = inject(TYPES.loggerService);
1541
+ this.heatMockService = inject(TYPES.heatMockService);
1542
+ this.getStrategyHeatData = async () => {
1543
+ this.loggerService.log("heatViewService getStrategyHeatData");
1544
+ if (CC_ENABLE_MOCK) {
1545
+ return await this.heatMockService.getStrategyHeatData();
1546
+ }
1547
+ const [backtestItem] = await Backtest.list();
1548
+ const [liveItem] = await Live.list();
1549
+ if (backtestItem) {
1550
+ return await Heat.getData({
1551
+ strategyName: backtestItem.strategyName,
1552
+ exchangeName: backtestItem.exchangeName,
1553
+ frameName: backtestItem.frameName,
1554
+ });
1555
+ }
1556
+ if (liveItem) {
1557
+ return await Heat.getData({
1558
+ strategyName: liveItem.strategyName,
1559
+ exchangeName: liveItem.exchangeName,
1560
+ frameName: "",
1561
+ });
1562
+ }
1563
+ return null;
1564
+ };
1565
+ this.getStrategyHeatReport = async () => {
1566
+ this.loggerService.log("heatViewService getStrategyHeatReport");
1567
+ if (CC_ENABLE_MOCK) {
1568
+ return await this.heatMockService.getStrategyHeatReport();
1569
+ }
1570
+ const [backtestItem] = await Backtest.list();
1571
+ const [liveItem] = await Live.list();
1572
+ if (backtestItem) {
1573
+ return await Heat.getReport({
1574
+ strategyName: backtestItem.strategyName,
1575
+ exchangeName: backtestItem.exchangeName,
1576
+ frameName: backtestItem.frameName,
1577
+ });
1578
+ }
1579
+ if (liveItem) {
1580
+ return await Heat.getReport({
1581
+ strategyName: liveItem.strategyName,
1582
+ exchangeName: liveItem.exchangeName,
1583
+ frameName: "",
1584
+ });
1585
+ }
1586
+ return null;
1587
+ };
1588
+ }
1589
+ }
1590
+
1113
1591
  const symbol_list = [
1114
1592
  {
1115
1593
  icon: "/icon/btc.png",
@@ -1306,6 +1784,9 @@ class LiveMetaService {
1306
1784
  provide(TYPES.logMockService, () => new LogMockService());
1307
1785
  provide(TYPES.statusMockService, () => new StatusMockService());
1308
1786
  provide(TYPES.markdownMockService, () => new MarkdownMockService());
1787
+ provide(TYPES.explorerMockService, () => new ExplorerMockService());
1788
+ provide(TYPES.signalMockService, () => new SignalMockService());
1789
+ provide(TYPES.heatMockService, () => new HeatMockService());
1309
1790
  }
1310
1791
  {
1311
1792
  provide(TYPES.notificationViewService, () => new NotificationViewService());
@@ -1314,6 +1795,9 @@ class LiveMetaService {
1314
1795
  provide(TYPES.logViewService, () => new LogViewService());
1315
1796
  provide(TYPES.statusViewService, () => new StatusViewService());
1316
1797
  provide(TYPES.markdownViewService, () => new MarkdownViewService());
1798
+ provide(TYPES.explorerViewService, () => new ExplorerViewService());
1799
+ provide(TYPES.signalViewService, () => new SignalViewService());
1800
+ provide(TYPES.heatViewService, () => new HeatViewService());
1317
1801
  }
1318
1802
 
1319
1803
  const baseServices = {
@@ -1336,6 +1820,9 @@ const mockServices = {
1336
1820
  logMockService: inject(TYPES.logMockService),
1337
1821
  statusMockService: inject(TYPES.statusMockService),
1338
1822
  markdownMockService: inject(TYPES.markdownMockService),
1823
+ explorerMockService: inject(TYPES.explorerMockService),
1824
+ signalMockService: inject(TYPES.signalMockService),
1825
+ heatMockService: inject(TYPES.heatMockService),
1339
1826
  };
1340
1827
  const viewServices = {
1341
1828
  notificationViewService: inject(TYPES.notificationViewService),
@@ -1344,6 +1831,9 @@ const viewServices = {
1344
1831
  logViewService: inject(TYPES.logViewService),
1345
1832
  statusViewService: inject(TYPES.statusViewService),
1346
1833
  markdownViewService: inject(TYPES.markdownViewService),
1834
+ explorerViewService: inject(TYPES.explorerViewService),
1835
+ signalViewService: inject(TYPES.signalViewService),
1836
+ heatViewService: inject(TYPES.heatViewService),
1347
1837
  };
1348
1838
  const ioc = {
1349
1839
  ...baseServices,
@@ -1354,11 +1844,11 @@ const ioc = {
1354
1844
  };
1355
1845
  init();
1356
1846
 
1357
- const router$8 = Router({
1847
+ const router$a = Router({
1358
1848
  params: true,
1359
1849
  });
1360
1850
  // ExchangeMockService endpoints
1361
- router$8.post("/api/v1/mock/candles_signal", async (req, res) => {
1851
+ router$a.post("/api/v1/mock/candles_signal", async (req, res) => {
1362
1852
  try {
1363
1853
  const request = await micro.json(req);
1364
1854
  const { signalId, interval, requestId, serviceName } = request;
@@ -1386,7 +1876,7 @@ router$8.post("/api/v1/mock/candles_signal", async (req, res) => {
1386
1876
  });
1387
1877
  }
1388
1878
  });
1389
- router$8.post("/api/v1/mock/candles_point", async (req, res) => {
1879
+ router$a.post("/api/v1/mock/candles_point", async (req, res) => {
1390
1880
  try {
1391
1881
  const request = await micro.json(req);
1392
1882
  const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
@@ -1420,7 +1910,7 @@ router$8.post("/api/v1/mock/candles_point", async (req, res) => {
1420
1910
  }
1421
1911
  });
1422
1912
  // NotificationMockService endpoints
1423
- router$8.post("/api/v1/mock/notification_list", async (req, res) => {
1913
+ router$a.post("/api/v1/mock/notification_list", async (req, res) => {
1424
1914
  try {
1425
1915
  const request = await micro.json(req);
1426
1916
  const { requestId, serviceName } = request;
@@ -1448,7 +1938,7 @@ router$8.post("/api/v1/mock/notification_list", async (req, res) => {
1448
1938
  });
1449
1939
  }
1450
1940
  });
1451
- router$8.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1941
+ router$a.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1452
1942
  try {
1453
1943
  const request = await micro.json(req);
1454
1944
  const { requestId, serviceName } = request;
@@ -1477,7 +1967,7 @@ router$8.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1477
1967
  });
1478
1968
  }
1479
1969
  });
1480
- router$8.post("/api/v1/mock/notification_filter", async (req, res) => {
1970
+ router$a.post("/api/v1/mock/notification_filter", async (req, res) => {
1481
1971
  try {
1482
1972
  const request = await micro.json(req);
1483
1973
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1506,7 +1996,7 @@ router$8.post("/api/v1/mock/notification_filter", async (req, res) => {
1506
1996
  }
1507
1997
  });
1508
1998
  // StorageMockService endpoints
1509
- router$8.post("/api/v1/mock/storage_one/:id", async (req, res) => {
1999
+ router$a.post("/api/v1/mock/storage_one/:id", async (req, res) => {
1510
2000
  try {
1511
2001
  const request = await micro.json(req);
1512
2002
  const { requestId, serviceName } = request;
@@ -1535,7 +2025,7 @@ router$8.post("/api/v1/mock/storage_one/:id", async (req, res) => {
1535
2025
  });
1536
2026
  }
1537
2027
  });
1538
- router$8.post("/api/v1/mock/storage_list/live", async (req, res) => {
2028
+ router$a.post("/api/v1/mock/storage_list/live", async (req, res) => {
1539
2029
  try {
1540
2030
  const request = await micro.json(req);
1541
2031
  const { requestId, serviceName } = request;
@@ -1563,7 +2053,7 @@ router$8.post("/api/v1/mock/storage_list/live", async (req, res) => {
1563
2053
  });
1564
2054
  }
1565
2055
  });
1566
- router$8.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
2056
+ router$a.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
1567
2057
  try {
1568
2058
  const request = await micro.json(req);
1569
2059
  const { requestId, serviceName } = request;
@@ -1592,7 +2082,7 @@ router$8.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
1592
2082
  }
1593
2083
  });
1594
2084
  // LogMockService endpoints
1595
- router$8.post("/api/v1/mock/log_list", async (req, res) => {
2085
+ router$a.post("/api/v1/mock/log_list", async (req, res) => {
1596
2086
  try {
1597
2087
  const request = await micro.json(req);
1598
2088
  const { requestId, serviceName } = request;
@@ -1620,7 +2110,7 @@ router$8.post("/api/v1/mock/log_list", async (req, res) => {
1620
2110
  });
1621
2111
  }
1622
2112
  });
1623
- router$8.post("/api/v1/mock/log_one/:id", async (req, res) => {
2113
+ router$a.post("/api/v1/mock/log_one/:id", async (req, res) => {
1624
2114
  try {
1625
2115
  const request = await micro.json(req);
1626
2116
  const { requestId, serviceName } = request;
@@ -1649,7 +2139,7 @@ router$8.post("/api/v1/mock/log_one/:id", async (req, res) => {
1649
2139
  });
1650
2140
  }
1651
2141
  });
1652
- router$8.post("/api/v1/mock/log_filter", async (req, res) => {
2142
+ router$a.post("/api/v1/mock/log_filter", async (req, res) => {
1653
2143
  try {
1654
2144
  const request = await micro.json(req);
1655
2145
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1677,7 +2167,7 @@ router$8.post("/api/v1/mock/log_filter", async (req, res) => {
1677
2167
  });
1678
2168
  }
1679
2169
  });
1680
- router$8.post("/api/v1/mock/candles_live", async (req, res) => {
2170
+ router$a.post("/api/v1/mock/candles_live", async (req, res) => {
1681
2171
  try {
1682
2172
  const request = await micro.json(req);
1683
2173
  const { signalId, interval, requestId, serviceName } = request;
@@ -1705,8 +2195,94 @@ router$8.post("/api/v1/mock/candles_live", async (req, res) => {
1705
2195
  });
1706
2196
  }
1707
2197
  });
2198
+ router$a.post("/api/v1/mock/candles_last", async (req, res) => {
2199
+ try {
2200
+ const request = await micro.json(req);
2201
+ const { symbol, interval, requestId, serviceName } = request;
2202
+ const data = await ioc.exchangeMockService.getLastCandles(symbol, interval);
2203
+ const result = {
2204
+ data,
2205
+ status: "ok",
2206
+ error: "",
2207
+ requestId,
2208
+ serviceName,
2209
+ };
2210
+ ioc.loggerService.log("/api/v1/mock/candles_last ok", {
2211
+ request,
2212
+ result: omit(result, "data"),
2213
+ });
2214
+ return await micro.send(res, 200, result);
2215
+ }
2216
+ catch (error) {
2217
+ ioc.loggerService.log("/api/v1/mock/candles_last error", {
2218
+ error: errorData(error),
2219
+ });
2220
+ return await micro.send(res, 200, {
2221
+ status: "error",
2222
+ error: getErrorMessage(error),
2223
+ });
2224
+ }
2225
+ });
2226
+ // SignalMockService endpoints
2227
+ router$a.post("/api/v1/mock/signal_last_update/:id", async (req, res) => {
2228
+ try {
2229
+ const request = await micro.json(req);
2230
+ const { requestId, serviceName } = request;
2231
+ const signalId = req.params.id;
2232
+ const data = await ioc.signalMockService.getLastUpdateTimestamp(signalId);
2233
+ const result = {
2234
+ data,
2235
+ status: "ok",
2236
+ error: "",
2237
+ requestId,
2238
+ serviceName,
2239
+ };
2240
+ ioc.loggerService.log("/api/v1/mock/signal_last_update/:id ok", {
2241
+ request,
2242
+ result: omit(result, "data"),
2243
+ });
2244
+ return await micro.send(res, 200, result);
2245
+ }
2246
+ catch (error) {
2247
+ ioc.loggerService.log("/api/v1/mock/signal_last_update/:id error", {
2248
+ error: errorData(error),
2249
+ });
2250
+ return await micro.send(res, 200, {
2251
+ status: "error",
2252
+ error: getErrorMessage(error),
2253
+ });
2254
+ }
2255
+ });
2256
+ router$a.post("/api/v1/mock/signal_pending", async (req, res) => {
2257
+ try {
2258
+ const request = await micro.json(req);
2259
+ const { symbol, requestId, serviceName } = request;
2260
+ const data = await ioc.signalMockService.getPendingSignal(symbol);
2261
+ const result = {
2262
+ data,
2263
+ status: "ok",
2264
+ error: "",
2265
+ requestId,
2266
+ serviceName,
2267
+ };
2268
+ ioc.loggerService.log("/api/v1/mock/signal_pending ok", {
2269
+ request,
2270
+ result: omit(result, "data"),
2271
+ });
2272
+ return await micro.send(res, 200, result);
2273
+ }
2274
+ catch (error) {
2275
+ ioc.loggerService.log("/api/v1/mock/signal_pending error", {
2276
+ error: errorData(error),
2277
+ });
2278
+ return await micro.send(res, 200, {
2279
+ status: "error",
2280
+ error: getErrorMessage(error),
2281
+ });
2282
+ }
2283
+ });
1708
2284
  // StatusMockService endpoints
1709
- router$8.post("/api/v1/mock/status_list", async (req, res) => {
2285
+ router$a.post("/api/v1/mock/status_list", async (req, res) => {
1710
2286
  try {
1711
2287
  const request = await micro.json(req);
1712
2288
  const { requestId, serviceName } = request;
@@ -1734,7 +2310,7 @@ router$8.post("/api/v1/mock/status_list", async (req, res) => {
1734
2310
  });
1735
2311
  }
1736
2312
  });
1737
- router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
2313
+ router$a.post("/api/v1/mock/status_one/:id", async (req, res) => {
1738
2314
  try {
1739
2315
  const request = await micro.json(req);
1740
2316
  const { requestId, serviceName } = request;
@@ -1763,12 +2339,97 @@ router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
1763
2339
  });
1764
2340
  }
1765
2341
  });
2342
+ // HeatMockService endpoints
2343
+ router$a.post("/api/v1/mock/heat_data", async (req, res) => {
2344
+ try {
2345
+ const request = await micro.json(req);
2346
+ const { requestId, serviceName } = request;
2347
+ const data = await ioc.heatMockService.getStrategyHeatData();
2348
+ const result = {
2349
+ data,
2350
+ status: "ok",
2351
+ error: "",
2352
+ requestId,
2353
+ serviceName,
2354
+ };
2355
+ ioc.loggerService.log("/api/v1/mock/heat_data ok", {
2356
+ request,
2357
+ result: omit(result, "data"),
2358
+ });
2359
+ return await micro.send(res, 200, result);
2360
+ }
2361
+ catch (error) {
2362
+ ioc.loggerService.log("/api/v1/mock/heat_data error", {
2363
+ error: errorData(error),
2364
+ });
2365
+ return await micro.send(res, 200, {
2366
+ status: "error",
2367
+ error: getErrorMessage(error),
2368
+ });
2369
+ }
2370
+ });
2371
+ router$a.post("/api/v1/mock/heat_report", async (req, res) => {
2372
+ try {
2373
+ const request = await micro.json(req);
2374
+ const { requestId, serviceName } = request;
2375
+ const data = await ioc.heatMockService.getStrategyHeatReport();
2376
+ const result = {
2377
+ data,
2378
+ status: "ok",
2379
+ error: "",
2380
+ requestId,
2381
+ serviceName,
2382
+ };
2383
+ ioc.loggerService.log("/api/v1/mock/heat_report ok", {
2384
+ request,
2385
+ result: omit(result, "data"),
2386
+ });
2387
+ return await micro.send(res, 200, result);
2388
+ }
2389
+ catch (error) {
2390
+ ioc.loggerService.log("/api/v1/mock/heat_report error", {
2391
+ error: errorData(error),
2392
+ });
2393
+ return await micro.send(res, 200, {
2394
+ status: "error",
2395
+ error: getErrorMessage(error),
2396
+ });
2397
+ }
2398
+ });
2399
+ router$a.post("/api/v1/mock/status_info", async (req, res) => {
2400
+ try {
2401
+ const request = await micro.json(req);
2402
+ const { requestId, serviceName } = request;
2403
+ const data = await ioc.statusMockService.getStatusInfo();
2404
+ const result = {
2405
+ data,
2406
+ status: "ok",
2407
+ error: "",
2408
+ requestId,
2409
+ serviceName,
2410
+ };
2411
+ ioc.loggerService.log("/api/v1/mock/status_info ok", {
2412
+ request,
2413
+ result: omit(result, "data"),
2414
+ });
2415
+ return await micro.send(res, 200, result);
2416
+ }
2417
+ catch (error) {
2418
+ ioc.loggerService.log("/api/v1/mock/status_info error", {
2419
+ error: errorData(error),
2420
+ });
2421
+ return await micro.send(res, 200, {
2422
+ status: "error",
2423
+ error: getErrorMessage(error),
2424
+ });
2425
+ }
2426
+ });
1766
2427
 
1767
- const router$7 = Router({
2428
+ const router$9 = Router({
1768
2429
  params: true,
1769
2430
  });
1770
2431
  // ExchangeViewService endpoints
1771
- router$7.post("/api/v1/view/candles_signal", async (req, res) => {
2432
+ router$9.post("/api/v1/view/candles_signal", async (req, res) => {
1772
2433
  try {
1773
2434
  const request = await micro.json(req);
1774
2435
  const { signalId, interval, requestId, serviceName } = request;
@@ -1796,7 +2457,7 @@ router$7.post("/api/v1/view/candles_signal", async (req, res) => {
1796
2457
  });
1797
2458
  }
1798
2459
  });
1799
- router$7.post("/api/v1/view/candles_point", async (req, res) => {
2460
+ router$9.post("/api/v1/view/candles_point", async (req, res) => {
1800
2461
  try {
1801
2462
  const request = await micro.json(req);
1802
2463
  const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
@@ -1829,7 +2490,7 @@ router$7.post("/api/v1/view/candles_point", async (req, res) => {
1829
2490
  });
1830
2491
  }
1831
2492
  });
1832
- router$7.post("/api/v1/view/candles_live", async (req, res) => {
2493
+ router$9.post("/api/v1/view/candles_live", async (req, res) => {
1833
2494
  try {
1834
2495
  const request = await micro.json(req);
1835
2496
  const { signalId, interval, requestId, serviceName } = request;
@@ -1857,8 +2518,36 @@ router$7.post("/api/v1/view/candles_live", async (req, res) => {
1857
2518
  });
1858
2519
  }
1859
2520
  });
2521
+ router$9.post("/api/v1/view/candles_last", async (req, res) => {
2522
+ try {
2523
+ const request = await micro.json(req);
2524
+ const { symbol, interval, requestId, serviceName } = request;
2525
+ const data = await ioc.exchangeViewService.getLastCandles(symbol, interval);
2526
+ const result = {
2527
+ data,
2528
+ status: "ok",
2529
+ error: "",
2530
+ requestId,
2531
+ serviceName,
2532
+ };
2533
+ ioc.loggerService.log("/api/v1/view/candles_last ok", {
2534
+ request,
2535
+ result: omit(result, "data"),
2536
+ });
2537
+ return await micro.send(res, 200, result);
2538
+ }
2539
+ catch (error) {
2540
+ ioc.loggerService.log("/api/v1/view/candles_last error", {
2541
+ error: errorData(error),
2542
+ });
2543
+ return await micro.send(res, 200, {
2544
+ status: "error",
2545
+ error: getErrorMessage(error),
2546
+ });
2547
+ }
2548
+ });
1860
2549
  // NotificationViewService endpoints
1861
- router$7.post("/api/v1/view/notification_list", async (req, res) => {
2550
+ router$9.post("/api/v1/view/notification_list", async (req, res) => {
1862
2551
  try {
1863
2552
  const request = await micro.json(req);
1864
2553
  const { requestId, serviceName } = request;
@@ -1886,7 +2575,7 @@ router$7.post("/api/v1/view/notification_list", async (req, res) => {
1886
2575
  });
1887
2576
  }
1888
2577
  });
1889
- router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
2578
+ router$9.post("/api/v1/view/notification_one/:id", async (req, res) => {
1890
2579
  try {
1891
2580
  const request = await micro.json(req);
1892
2581
  const { requestId, serviceName } = request;
@@ -1915,7 +2604,7 @@ router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
1915
2604
  });
1916
2605
  }
1917
2606
  });
1918
- router$7.post("/api/v1/view/notification_filter", async (req, res) => {
2607
+ router$9.post("/api/v1/view/notification_filter", async (req, res) => {
1919
2608
  try {
1920
2609
  const request = await micro.json(req);
1921
2610
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1944,7 +2633,7 @@ router$7.post("/api/v1/view/notification_filter", async (req, res) => {
1944
2633
  }
1945
2634
  });
1946
2635
  // StorageViewService endpoints
1947
- router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
2636
+ router$9.post("/api/v1/view/storage_one/:id", async (req, res) => {
1948
2637
  try {
1949
2638
  const request = await micro.json(req);
1950
2639
  const { requestId, serviceName } = request;
@@ -1973,7 +2662,7 @@ router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
1973
2662
  });
1974
2663
  }
1975
2664
  });
1976
- router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
2665
+ router$9.post("/api/v1/view/storage_list/live", async (req, res) => {
1977
2666
  try {
1978
2667
  const request = await micro.json(req);
1979
2668
  const { requestId, serviceName } = request;
@@ -2001,7 +2690,7 @@ router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
2001
2690
  });
2002
2691
  }
2003
2692
  });
2004
- router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2693
+ router$9.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2005
2694
  try {
2006
2695
  const request = await micro.json(req);
2007
2696
  const { requestId, serviceName } = request;
@@ -2030,7 +2719,7 @@ router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2030
2719
  }
2031
2720
  });
2032
2721
  // LogViewService endpoints
2033
- router$7.post("/api/v1/view/log_list", async (req, res) => {
2722
+ router$9.post("/api/v1/view/log_list", async (req, res) => {
2034
2723
  try {
2035
2724
  const request = await micro.json(req);
2036
2725
  const { requestId, serviceName } = request;
@@ -2058,7 +2747,7 @@ router$7.post("/api/v1/view/log_list", async (req, res) => {
2058
2747
  });
2059
2748
  }
2060
2749
  });
2061
- router$7.post("/api/v1/view/log_one/:id", async (req, res) => {
2750
+ router$9.post("/api/v1/view/log_one/:id", async (req, res) => {
2062
2751
  try {
2063
2752
  const request = await micro.json(req);
2064
2753
  const { requestId, serviceName } = request;
@@ -2087,7 +2776,7 @@ router$7.post("/api/v1/view/log_one/:id", async (req, res) => {
2087
2776
  });
2088
2777
  }
2089
2778
  });
2090
- router$7.post("/api/v1/view/log_filter", async (req, res) => {
2779
+ router$9.post("/api/v1/view/log_filter", async (req, res) => {
2091
2780
  try {
2092
2781
  const request = await micro.json(req);
2093
2782
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -2115,8 +2804,66 @@ router$7.post("/api/v1/view/log_filter", async (req, res) => {
2115
2804
  });
2116
2805
  }
2117
2806
  });
2807
+ // SignalViewService endpoints
2808
+ router$9.post("/api/v1/view/signal_last_update/:id", async (req, res) => {
2809
+ try {
2810
+ const request = await micro.json(req);
2811
+ const { requestId, serviceName } = request;
2812
+ const signalId = req.params.id;
2813
+ const data = await ioc.signalViewService.getLastUpdateTimestamp(signalId);
2814
+ const result = {
2815
+ data,
2816
+ status: "ok",
2817
+ error: "",
2818
+ requestId,
2819
+ serviceName,
2820
+ };
2821
+ ioc.loggerService.log("/api/v1/view/signal_last_update/:id ok", {
2822
+ request,
2823
+ result: omit(result, "data"),
2824
+ });
2825
+ return await micro.send(res, 200, result);
2826
+ }
2827
+ catch (error) {
2828
+ ioc.loggerService.log("/api/v1/view/signal_last_update/:id error", {
2829
+ error: errorData(error),
2830
+ });
2831
+ return await micro.send(res, 200, {
2832
+ status: "error",
2833
+ error: getErrorMessage(error),
2834
+ });
2835
+ }
2836
+ });
2837
+ router$9.post("/api/v1/view/signal_pending", async (req, res) => {
2838
+ try {
2839
+ const request = await micro.json(req);
2840
+ const { symbol, requestId, serviceName } = request;
2841
+ const data = await ioc.signalViewService.getPendingSignal(symbol);
2842
+ const result = {
2843
+ data,
2844
+ status: "ok",
2845
+ error: "",
2846
+ requestId,
2847
+ serviceName,
2848
+ };
2849
+ ioc.loggerService.log("/api/v1/view/signal_pending ok", {
2850
+ request,
2851
+ result: omit(result, "data"),
2852
+ });
2853
+ return await micro.send(res, 200, result);
2854
+ }
2855
+ catch (error) {
2856
+ ioc.loggerService.log("/api/v1/view/signal_pending error", {
2857
+ error: errorData(error),
2858
+ });
2859
+ return await micro.send(res, 200, {
2860
+ status: "error",
2861
+ error: getErrorMessage(error),
2862
+ });
2863
+ }
2864
+ });
2118
2865
  // StatusViewService endpoints
2119
- router$7.post("/api/v1/view/status_list", async (req, res) => {
2866
+ router$9.post("/api/v1/view/status_list", async (req, res) => {
2120
2867
  try {
2121
2868
  const request = await micro.json(req);
2122
2869
  const { requestId, serviceName } = request;
@@ -2144,7 +2891,7 @@ router$7.post("/api/v1/view/status_list", async (req, res) => {
2144
2891
  });
2145
2892
  }
2146
2893
  });
2147
- router$7.post("/api/v1/view/status_one/:id", async (req, res) => {
2894
+ router$9.post("/api/v1/view/status_one/:id", async (req, res) => {
2148
2895
  try {
2149
2896
  const request = await micro.json(req);
2150
2897
  const { requestId, serviceName } = request;
@@ -2173,6 +2920,91 @@ router$7.post("/api/v1/view/status_one/:id", async (req, res) => {
2173
2920
  });
2174
2921
  }
2175
2922
  });
2923
+ // HeatViewService endpoints
2924
+ router$9.post("/api/v1/view/heat_data", async (req, res) => {
2925
+ try {
2926
+ const request = await micro.json(req);
2927
+ const { requestId, serviceName } = request;
2928
+ const data = await ioc.heatViewService.getStrategyHeatData();
2929
+ const result = {
2930
+ data,
2931
+ status: "ok",
2932
+ error: "",
2933
+ requestId,
2934
+ serviceName,
2935
+ };
2936
+ ioc.loggerService.log("/api/v1/view/heat_data ok", {
2937
+ request,
2938
+ result: omit(result, "data"),
2939
+ });
2940
+ return await micro.send(res, 200, result);
2941
+ }
2942
+ catch (error) {
2943
+ ioc.loggerService.log("/api/v1/view/heat_data error", {
2944
+ error: errorData(error),
2945
+ });
2946
+ return await micro.send(res, 200, {
2947
+ status: "error",
2948
+ error: getErrorMessage(error),
2949
+ });
2950
+ }
2951
+ });
2952
+ router$9.post("/api/v1/view/heat_report", async (req, res) => {
2953
+ try {
2954
+ const request = await micro.json(req);
2955
+ const { requestId, serviceName } = request;
2956
+ const data = await ioc.heatViewService.getStrategyHeatReport();
2957
+ const result = {
2958
+ data,
2959
+ status: "ok",
2960
+ error: "",
2961
+ requestId,
2962
+ serviceName,
2963
+ };
2964
+ ioc.loggerService.log("/api/v1/view/heat_report ok", {
2965
+ request,
2966
+ result: omit(result, "data"),
2967
+ });
2968
+ return await micro.send(res, 200, result);
2969
+ }
2970
+ catch (error) {
2971
+ ioc.loggerService.log("/api/v1/view/heat_report error", {
2972
+ error: errorData(error),
2973
+ });
2974
+ return await micro.send(res, 200, {
2975
+ status: "error",
2976
+ error: getErrorMessage(error),
2977
+ });
2978
+ }
2979
+ });
2980
+ router$9.post("/api/v1/view/status_info", async (req, res) => {
2981
+ try {
2982
+ const request = await micro.json(req);
2983
+ const { requestId, serviceName } = request;
2984
+ const data = await ioc.statusViewService.getStatusInfo();
2985
+ const result = {
2986
+ data,
2987
+ status: "ok",
2988
+ error: "",
2989
+ requestId,
2990
+ serviceName,
2991
+ };
2992
+ ioc.loggerService.log("/api/v1/view/status_info ok", {
2993
+ request,
2994
+ result: omit(result, "data"),
2995
+ });
2996
+ return await micro.send(res, 200, result);
2997
+ }
2998
+ catch (error) {
2999
+ ioc.loggerService.log("/api/v1/view/status_info error", {
3000
+ error: errorData(error),
3001
+ });
3002
+ return await micro.send(res, 200, {
3003
+ status: "error",
3004
+ error: getErrorMessage(error),
3005
+ });
3006
+ }
3007
+ });
2176
3008
 
2177
3009
  const require$1 = createRequire(import.meta.url);
2178
3010
  function getModulesPath() {
@@ -2181,7 +3013,7 @@ function getModulesPath() {
2181
3013
  return join(basePath, "../../../");
2182
3014
  }
2183
3015
 
2184
- const router$6 = Router({
3016
+ const router$8 = Router({
2185
3017
  params: true,
2186
3018
  });
2187
3019
  // getModulesPath
@@ -2198,7 +3030,7 @@ const ASSET_32 = CC_ENABLE_MOCK
2198
3030
  const cache128 = new Map();
2199
3031
  const cache32 = new Map();
2200
3032
  const cacheSvg = new Map();
2201
- router$6.get("/icon/128/:filename", async (req, res) => {
3033
+ router$8.get("/icon/128/:filename", async (req, res) => {
2202
3034
  const filename = req.params.filename;
2203
3035
  // Check cache first
2204
3036
  if (cache128.has(filename)) {
@@ -2214,7 +3046,7 @@ router$6.get("/icon/128/:filename", async (req, res) => {
2214
3046
  }
2215
3047
  return await micro.send(res, 404, "File not found (128)");
2216
3048
  });
2217
- router$6.get("/icon/32/:filename", async (req, res) => {
3049
+ router$8.get("/icon/32/:filename", async (req, res) => {
2218
3050
  const filename = req.params.filename;
2219
3051
  // Check cache first
2220
3052
  if (cache32.has(filename)) {
@@ -2230,7 +3062,7 @@ router$6.get("/icon/32/:filename", async (req, res) => {
2230
3062
  }
2231
3063
  return await micro.send(res, 404, "File not found (32)");
2232
3064
  });
2233
- router$6.get("/icon/svg/:filename", async (req, res) => {
3065
+ router$8.get("/icon/svg/:filename", async (req, res) => {
2234
3066
  const filename = req.params.filename;
2235
3067
  // Check cache first
2236
3068
  if (cacheSvg.has(filename)) {
@@ -2246,7 +3078,7 @@ router$6.get("/icon/svg/:filename", async (req, res) => {
2246
3078
  }
2247
3079
  return await micro.send(res, 404, "File not found (svg)");
2248
3080
  });
2249
- router$6.get("/icon/:filename", async (req, res) => {
3081
+ router$8.get("/icon/:filename", async (req, res) => {
2250
3082
  const filename = req.params.filename;
2251
3083
  // Check cache first
2252
3084
  if (cache32.has(filename)) {
@@ -2263,10 +3095,10 @@ router$6.get("/icon/:filename", async (req, res) => {
2263
3095
  return await micro.send(res, 404, "File not found (root)");
2264
3096
  });
2265
3097
 
2266
- const router$5 = Router({
3098
+ const router$7 = Router({
2267
3099
  params: true,
2268
3100
  });
2269
- router$5.post("/api/v1/dict/symbol/list", async (req, res) => {
3101
+ router$7.post("/api/v1/dict/symbol/list", async (req, res) => {
2270
3102
  try {
2271
3103
  const request = await micro.json(req);
2272
3104
  const { requestId, serviceName } = request;
@@ -2294,7 +3126,7 @@ router$5.post("/api/v1/dict/symbol/list", async (req, res) => {
2294
3126
  });
2295
3127
  }
2296
3128
  });
2297
- router$5.post("/api/v1/dict/symbol/map", async (req, res) => {
3129
+ router$7.post("/api/v1/dict/symbol/map", async (req, res) => {
2298
3130
  try {
2299
3131
  const request = await micro.json(req);
2300
3132
  const { requestId, serviceName } = request;
@@ -2322,7 +3154,7 @@ router$5.post("/api/v1/dict/symbol/map", async (req, res) => {
2322
3154
  });
2323
3155
  }
2324
3156
  });
2325
- router$5.post("/api/v1/dict/symbol/one", async (req, res) => {
3157
+ router$7.post("/api/v1/dict/symbol/one", async (req, res) => {
2326
3158
  try {
2327
3159
  const request = await micro.json(req);
2328
3160
  const { requestId, serviceName, id } = request;
@@ -2351,10 +3183,10 @@ router$5.post("/api/v1/dict/symbol/one", async (req, res) => {
2351
3183
  }
2352
3184
  });
2353
3185
 
2354
- const router$4 = Router({
3186
+ const router$6 = Router({
2355
3187
  params: true,
2356
3188
  });
2357
- router$4.post("/api/v1/markdown_mock/strategy_data", async (req, res) => {
3189
+ router$6.post("/api/v1/markdown_mock/strategy_data", async (req, res) => {
2358
3190
  try {
2359
3191
  const request = await micro.json(req);
2360
3192
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2368,7 +3200,7 @@ router$4.post("/api/v1/markdown_mock/strategy_data", async (req, res) => {
2368
3200
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2369
3201
  }
2370
3202
  });
2371
- router$4.post("/api/v1/markdown_mock/strategy_report", async (req, res) => {
3203
+ router$6.post("/api/v1/markdown_mock/strategy_report", async (req, res) => {
2372
3204
  try {
2373
3205
  const request = await micro.json(req);
2374
3206
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2382,7 +3214,7 @@ router$4.post("/api/v1/markdown_mock/strategy_report", async (req, res) => {
2382
3214
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2383
3215
  }
2384
3216
  });
2385
- router$4.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
3217
+ router$6.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
2386
3218
  try {
2387
3219
  const request = await micro.json(req);
2388
3220
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2396,7 +3228,7 @@ router$4.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
2396
3228
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2397
3229
  }
2398
3230
  });
2399
- router$4.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
3231
+ router$6.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
2400
3232
  try {
2401
3233
  const request = await micro.json(req);
2402
3234
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2410,7 +3242,7 @@ router$4.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
2410
3242
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2411
3243
  }
2412
3244
  });
2413
- router$4.post("/api/v1/markdown_mock/live_data", async (req, res) => {
3245
+ router$6.post("/api/v1/markdown_mock/live_data", async (req, res) => {
2414
3246
  try {
2415
3247
  const request = await micro.json(req);
2416
3248
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2424,7 +3256,7 @@ router$4.post("/api/v1/markdown_mock/live_data", async (req, res) => {
2424
3256
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2425
3257
  }
2426
3258
  });
2427
- router$4.post("/api/v1/markdown_mock/live_report", async (req, res) => {
3259
+ router$6.post("/api/v1/markdown_mock/live_report", async (req, res) => {
2428
3260
  try {
2429
3261
  const request = await micro.json(req);
2430
3262
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2438,7 +3270,7 @@ router$4.post("/api/v1/markdown_mock/live_report", async (req, res) => {
2438
3270
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2439
3271
  }
2440
3272
  });
2441
- router$4.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
3273
+ router$6.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
2442
3274
  try {
2443
3275
  const request = await micro.json(req);
2444
3276
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2452,7 +3284,7 @@ router$4.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
2452
3284
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2453
3285
  }
2454
3286
  });
2455
- router$4.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
3287
+ router$6.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
2456
3288
  try {
2457
3289
  const request = await micro.json(req);
2458
3290
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2466,7 +3298,7 @@ router$4.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
2466
3298
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2467
3299
  }
2468
3300
  });
2469
- router$4.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
3301
+ router$6.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
2470
3302
  try {
2471
3303
  const request = await micro.json(req);
2472
3304
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2480,7 +3312,7 @@ router$4.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
2480
3312
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2481
3313
  }
2482
3314
  });
2483
- router$4.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
3315
+ router$6.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
2484
3316
  try {
2485
3317
  const request = await micro.json(req);
2486
3318
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2494,7 +3326,7 @@ router$4.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
2494
3326
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2495
3327
  }
2496
3328
  });
2497
- router$4.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
3329
+ router$6.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
2498
3330
  try {
2499
3331
  const request = await micro.json(req);
2500
3332
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2508,7 +3340,7 @@ router$4.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
2508
3340
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2509
3341
  }
2510
3342
  });
2511
- router$4.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
3343
+ router$6.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
2512
3344
  try {
2513
3345
  const request = await micro.json(req);
2514
3346
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2522,7 +3354,7 @@ router$4.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
2522
3354
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2523
3355
  }
2524
3356
  });
2525
- router$4.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
3357
+ router$6.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
2526
3358
  try {
2527
3359
  const request = await micro.json(req);
2528
3360
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2536,7 +3368,7 @@ router$4.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
2536
3368
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2537
3369
  }
2538
3370
  });
2539
- router$4.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) => {
3371
+ router$6.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) => {
2540
3372
  try {
2541
3373
  const request = await micro.json(req);
2542
3374
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2550,7 +3382,7 @@ router$4.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) =>
2550
3382
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2551
3383
  }
2552
3384
  });
2553
- router$4.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
3385
+ router$6.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
2554
3386
  try {
2555
3387
  const request = await micro.json(req);
2556
3388
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2564,7 +3396,7 @@ router$4.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
2564
3396
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2565
3397
  }
2566
3398
  });
2567
- router$4.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
3399
+ router$6.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
2568
3400
  try {
2569
3401
  const request = await micro.json(req);
2570
3402
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2578,7 +3410,7 @@ router$4.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
2578
3410
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2579
3411
  }
2580
3412
  });
2581
- router$4.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
3413
+ router$6.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
2582
3414
  try {
2583
3415
  const request = await micro.json(req);
2584
3416
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2592,7 +3424,7 @@ router$4.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
2592
3424
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2593
3425
  }
2594
3426
  });
2595
- router$4.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
3427
+ router$6.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
2596
3428
  try {
2597
3429
  const request = await micro.json(req);
2598
3430
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2606,7 +3438,7 @@ router$4.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
2606
3438
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2607
3439
  }
2608
3440
  });
2609
- router$4.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
3441
+ router$6.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
2610
3442
  try {
2611
3443
  const request = await micro.json(req);
2612
3444
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2620,7 +3452,7 @@ router$4.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
2620
3452
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2621
3453
  }
2622
3454
  });
2623
- router$4.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
3455
+ router$6.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
2624
3456
  try {
2625
3457
  const request = await micro.json(req);
2626
3458
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2634,7 +3466,7 @@ router$4.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
2634
3466
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2635
3467
  }
2636
3468
  });
2637
- router$4.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
3469
+ router$6.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
2638
3470
  try {
2639
3471
  const request = await micro.json(req);
2640
3472
  const { requestId, serviceName, strategyName, exchangeName, frameName } = request;
@@ -2648,7 +3480,7 @@ router$4.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
2648
3480
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2649
3481
  }
2650
3482
  });
2651
- router$4.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
3483
+ router$6.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
2652
3484
  try {
2653
3485
  const request = await micro.json(req);
2654
3486
  const { requestId, serviceName, strategyName, exchangeName, frameName } = request;
@@ -2662,7 +3494,7 @@ router$4.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
2662
3494
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2663
3495
  }
2664
3496
  });
2665
- router$4.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
3497
+ router$6.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
2666
3498
  try {
2667
3499
  const request = await micro.json(req);
2668
3500
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2676,7 +3508,7 @@ router$4.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
2676
3508
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2677
3509
  }
2678
3510
  });
2679
- router$4.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
3511
+ router$6.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
2680
3512
  try {
2681
3513
  const request = await micro.json(req);
2682
3514
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2691,10 +3523,10 @@ router$4.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
2691
3523
  }
2692
3524
  });
2693
3525
 
2694
- const router$3 = Router({
3526
+ const router$5 = Router({
2695
3527
  params: true,
2696
3528
  });
2697
- router$3.post("/api/v1/markdown_view/strategy_data", async (req, res) => {
3529
+ router$5.post("/api/v1/markdown_view/strategy_data", async (req, res) => {
2698
3530
  try {
2699
3531
  const request = await micro.json(req);
2700
3532
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2708,7 +3540,7 @@ router$3.post("/api/v1/markdown_view/strategy_data", async (req, res) => {
2708
3540
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2709
3541
  }
2710
3542
  });
2711
- router$3.post("/api/v1/markdown_view/strategy_report", async (req, res) => {
3543
+ router$5.post("/api/v1/markdown_view/strategy_report", async (req, res) => {
2712
3544
  try {
2713
3545
  const request = await micro.json(req);
2714
3546
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2722,7 +3554,7 @@ router$3.post("/api/v1/markdown_view/strategy_report", async (req, res) => {
2722
3554
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2723
3555
  }
2724
3556
  });
2725
- router$3.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
3557
+ router$5.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
2726
3558
  try {
2727
3559
  const request = await micro.json(req);
2728
3560
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2736,7 +3568,7 @@ router$3.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
2736
3568
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2737
3569
  }
2738
3570
  });
2739
- router$3.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
3571
+ router$5.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
2740
3572
  try {
2741
3573
  const request = await micro.json(req);
2742
3574
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2750,7 +3582,7 @@ router$3.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
2750
3582
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2751
3583
  }
2752
3584
  });
2753
- router$3.post("/api/v1/markdown_view/live_data", async (req, res) => {
3585
+ router$5.post("/api/v1/markdown_view/live_data", async (req, res) => {
2754
3586
  try {
2755
3587
  const request = await micro.json(req);
2756
3588
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2764,7 +3596,7 @@ router$3.post("/api/v1/markdown_view/live_data", async (req, res) => {
2764
3596
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2765
3597
  }
2766
3598
  });
2767
- router$3.post("/api/v1/markdown_view/live_report", async (req, res) => {
3599
+ router$5.post("/api/v1/markdown_view/live_report", async (req, res) => {
2768
3600
  try {
2769
3601
  const request = await micro.json(req);
2770
3602
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2778,7 +3610,7 @@ router$3.post("/api/v1/markdown_view/live_report", async (req, res) => {
2778
3610
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2779
3611
  }
2780
3612
  });
2781
- router$3.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
3613
+ router$5.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
2782
3614
  try {
2783
3615
  const request = await micro.json(req);
2784
3616
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2792,7 +3624,7 @@ router$3.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
2792
3624
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2793
3625
  }
2794
3626
  });
2795
- router$3.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
3627
+ router$5.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
2796
3628
  try {
2797
3629
  const request = await micro.json(req);
2798
3630
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2806,7 +3638,7 @@ router$3.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
2806
3638
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2807
3639
  }
2808
3640
  });
2809
- router$3.post("/api/v1/markdown_view/risk_data", async (req, res) => {
3641
+ router$5.post("/api/v1/markdown_view/risk_data", async (req, res) => {
2810
3642
  try {
2811
3643
  const request = await micro.json(req);
2812
3644
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2820,7 +3652,7 @@ router$3.post("/api/v1/markdown_view/risk_data", async (req, res) => {
2820
3652
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2821
3653
  }
2822
3654
  });
2823
- router$3.post("/api/v1/markdown_view/risk_report", async (req, res) => {
3655
+ router$5.post("/api/v1/markdown_view/risk_report", async (req, res) => {
2824
3656
  try {
2825
3657
  const request = await micro.json(req);
2826
3658
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2834,7 +3666,7 @@ router$3.post("/api/v1/markdown_view/risk_report", async (req, res) => {
2834
3666
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2835
3667
  }
2836
3668
  });
2837
- router$3.post("/api/v1/markdown_view/partial_data", async (req, res) => {
3669
+ router$5.post("/api/v1/markdown_view/partial_data", async (req, res) => {
2838
3670
  try {
2839
3671
  const request = await micro.json(req);
2840
3672
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2848,7 +3680,7 @@ router$3.post("/api/v1/markdown_view/partial_data", async (req, res) => {
2848
3680
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2849
3681
  }
2850
3682
  });
2851
- router$3.post("/api/v1/markdown_view/partial_report", async (req, res) => {
3683
+ router$5.post("/api/v1/markdown_view/partial_report", async (req, res) => {
2852
3684
  try {
2853
3685
  const request = await micro.json(req);
2854
3686
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2862,7 +3694,7 @@ router$3.post("/api/v1/markdown_view/partial_report", async (req, res) => {
2862
3694
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2863
3695
  }
2864
3696
  });
2865
- router$3.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
3697
+ router$5.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
2866
3698
  try {
2867
3699
  const request = await micro.json(req);
2868
3700
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2876,7 +3708,7 @@ router$3.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
2876
3708
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2877
3709
  }
2878
3710
  });
2879
- router$3.post("/api/v1/markdown_view/highest_profit_report", async (req, res) => {
3711
+ router$5.post("/api/v1/markdown_view/highest_profit_report", async (req, res) => {
2880
3712
  try {
2881
3713
  const request = await micro.json(req);
2882
3714
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2890,7 +3722,7 @@ router$3.post("/api/v1/markdown_view/highest_profit_report", async (req, res) =>
2890
3722
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2891
3723
  }
2892
3724
  });
2893
- router$3.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
3725
+ router$5.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
2894
3726
  try {
2895
3727
  const request = await micro.json(req);
2896
3728
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2904,7 +3736,7 @@ router$3.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
2904
3736
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2905
3737
  }
2906
3738
  });
2907
- router$3.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
3739
+ router$5.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
2908
3740
  try {
2909
3741
  const request = await micro.json(req);
2910
3742
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2918,7 +3750,7 @@ router$3.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
2918
3750
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2919
3751
  }
2920
3752
  });
2921
- router$3.post("/api/v1/markdown_view/performance_data", async (req, res) => {
3753
+ router$5.post("/api/v1/markdown_view/performance_data", async (req, res) => {
2922
3754
  try {
2923
3755
  const request = await micro.json(req);
2924
3756
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2932,7 +3764,7 @@ router$3.post("/api/v1/markdown_view/performance_data", async (req, res) => {
2932
3764
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2933
3765
  }
2934
3766
  });
2935
- router$3.post("/api/v1/markdown_view/performance_report", async (req, res) => {
3767
+ router$5.post("/api/v1/markdown_view/performance_report", async (req, res) => {
2936
3768
  try {
2937
3769
  const request = await micro.json(req);
2938
3770
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2946,7 +3778,7 @@ router$3.post("/api/v1/markdown_view/performance_report", async (req, res) => {
2946
3778
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2947
3779
  }
2948
3780
  });
2949
- router$3.post("/api/v1/markdown_view/sync_data", async (req, res) => {
3781
+ router$5.post("/api/v1/markdown_view/sync_data", async (req, res) => {
2950
3782
  try {
2951
3783
  const request = await micro.json(req);
2952
3784
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2960,7 +3792,7 @@ router$3.post("/api/v1/markdown_view/sync_data", async (req, res) => {
2960
3792
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2961
3793
  }
2962
3794
  });
2963
- router$3.post("/api/v1/markdown_view/sync_report", async (req, res) => {
3795
+ router$5.post("/api/v1/markdown_view/sync_report", async (req, res) => {
2964
3796
  try {
2965
3797
  const request = await micro.json(req);
2966
3798
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2974,7 +3806,7 @@ router$3.post("/api/v1/markdown_view/sync_report", async (req, res) => {
2974
3806
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2975
3807
  }
2976
3808
  });
2977
- router$3.post("/api/v1/markdown_view/heat_data", async (req, res) => {
3809
+ router$5.post("/api/v1/markdown_view/heat_data", async (req, res) => {
2978
3810
  try {
2979
3811
  const request = await micro.json(req);
2980
3812
  const { requestId, serviceName, strategyName, exchangeName, frameName, backtest } = request;
@@ -2988,7 +3820,7 @@ router$3.post("/api/v1/markdown_view/heat_data", async (req, res) => {
2988
3820
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2989
3821
  }
2990
3822
  });
2991
- router$3.post("/api/v1/markdown_view/heat_report", async (req, res) => {
3823
+ router$5.post("/api/v1/markdown_view/heat_report", async (req, res) => {
2992
3824
  try {
2993
3825
  const request = await micro.json(req);
2994
3826
  const { requestId, serviceName, strategyName, exchangeName, frameName, backtest } = request;
@@ -3002,7 +3834,7 @@ router$3.post("/api/v1/markdown_view/heat_report", async (req, res) => {
3002
3834
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3003
3835
  }
3004
3836
  });
3005
- router$3.post("/api/v1/markdown_view/walker_data", async (req, res) => {
3837
+ router$5.post("/api/v1/markdown_view/walker_data", async (req, res) => {
3006
3838
  try {
3007
3839
  const request = await micro.json(req);
3008
3840
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -3016,7 +3848,7 @@ router$3.post("/api/v1/markdown_view/walker_data", async (req, res) => {
3016
3848
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3017
3849
  }
3018
3850
  });
3019
- router$3.post("/api/v1/markdown_view/walker_report", async (req, res) => {
3851
+ router$5.post("/api/v1/markdown_view/walker_report", async (req, res) => {
3020
3852
  try {
3021
3853
  const request = await micro.json(req);
3022
3854
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -3031,6 +3863,70 @@ router$3.post("/api/v1/markdown_view/walker_report", async (req, res) => {
3031
3863
  }
3032
3864
  });
3033
3865
 
3866
+ const router$4 = Router({
3867
+ params: true,
3868
+ });
3869
+ router$4.post("/api/v1/explorer_mock/tree", async (req, res) => {
3870
+ try {
3871
+ const request = await micro.json(req);
3872
+ const { requestId, serviceName } = request;
3873
+ const data = await ioc.explorerMockService.getTree();
3874
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3875
+ ioc.loggerService.log("/api/v1/explorer_mock/tree ok", { request, result: omit(result, "data") });
3876
+ return await micro.send(res, 200, result);
3877
+ }
3878
+ catch (error) {
3879
+ ioc.loggerService.log("/api/v1/explorer_mock/tree error", { error: errorData(error) });
3880
+ return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3881
+ }
3882
+ });
3883
+ router$4.post("/api/v1/explorer_mock/node", async (req, res) => {
3884
+ try {
3885
+ const request = await micro.json(req);
3886
+ const { requestId, serviceName, path } = request;
3887
+ const data = await ioc.explorerMockService.getNode(path);
3888
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3889
+ ioc.loggerService.log("/api/v1/explorer_mock/node ok", { request, result: omit(result, "data") });
3890
+ return await micro.send(res, 200, result);
3891
+ }
3892
+ catch (error) {
3893
+ ioc.loggerService.log("/api/v1/explorer_mock/node error", { error: errorData(error) });
3894
+ return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3895
+ }
3896
+ });
3897
+
3898
+ const router$3 = Router({
3899
+ params: true,
3900
+ });
3901
+ router$3.post("/api/v1/explorer_view/tree", async (req, res) => {
3902
+ try {
3903
+ const request = await micro.json(req);
3904
+ const { requestId, serviceName } = request;
3905
+ const data = await ioc.explorerViewService.getTree();
3906
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3907
+ ioc.loggerService.log("/api/v1/explorer_view/tree ok", { request, result: omit(result, "data") });
3908
+ return await micro.send(res, 200, result);
3909
+ }
3910
+ catch (error) {
3911
+ ioc.loggerService.log("/api/v1/explorer_view/tree error", { error: errorData(error) });
3912
+ return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3913
+ }
3914
+ });
3915
+ router$3.post("/api/v1/explorer_view/node", async (req, res) => {
3916
+ try {
3917
+ const request = await micro.json(req);
3918
+ const { requestId, serviceName, path } = request;
3919
+ const data = await ioc.explorerViewService.getNode(path);
3920
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3921
+ ioc.loggerService.log("/api/v1/explorer_view/node ok", { request, result: omit(result, "data") });
3922
+ return await micro.send(res, 200, result);
3923
+ }
3924
+ catch (error) {
3925
+ ioc.loggerService.log("/api/v1/explorer_view/node error", { error: errorData(error) });
3926
+ return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3927
+ }
3928
+ });
3929
+
3034
3930
  const router$2 = Router({
3035
3931
  params: true,
3036
3932
  });
@@ -3102,25 +3998,31 @@ const router = Router({
3102
3998
  params: true,
3103
3999
  });
3104
4000
  router.all("/api/v1/health/*", (req, res) => {
3105
- return router$9(req, res, finalhandler(req, res));
4001
+ return router$b(req, res, finalhandler(req, res));
3106
4002
  });
3107
4003
  router.all("/api/v1/mock/*", (req, res) => {
3108
- return router$8(req, res, finalhandler(req, res));
4004
+ return router$a(req, res, finalhandler(req, res));
3109
4005
  });
3110
4006
  router.all("/api/v1/view/*", (req, res) => {
3111
- return router$7(req, res, finalhandler(req, res));
4007
+ return router$9(req, res, finalhandler(req, res));
3112
4008
  });
3113
4009
  router.all("/api/v1/markdown_mock/*", (req, res) => {
3114
- return router$4(req, res, finalhandler(req, res));
4010
+ return router$6(req, res, finalhandler(req, res));
3115
4011
  });
3116
4012
  router.all("/api/v1/markdown_view/*", (req, res) => {
4013
+ return router$5(req, res, finalhandler(req, res));
4014
+ });
4015
+ router.all("/api/v1/explorer_mock/*", (req, res) => {
4016
+ return router$4(req, res, finalhandler(req, res));
4017
+ });
4018
+ router.all("/api/v1/explorer_view/*", (req, res) => {
3117
4019
  return router$3(req, res, finalhandler(req, res));
3118
4020
  });
3119
4021
  router.all("/icon/*", (req, res) => {
3120
- return router$6(req, res, finalhandler(req, res));
4022
+ return router$8(req, res, finalhandler(req, res));
3121
4023
  });
3122
4024
  router.all("/api/v1/dict/*", (req, res) => {
3123
- return router$5(req, res, finalhandler(req, res));
4025
+ return router$7(req, res, finalhandler(req, res));
3124
4026
  });
3125
4027
  router.all("/api/v1/global/*", (req, res) => {
3126
4028
  return router$2(req, res, finalhandler(req, res));