@backtest-kit/ui 5.6.0 → 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 +1172 -188
  2. package/build/index.mjs +1173 -189
  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-BGXaqCCj.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-Brhl60Pa.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-BFfvVHkP.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 +84 -1
  58. package/build/modules/frontend/build/assets/IconPhoto-NqvLnXp7.js +0 -1
  59. package/build/modules/frontend/build/assets/Refresh-BGkaUatF.js +0 -1
  60. package/build/modules/frontend/build/assets/hasRouteMatch-7UKYuS0a.js +0 -1
  61. package/build/modules/frontend/build/assets/html2canvas-D-Nv0RTX.js +0 -1
  62. package/build/modules/frontend/build/assets/index-4xZ56Pw3.js +0 -231
  63. package/build/modules/frontend/build/assets/index-9iaIzgTc.js +0 -1331
  64. package/build/modules/frontend/build/assets/index-BDV9EkEY.js +0 -1
  65. package/build/modules/frontend/build/assets/index-BYCwoppH.js +0 -1
  66. package/build/modules/frontend/build/assets/index-CbQBf22x.js +0 -1
  67. package/build/modules/frontend/build/assets/index-CywcKDZi.js +0 -1
  68. package/build/modules/frontend/build/assets/index-D3HRM1Jy.js +0 -1
  69. package/build/modules/frontend/build/assets/index-DG7b0pa9.js +0 -1
  70. package/build/modules/frontend/build/assets/markdownit-GU6B-6e7.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, 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,
@@ -440,6 +503,7 @@ const MOCK_DIR = "./mock/markdown";
440
503
  const makeReader = (fileName) => singleshot(() => fs.readFile(path.join(MOCK_DIR, fileName), "utf-8"));
441
504
  const makeDataReader = (fileName) => singleshot(async () => JSON.parse(await fs.readFile(path.join(MOCK_DIR, "data", fileName), "utf-8")));
442
505
  const readBacktest = makeReader("backtest.md");
506
+ const readStrategy = makeReader("strategy.md");
443
507
  const readLive = makeReader("live.md");
444
508
  const readBreakeven = makeReader("breakeven.md");
445
509
  const readRisk = makeReader("risk.md");
@@ -451,6 +515,7 @@ const readSync = makeReader("sync.md");
451
515
  const readHeat = makeReader("heat.md");
452
516
  const readWalker = makeReader("walker.md");
453
517
  const readBacktestData = makeDataReader("backtest.json");
518
+ const readStrategyData = makeDataReader("strategy.json");
454
519
  const readLiveData = makeDataReader("live.json");
455
520
  const readBreakevenData = makeDataReader("breakeven.json");
456
521
  const readRiskData = makeDataReader("risk.json");
@@ -464,6 +529,15 @@ const readWalkerData = makeDataReader("walker.json");
464
529
  class MarkdownMockService {
465
530
  constructor() {
466
531
  this.loggerService = inject(TYPES.loggerService);
532
+ // Strategy
533
+ this.getStrategyData = async (symbol, strategyName, exchangeName, frameName) => {
534
+ this.loggerService.log("markdownMockService getStrategyData", { symbol, strategyName, exchangeName, frameName });
535
+ return readStrategyData();
536
+ };
537
+ this.getStrategyReport = async (symbol, strategyName, exchangeName, frameName) => {
538
+ this.loggerService.log("markdownMockService getStrategyReport", { symbol, strategyName, exchangeName, frameName });
539
+ return readStrategy();
540
+ };
467
541
  // Backtest
468
542
  this.getBacktestData = async (symbol, strategyName, exchangeName, frameName) => {
469
543
  this.loggerService.log("markdownMockService getBacktestData", { symbol, strategyName, exchangeName, frameName });
@@ -566,6 +640,127 @@ class MarkdownMockService {
566
640
  }
567
641
  }
568
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
+
569
764
  const DEFAULT_LIMIT$1 = 25;
570
765
  const DEFAULT_OFFSET$1 = 0;
571
766
  const CREATE_FILTER_LIST_FN$1 = (filterData) => Object.keys(filterData).map((key) => (row) => new RegExp(filterData[key], "i").test(row[key]));
@@ -710,13 +905,14 @@ class StorageViewService {
710
905
  }
711
906
  }
712
907
 
713
- const MS_PER_MINUTE = 60000;
908
+ const HISTORY_LAST_CANDLES_LIMIT = 200;
714
909
  class ExchangeViewService {
715
910
  constructor() {
716
911
  this.loggerService = inject(TYPES.loggerService);
717
912
  this.storageViewService = inject(TYPES.storageViewService);
718
913
  this.exchangeService = inject(TYPES.exchangeService);
719
914
  this.exchangeMockService = inject(TYPES.exchangeMockService);
915
+ this.signalViewService = inject(TYPES.signalViewService);
720
916
  this.getSignalCandles = async (signalId, interval) => {
721
917
  this.loggerService.log("exchangeViewService getCandles", {
722
918
  signalId,
@@ -750,15 +946,53 @@ class ExchangeViewService {
750
946
  if (!signal) {
751
947
  throw new Error(`Signal with ID ${signalId} not found`);
752
948
  }
753
- const { pendingAt, scheduledAt, minuteEstimatedTime, } = signal;
949
+ const { pendingAt, scheduledAt } = signal;
754
950
  const eventAt = pendingAt || scheduledAt;
951
+ const updatedAt = await this.signalViewService.getLastUpdateTimestamp(signalId);
755
952
  return await this.exchangeService.getRangeCandles({
756
953
  symbol: signal.symbol,
757
954
  exchangeName: signal.exchangeName,
758
955
  signalStartTime: eventAt,
759
- 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,
760
963
  interval,
761
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}`);
762
996
  };
763
997
  }
764
998
  }
@@ -822,6 +1056,7 @@ class StatusViewService {
822
1056
  constructor() {
823
1057
  this.loggerService = inject(TYPES.loggerService);
824
1058
  this.statusMockService = inject(TYPES.statusMockService);
1059
+ this.signalViewService = inject(TYPES.signalViewService);
825
1060
  this.getStatusList = async () => {
826
1061
  this.loggerService.log("statusViewService getStatusList");
827
1062
  if (CC_ENABLE_MOCK) {
@@ -884,6 +1119,12 @@ class StatusViewService {
884
1119
  if (!positionPartials) {
885
1120
  return null;
886
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);
887
1128
  return {
888
1129
  signalId: pendingSignal.id,
889
1130
  position: pendingSignal.position,
@@ -904,11 +1145,80 @@ class StatusViewService {
904
1145
  partialExecuted: pendingSignal.partialExecuted,
905
1146
  pendingAt: pendingSignal.pendingAt,
906
1147
  minuteEstimatedTime: pendingSignal.minuteEstimatedTime,
1148
+ timestamp,
1149
+ updatedAt,
907
1150
  positionEntries,
908
1151
  positionLevels,
909
1152
  positionPartials,
910
1153
  };
911
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
+ };
912
1222
  }
913
1223
  }
914
1224
 
@@ -916,6 +1226,21 @@ class MarkdownViewService {
916
1226
  constructor() {
917
1227
  this.loggerService = inject(TYPES.loggerService);
918
1228
  this.markdownMockService = inject(TYPES.markdownMockService);
1229
+ // Strategy
1230
+ this.getStrategyData = async (symbol, strategyName, exchangeName, frameName, backtest = false) => {
1231
+ this.loggerService.log("markdownViewService getStrategyData", { symbol, strategyName, exchangeName, frameName, backtest });
1232
+ if (CC_ENABLE_MOCK) {
1233
+ return await this.markdownMockService.getStrategyData(symbol, strategyName, exchangeName, frameName);
1234
+ }
1235
+ return await Strategy.getData(symbol, { strategyName, exchangeName, frameName }, backtest);
1236
+ };
1237
+ this.getStrategyReport = async (symbol, strategyName, exchangeName, frameName, backtest = false) => {
1238
+ this.loggerService.log("markdownViewService getStrategyReport", { symbol, strategyName, exchangeName, frameName, backtest });
1239
+ if (CC_ENABLE_MOCK) {
1240
+ return await this.markdownMockService.getStrategyReport(symbol, strategyName, exchangeName, frameName);
1241
+ }
1242
+ return await Strategy.getReport(symbol, { strategyName, exchangeName, frameName }, backtest);
1243
+ };
919
1244
  // Backtest
920
1245
  this.getBacktestData = async (symbol, strategyName, exchangeName, frameName) => {
921
1246
  this.loggerService.log("markdownViewService getBacktestData", { symbol, strategyName, exchangeName, frameName });
@@ -1084,6 +1409,185 @@ class MarkdownViewService {
1084
1409
  }
1085
1410
  }
1086
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
+
1087
1591
  const symbol_list = [
1088
1592
  {
1089
1593
  icon: "/icon/btc.png",
@@ -1280,6 +1784,9 @@ class LiveMetaService {
1280
1784
  provide(TYPES.logMockService, () => new LogMockService());
1281
1785
  provide(TYPES.statusMockService, () => new StatusMockService());
1282
1786
  provide(TYPES.markdownMockService, () => new MarkdownMockService());
1787
+ provide(TYPES.explorerMockService, () => new ExplorerMockService());
1788
+ provide(TYPES.signalMockService, () => new SignalMockService());
1789
+ provide(TYPES.heatMockService, () => new HeatMockService());
1283
1790
  }
1284
1791
  {
1285
1792
  provide(TYPES.notificationViewService, () => new NotificationViewService());
@@ -1288,6 +1795,9 @@ class LiveMetaService {
1288
1795
  provide(TYPES.logViewService, () => new LogViewService());
1289
1796
  provide(TYPES.statusViewService, () => new StatusViewService());
1290
1797
  provide(TYPES.markdownViewService, () => new MarkdownViewService());
1798
+ provide(TYPES.explorerViewService, () => new ExplorerViewService());
1799
+ provide(TYPES.signalViewService, () => new SignalViewService());
1800
+ provide(TYPES.heatViewService, () => new HeatViewService());
1291
1801
  }
1292
1802
 
1293
1803
  const baseServices = {
@@ -1310,6 +1820,9 @@ const mockServices = {
1310
1820
  logMockService: inject(TYPES.logMockService),
1311
1821
  statusMockService: inject(TYPES.statusMockService),
1312
1822
  markdownMockService: inject(TYPES.markdownMockService),
1823
+ explorerMockService: inject(TYPES.explorerMockService),
1824
+ signalMockService: inject(TYPES.signalMockService),
1825
+ heatMockService: inject(TYPES.heatMockService),
1313
1826
  };
1314
1827
  const viewServices = {
1315
1828
  notificationViewService: inject(TYPES.notificationViewService),
@@ -1318,6 +1831,9 @@ const viewServices = {
1318
1831
  logViewService: inject(TYPES.logViewService),
1319
1832
  statusViewService: inject(TYPES.statusViewService),
1320
1833
  markdownViewService: inject(TYPES.markdownViewService),
1834
+ explorerViewService: inject(TYPES.explorerViewService),
1835
+ signalViewService: inject(TYPES.signalViewService),
1836
+ heatViewService: inject(TYPES.heatViewService),
1321
1837
  };
1322
1838
  const ioc = {
1323
1839
  ...baseServices,
@@ -1328,11 +1844,11 @@ const ioc = {
1328
1844
  };
1329
1845
  init();
1330
1846
 
1331
- const router$8 = Router({
1847
+ const router$a = Router({
1332
1848
  params: true,
1333
1849
  });
1334
1850
  // ExchangeMockService endpoints
1335
- router$8.post("/api/v1/mock/candles_signal", async (req, res) => {
1851
+ router$a.post("/api/v1/mock/candles_signal", async (req, res) => {
1336
1852
  try {
1337
1853
  const request = await micro.json(req);
1338
1854
  const { signalId, interval, requestId, serviceName } = request;
@@ -1360,7 +1876,7 @@ router$8.post("/api/v1/mock/candles_signal", async (req, res) => {
1360
1876
  });
1361
1877
  }
1362
1878
  });
1363
- router$8.post("/api/v1/mock/candles_point", async (req, res) => {
1879
+ router$a.post("/api/v1/mock/candles_point", async (req, res) => {
1364
1880
  try {
1365
1881
  const request = await micro.json(req);
1366
1882
  const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
@@ -1394,7 +1910,7 @@ router$8.post("/api/v1/mock/candles_point", async (req, res) => {
1394
1910
  }
1395
1911
  });
1396
1912
  // NotificationMockService endpoints
1397
- router$8.post("/api/v1/mock/notification_list", async (req, res) => {
1913
+ router$a.post("/api/v1/mock/notification_list", async (req, res) => {
1398
1914
  try {
1399
1915
  const request = await micro.json(req);
1400
1916
  const { requestId, serviceName } = request;
@@ -1422,7 +1938,7 @@ router$8.post("/api/v1/mock/notification_list", async (req, res) => {
1422
1938
  });
1423
1939
  }
1424
1940
  });
1425
- 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) => {
1426
1942
  try {
1427
1943
  const request = await micro.json(req);
1428
1944
  const { requestId, serviceName } = request;
@@ -1451,7 +1967,7 @@ router$8.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1451
1967
  });
1452
1968
  }
1453
1969
  });
1454
- router$8.post("/api/v1/mock/notification_filter", async (req, res) => {
1970
+ router$a.post("/api/v1/mock/notification_filter", async (req, res) => {
1455
1971
  try {
1456
1972
  const request = await micro.json(req);
1457
1973
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1480,7 +1996,7 @@ router$8.post("/api/v1/mock/notification_filter", async (req, res) => {
1480
1996
  }
1481
1997
  });
1482
1998
  // StorageMockService endpoints
1483
- 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) => {
1484
2000
  try {
1485
2001
  const request = await micro.json(req);
1486
2002
  const { requestId, serviceName } = request;
@@ -1509,7 +2025,7 @@ router$8.post("/api/v1/mock/storage_one/:id", async (req, res) => {
1509
2025
  });
1510
2026
  }
1511
2027
  });
1512
- 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) => {
1513
2029
  try {
1514
2030
  const request = await micro.json(req);
1515
2031
  const { requestId, serviceName } = request;
@@ -1537,7 +2053,7 @@ router$8.post("/api/v1/mock/storage_list/live", async (req, res) => {
1537
2053
  });
1538
2054
  }
1539
2055
  });
1540
- 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) => {
1541
2057
  try {
1542
2058
  const request = await micro.json(req);
1543
2059
  const { requestId, serviceName } = request;
@@ -1566,7 +2082,7 @@ router$8.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
1566
2082
  }
1567
2083
  });
1568
2084
  // LogMockService endpoints
1569
- router$8.post("/api/v1/mock/log_list", async (req, res) => {
2085
+ router$a.post("/api/v1/mock/log_list", async (req, res) => {
1570
2086
  try {
1571
2087
  const request = await micro.json(req);
1572
2088
  const { requestId, serviceName } = request;
@@ -1594,7 +2110,7 @@ router$8.post("/api/v1/mock/log_list", async (req, res) => {
1594
2110
  });
1595
2111
  }
1596
2112
  });
1597
- 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) => {
1598
2114
  try {
1599
2115
  const request = await micro.json(req);
1600
2116
  const { requestId, serviceName } = request;
@@ -1623,7 +2139,7 @@ router$8.post("/api/v1/mock/log_one/:id", async (req, res) => {
1623
2139
  });
1624
2140
  }
1625
2141
  });
1626
- router$8.post("/api/v1/mock/log_filter", async (req, res) => {
2142
+ router$a.post("/api/v1/mock/log_filter", async (req, res) => {
1627
2143
  try {
1628
2144
  const request = await micro.json(req);
1629
2145
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1651,7 +2167,7 @@ router$8.post("/api/v1/mock/log_filter", async (req, res) => {
1651
2167
  });
1652
2168
  }
1653
2169
  });
1654
- router$8.post("/api/v1/mock/candles_live", async (req, res) => {
2170
+ router$a.post("/api/v1/mock/candles_live", async (req, res) => {
1655
2171
  try {
1656
2172
  const request = await micro.json(req);
1657
2173
  const { signalId, interval, requestId, serviceName } = request;
@@ -1679,12 +2195,11 @@ router$8.post("/api/v1/mock/candles_live", async (req, res) => {
1679
2195
  });
1680
2196
  }
1681
2197
  });
1682
- // StatusMockService endpoints
1683
- router$8.post("/api/v1/mock/status_list", async (req, res) => {
2198
+ router$a.post("/api/v1/mock/candles_last", async (req, res) => {
1684
2199
  try {
1685
2200
  const request = await micro.json(req);
1686
- const { requestId, serviceName } = request;
1687
- const data = await ioc.statusMockService.getStatusList();
2201
+ const { symbol, interval, requestId, serviceName } = request;
2202
+ const data = await ioc.exchangeMockService.getLastCandles(symbol, interval);
1688
2203
  const result = {
1689
2204
  data,
1690
2205
  status: "ok",
@@ -1692,14 +2207,14 @@ router$8.post("/api/v1/mock/status_list", async (req, res) => {
1692
2207
  requestId,
1693
2208
  serviceName,
1694
2209
  };
1695
- ioc.loggerService.log("/api/v1/mock/status_list ok", {
2210
+ ioc.loggerService.log("/api/v1/mock/candles_last ok", {
1696
2211
  request,
1697
2212
  result: omit(result, "data"),
1698
2213
  });
1699
2214
  return await micro.send(res, 200, result);
1700
2215
  }
1701
2216
  catch (error) {
1702
- ioc.loggerService.log("/api/v1/mock/status_list error", {
2217
+ ioc.loggerService.log("/api/v1/mock/candles_last error", {
1703
2218
  error: errorData(error),
1704
2219
  });
1705
2220
  return await micro.send(res, 200, {
@@ -1708,12 +2223,13 @@ router$8.post("/api/v1/mock/status_list", async (req, res) => {
1708
2223
  });
1709
2224
  }
1710
2225
  });
1711
- router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
2226
+ // SignalMockService endpoints
2227
+ router$a.post("/api/v1/mock/signal_last_update/:id", async (req, res) => {
1712
2228
  try {
1713
2229
  const request = await micro.json(req);
1714
2230
  const { requestId, serviceName } = request;
1715
- const id = req.params.id;
1716
- const data = await ioc.statusMockService.getStatusOne(id);
2231
+ const signalId = req.params.id;
2232
+ const data = await ioc.signalMockService.getLastUpdateTimestamp(signalId);
1717
2233
  const result = {
1718
2234
  data,
1719
2235
  status: "ok",
@@ -1721,14 +2237,14 @@ router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
1721
2237
  requestId,
1722
2238
  serviceName,
1723
2239
  };
1724
- ioc.loggerService.log("/api/v1/mock/status_one/:id ok", {
2240
+ ioc.loggerService.log("/api/v1/mock/signal_last_update/:id ok", {
1725
2241
  request,
1726
2242
  result: omit(result, "data"),
1727
2243
  });
1728
2244
  return await micro.send(res, 200, result);
1729
2245
  }
1730
2246
  catch (error) {
1731
- ioc.loggerService.log("/api/v1/mock/status_one/:id error", {
2247
+ ioc.loggerService.log("/api/v1/mock/signal_last_update/:id error", {
1732
2248
  error: errorData(error),
1733
2249
  });
1734
2250
  return await micro.send(res, 200, {
@@ -1737,16 +2253,11 @@ router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
1737
2253
  });
1738
2254
  }
1739
2255
  });
1740
-
1741
- const router$7 = Router({
1742
- params: true,
1743
- });
1744
- // ExchangeViewService endpoints
1745
- router$7.post("/api/v1/view/candles_signal", async (req, res) => {
2256
+ router$a.post("/api/v1/mock/signal_pending", async (req, res) => {
1746
2257
  try {
1747
2258
  const request = await micro.json(req);
1748
- const { signalId, interval, requestId, serviceName } = request;
1749
- const data = await ioc.exchangeViewService.getSignalCandles(signalId, interval);
2259
+ const { symbol, requestId, serviceName } = request;
2260
+ const data = await ioc.signalMockService.getPendingSignal(symbol);
1750
2261
  const result = {
1751
2262
  data,
1752
2263
  status: "ok",
@@ -1754,14 +2265,14 @@ router$7.post("/api/v1/view/candles_signal", async (req, res) => {
1754
2265
  requestId,
1755
2266
  serviceName,
1756
2267
  };
1757
- ioc.loggerService.log("/api/v1/view/candles_signal ok", {
2268
+ ioc.loggerService.log("/api/v1/mock/signal_pending ok", {
1758
2269
  request,
1759
2270
  result: omit(result, "data"),
1760
2271
  });
1761
2272
  return await micro.send(res, 200, result);
1762
2273
  }
1763
2274
  catch (error) {
1764
- ioc.loggerService.log("/api/v1/view/candles_signal error", {
2275
+ ioc.loggerService.log("/api/v1/mock/signal_pending error", {
1765
2276
  error: errorData(error),
1766
2277
  });
1767
2278
  return await micro.send(res, 200, {
@@ -1770,16 +2281,12 @@ router$7.post("/api/v1/view/candles_signal", async (req, res) => {
1770
2281
  });
1771
2282
  }
1772
2283
  });
1773
- router$7.post("/api/v1/view/candles_point", async (req, res) => {
2284
+ // StatusMockService endpoints
2285
+ router$a.post("/api/v1/mock/status_list", async (req, res) => {
1774
2286
  try {
1775
2287
  const request = await micro.json(req);
1776
- const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
1777
- const data = await ioc.exchangeService.getPointCandles({
1778
- currentTime,
1779
- interval,
1780
- symbol,
1781
- exchangeName,
1782
- });
2288
+ const { requestId, serviceName } = request;
2289
+ const data = await ioc.statusMockService.getStatusList();
1783
2290
  const result = {
1784
2291
  data,
1785
2292
  status: "ok",
@@ -1787,14 +2294,14 @@ router$7.post("/api/v1/view/candles_point", async (req, res) => {
1787
2294
  requestId,
1788
2295
  serviceName,
1789
2296
  };
1790
- ioc.loggerService.log("/api/v1/view/candles_point ok", {
2297
+ ioc.loggerService.log("/api/v1/mock/status_list ok", {
1791
2298
  request,
1792
2299
  result: omit(result, "data"),
1793
2300
  });
1794
2301
  return await micro.send(res, 200, result);
1795
2302
  }
1796
2303
  catch (error) {
1797
- ioc.loggerService.log("/api/v1/view/candles_point error", {
2304
+ ioc.loggerService.log("/api/v1/mock/status_list error", {
1798
2305
  error: errorData(error),
1799
2306
  });
1800
2307
  return await micro.send(res, 200, {
@@ -1803,11 +2310,12 @@ router$7.post("/api/v1/view/candles_point", async (req, res) => {
1803
2310
  });
1804
2311
  }
1805
2312
  });
1806
- router$7.post("/api/v1/view/candles_live", async (req, res) => {
2313
+ router$a.post("/api/v1/mock/status_one/:id", async (req, res) => {
1807
2314
  try {
1808
2315
  const request = await micro.json(req);
1809
- const { signalId, interval, requestId, serviceName } = request;
1810
- const data = await ioc.exchangeViewService.getLiveCandles(signalId, interval);
2316
+ const { requestId, serviceName } = request;
2317
+ const id = req.params.id;
2318
+ const data = await ioc.statusMockService.getStatusOne(id);
1811
2319
  const result = {
1812
2320
  data,
1813
2321
  status: "ok",
@@ -1815,14 +2323,14 @@ router$7.post("/api/v1/view/candles_live", async (req, res) => {
1815
2323
  requestId,
1816
2324
  serviceName,
1817
2325
  };
1818
- ioc.loggerService.log("/api/v1/view/candles_live ok", {
2326
+ ioc.loggerService.log("/api/v1/mock/status_one/:id ok", {
1819
2327
  request,
1820
2328
  result: omit(result, "data"),
1821
2329
  });
1822
2330
  return await micro.send(res, 200, result);
1823
2331
  }
1824
2332
  catch (error) {
1825
- ioc.loggerService.log("/api/v1/view/candles_live error", {
2333
+ ioc.loggerService.log("/api/v1/mock/status_one/:id error", {
1826
2334
  error: errorData(error),
1827
2335
  });
1828
2336
  return await micro.send(res, 200, {
@@ -1831,12 +2339,12 @@ router$7.post("/api/v1/view/candles_live", async (req, res) => {
1831
2339
  });
1832
2340
  }
1833
2341
  });
1834
- // NotificationViewService endpoints
1835
- router$7.post("/api/v1/view/notification_list", async (req, res) => {
2342
+ // HeatMockService endpoints
2343
+ router$a.post("/api/v1/mock/heat_data", async (req, res) => {
1836
2344
  try {
1837
2345
  const request = await micro.json(req);
1838
2346
  const { requestId, serviceName } = request;
1839
- const data = await ioc.notificationViewService.getList();
2347
+ const data = await ioc.heatMockService.getStrategyHeatData();
1840
2348
  const result = {
1841
2349
  data,
1842
2350
  status: "ok",
@@ -1844,14 +2352,14 @@ router$7.post("/api/v1/view/notification_list", async (req, res) => {
1844
2352
  requestId,
1845
2353
  serviceName,
1846
2354
  };
1847
- ioc.loggerService.log("/api/v1/view/notification_list ok", {
2355
+ ioc.loggerService.log("/api/v1/mock/heat_data ok", {
1848
2356
  request,
1849
2357
  result: omit(result, "data"),
1850
2358
  });
1851
2359
  return await micro.send(res, 200, result);
1852
2360
  }
1853
2361
  catch (error) {
1854
- ioc.loggerService.log("/api/v1/view/notification_list error", {
2362
+ ioc.loggerService.log("/api/v1/mock/heat_data error", {
1855
2363
  error: errorData(error),
1856
2364
  });
1857
2365
  return await micro.send(res, 200, {
@@ -1860,12 +2368,11 @@ router$7.post("/api/v1/view/notification_list", async (req, res) => {
1860
2368
  });
1861
2369
  }
1862
2370
  });
1863
- router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
2371
+ router$a.post("/api/v1/mock/heat_report", async (req, res) => {
1864
2372
  try {
1865
2373
  const request = await micro.json(req);
1866
2374
  const { requestId, serviceName } = request;
1867
- const id = req.params.id;
1868
- const data = await ioc.notificationViewService.getOne(id);
2375
+ const data = await ioc.heatMockService.getStrategyHeatReport();
1869
2376
  const result = {
1870
2377
  data,
1871
2378
  status: "ok",
@@ -1873,14 +2380,14 @@ router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
1873
2380
  requestId,
1874
2381
  serviceName,
1875
2382
  };
1876
- ioc.loggerService.log("/api/v1/view/notification_one/:id ok", {
2383
+ ioc.loggerService.log("/api/v1/mock/heat_report ok", {
1877
2384
  request,
1878
2385
  result: omit(result, "data"),
1879
2386
  });
1880
2387
  return await micro.send(res, 200, result);
1881
2388
  }
1882
2389
  catch (error) {
1883
- ioc.loggerService.log("/api/v1/view/notification_one/:id error", {
2390
+ ioc.loggerService.log("/api/v1/mock/heat_report error", {
1884
2391
  error: errorData(error),
1885
2392
  });
1886
2393
  return await micro.send(res, 200, {
@@ -1889,11 +2396,11 @@ router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
1889
2396
  });
1890
2397
  }
1891
2398
  });
1892
- router$7.post("/api/v1/view/notification_filter", async (req, res) => {
2399
+ router$a.post("/api/v1/mock/status_info", async (req, res) => {
1893
2400
  try {
1894
2401
  const request = await micro.json(req);
1895
- const { requestId, serviceName, filterData, limit, offset } = request;
1896
- const data = await ioc.notificationViewService.findByFilter(filterData, limit, offset);
2402
+ const { requestId, serviceName } = request;
2403
+ const data = await ioc.statusMockService.getStatusInfo();
1897
2404
  const result = {
1898
2405
  data,
1899
2406
  status: "ok",
@@ -1901,14 +2408,14 @@ router$7.post("/api/v1/view/notification_filter", async (req, res) => {
1901
2408
  requestId,
1902
2409
  serviceName,
1903
2410
  };
1904
- ioc.loggerService.log("/api/v1/view/notification_filter ok", {
2411
+ ioc.loggerService.log("/api/v1/mock/status_info ok", {
1905
2412
  request,
1906
2413
  result: omit(result, "data"),
1907
2414
  });
1908
2415
  return await micro.send(res, 200, result);
1909
2416
  }
1910
2417
  catch (error) {
1911
- ioc.loggerService.log("/api/v1/view/notification_filter error", {
2418
+ ioc.loggerService.log("/api/v1/mock/status_info error", {
1912
2419
  error: errorData(error),
1913
2420
  });
1914
2421
  return await micro.send(res, 200, {
@@ -1917,13 +2424,16 @@ router$7.post("/api/v1/view/notification_filter", async (req, res) => {
1917
2424
  });
1918
2425
  }
1919
2426
  });
1920
- // StorageViewService endpoints
1921
- router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
2427
+
2428
+ const router$9 = Router({
2429
+ params: true,
2430
+ });
2431
+ // ExchangeViewService endpoints
2432
+ router$9.post("/api/v1/view/candles_signal", async (req, res) => {
1922
2433
  try {
1923
2434
  const request = await micro.json(req);
1924
- const { requestId, serviceName } = request;
1925
- const signalId = req.params.id;
1926
- const data = await ioc.storageViewService.findSignalById(signalId);
2435
+ const { signalId, interval, requestId, serviceName } = request;
2436
+ const data = await ioc.exchangeViewService.getSignalCandles(signalId, interval);
1927
2437
  const result = {
1928
2438
  data,
1929
2439
  status: "ok",
@@ -1931,14 +2441,14 @@ router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
1931
2441
  requestId,
1932
2442
  serviceName,
1933
2443
  };
1934
- ioc.loggerService.log("/api/v1/view/storage_one/:id ok", {
2444
+ ioc.loggerService.log("/api/v1/view/candles_signal ok", {
1935
2445
  request,
1936
2446
  result: omit(result, "data"),
1937
2447
  });
1938
2448
  return await micro.send(res, 200, result);
1939
2449
  }
1940
2450
  catch (error) {
1941
- ioc.loggerService.log("/api/v1/view/storage_one/:id error", {
2451
+ ioc.loggerService.log("/api/v1/view/candles_signal error", {
1942
2452
  error: errorData(error),
1943
2453
  });
1944
2454
  return await micro.send(res, 200, {
@@ -1947,11 +2457,16 @@ router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
1947
2457
  });
1948
2458
  }
1949
2459
  });
1950
- router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
2460
+ router$9.post("/api/v1/view/candles_point", async (req, res) => {
1951
2461
  try {
1952
2462
  const request = await micro.json(req);
1953
- const { requestId, serviceName } = request;
1954
- const data = await ioc.storageViewService.listSignalLive();
2463
+ const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
2464
+ const data = await ioc.exchangeService.getPointCandles({
2465
+ currentTime,
2466
+ interval,
2467
+ symbol,
2468
+ exchangeName,
2469
+ });
1955
2470
  const result = {
1956
2471
  data,
1957
2472
  status: "ok",
@@ -1959,14 +2474,14 @@ router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
1959
2474
  requestId,
1960
2475
  serviceName,
1961
2476
  };
1962
- ioc.loggerService.log("/api/v1/view/storage_list/live ok", {
2477
+ ioc.loggerService.log("/api/v1/view/candles_point ok", {
1963
2478
  request,
1964
2479
  result: omit(result, "data"),
1965
2480
  });
1966
2481
  return await micro.send(res, 200, result);
1967
2482
  }
1968
2483
  catch (error) {
1969
- ioc.loggerService.log("/api/v1/view/storage_list/live error", {
2484
+ ioc.loggerService.log("/api/v1/view/candles_point error", {
1970
2485
  error: errorData(error),
1971
2486
  });
1972
2487
  return await micro.send(res, 200, {
@@ -1975,11 +2490,11 @@ router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
1975
2490
  });
1976
2491
  }
1977
2492
  });
1978
- router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2493
+ router$9.post("/api/v1/view/candles_live", async (req, res) => {
1979
2494
  try {
1980
2495
  const request = await micro.json(req);
1981
- const { requestId, serviceName } = request;
1982
- const data = await ioc.storageViewService.listSignalBacktest();
2496
+ const { signalId, interval, requestId, serviceName } = request;
2497
+ const data = await ioc.exchangeViewService.getLiveCandles(signalId, interval);
1983
2498
  const result = {
1984
2499
  data,
1985
2500
  status: "ok",
@@ -1987,14 +2502,14 @@ router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
1987
2502
  requestId,
1988
2503
  serviceName,
1989
2504
  };
1990
- ioc.loggerService.log("/api/v1/view/storage_list/backtest ok", {
2505
+ ioc.loggerService.log("/api/v1/view/candles_live ok", {
1991
2506
  request,
1992
2507
  result: omit(result, "data"),
1993
2508
  });
1994
2509
  return await micro.send(res, 200, result);
1995
2510
  }
1996
2511
  catch (error) {
1997
- ioc.loggerService.log("/api/v1/view/storage_list/backtest error", {
2512
+ ioc.loggerService.log("/api/v1/view/candles_live error", {
1998
2513
  error: errorData(error),
1999
2514
  });
2000
2515
  return await micro.send(res, 200, {
@@ -2003,11 +2518,211 @@ router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2003
2518
  });
2004
2519
  }
2005
2520
  });
2006
- // LogViewService endpoints
2007
- router$7.post("/api/v1/view/log_list", async (req, res) => {
2521
+ router$9.post("/api/v1/view/candles_last", async (req, res) => {
2008
2522
  try {
2009
2523
  const request = await micro.json(req);
2010
- const { requestId, serviceName } = request;
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
+ });
2549
+ // NotificationViewService endpoints
2550
+ router$9.post("/api/v1/view/notification_list", async (req, res) => {
2551
+ try {
2552
+ const request = await micro.json(req);
2553
+ const { requestId, serviceName } = request;
2554
+ const data = await ioc.notificationViewService.getList();
2555
+ const result = {
2556
+ data,
2557
+ status: "ok",
2558
+ error: "",
2559
+ requestId,
2560
+ serviceName,
2561
+ };
2562
+ ioc.loggerService.log("/api/v1/view/notification_list ok", {
2563
+ request,
2564
+ result: omit(result, "data"),
2565
+ });
2566
+ return await micro.send(res, 200, result);
2567
+ }
2568
+ catch (error) {
2569
+ ioc.loggerService.log("/api/v1/view/notification_list error", {
2570
+ error: errorData(error),
2571
+ });
2572
+ return await micro.send(res, 200, {
2573
+ status: "error",
2574
+ error: getErrorMessage(error),
2575
+ });
2576
+ }
2577
+ });
2578
+ router$9.post("/api/v1/view/notification_one/:id", async (req, res) => {
2579
+ try {
2580
+ const request = await micro.json(req);
2581
+ const { requestId, serviceName } = request;
2582
+ const id = req.params.id;
2583
+ const data = await ioc.notificationViewService.getOne(id);
2584
+ const result = {
2585
+ data,
2586
+ status: "ok",
2587
+ error: "",
2588
+ requestId,
2589
+ serviceName,
2590
+ };
2591
+ ioc.loggerService.log("/api/v1/view/notification_one/:id ok", {
2592
+ request,
2593
+ result: omit(result, "data"),
2594
+ });
2595
+ return await micro.send(res, 200, result);
2596
+ }
2597
+ catch (error) {
2598
+ ioc.loggerService.log("/api/v1/view/notification_one/:id error", {
2599
+ error: errorData(error),
2600
+ });
2601
+ return await micro.send(res, 200, {
2602
+ status: "error",
2603
+ error: getErrorMessage(error),
2604
+ });
2605
+ }
2606
+ });
2607
+ router$9.post("/api/v1/view/notification_filter", async (req, res) => {
2608
+ try {
2609
+ const request = await micro.json(req);
2610
+ const { requestId, serviceName, filterData, limit, offset } = request;
2611
+ const data = await ioc.notificationViewService.findByFilter(filterData, limit, offset);
2612
+ const result = {
2613
+ data,
2614
+ status: "ok",
2615
+ error: "",
2616
+ requestId,
2617
+ serviceName,
2618
+ };
2619
+ ioc.loggerService.log("/api/v1/view/notification_filter ok", {
2620
+ request,
2621
+ result: omit(result, "data"),
2622
+ });
2623
+ return await micro.send(res, 200, result);
2624
+ }
2625
+ catch (error) {
2626
+ ioc.loggerService.log("/api/v1/view/notification_filter error", {
2627
+ error: errorData(error),
2628
+ });
2629
+ return await micro.send(res, 200, {
2630
+ status: "error",
2631
+ error: getErrorMessage(error),
2632
+ });
2633
+ }
2634
+ });
2635
+ // StorageViewService endpoints
2636
+ router$9.post("/api/v1/view/storage_one/:id", async (req, res) => {
2637
+ try {
2638
+ const request = await micro.json(req);
2639
+ const { requestId, serviceName } = request;
2640
+ const signalId = req.params.id;
2641
+ const data = await ioc.storageViewService.findSignalById(signalId);
2642
+ const result = {
2643
+ data,
2644
+ status: "ok",
2645
+ error: "",
2646
+ requestId,
2647
+ serviceName,
2648
+ };
2649
+ ioc.loggerService.log("/api/v1/view/storage_one/:id ok", {
2650
+ request,
2651
+ result: omit(result, "data"),
2652
+ });
2653
+ return await micro.send(res, 200, result);
2654
+ }
2655
+ catch (error) {
2656
+ ioc.loggerService.log("/api/v1/view/storage_one/:id error", {
2657
+ error: errorData(error),
2658
+ });
2659
+ return await micro.send(res, 200, {
2660
+ status: "error",
2661
+ error: getErrorMessage(error),
2662
+ });
2663
+ }
2664
+ });
2665
+ router$9.post("/api/v1/view/storage_list/live", async (req, res) => {
2666
+ try {
2667
+ const request = await micro.json(req);
2668
+ const { requestId, serviceName } = request;
2669
+ const data = await ioc.storageViewService.listSignalLive();
2670
+ const result = {
2671
+ data,
2672
+ status: "ok",
2673
+ error: "",
2674
+ requestId,
2675
+ serviceName,
2676
+ };
2677
+ ioc.loggerService.log("/api/v1/view/storage_list/live ok", {
2678
+ request,
2679
+ result: omit(result, "data"),
2680
+ });
2681
+ return await micro.send(res, 200, result);
2682
+ }
2683
+ catch (error) {
2684
+ ioc.loggerService.log("/api/v1/view/storage_list/live error", {
2685
+ error: errorData(error),
2686
+ });
2687
+ return await micro.send(res, 200, {
2688
+ status: "error",
2689
+ error: getErrorMessage(error),
2690
+ });
2691
+ }
2692
+ });
2693
+ router$9.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2694
+ try {
2695
+ const request = await micro.json(req);
2696
+ const { requestId, serviceName } = request;
2697
+ const data = await ioc.storageViewService.listSignalBacktest();
2698
+ const result = {
2699
+ data,
2700
+ status: "ok",
2701
+ error: "",
2702
+ requestId,
2703
+ serviceName,
2704
+ };
2705
+ ioc.loggerService.log("/api/v1/view/storage_list/backtest ok", {
2706
+ request,
2707
+ result: omit(result, "data"),
2708
+ });
2709
+ return await micro.send(res, 200, result);
2710
+ }
2711
+ catch (error) {
2712
+ ioc.loggerService.log("/api/v1/view/storage_list/backtest error", {
2713
+ error: errorData(error),
2714
+ });
2715
+ return await micro.send(res, 200, {
2716
+ status: "error",
2717
+ error: getErrorMessage(error),
2718
+ });
2719
+ }
2720
+ });
2721
+ // LogViewService endpoints
2722
+ router$9.post("/api/v1/view/log_list", async (req, res) => {
2723
+ try {
2724
+ const request = await micro.json(req);
2725
+ const { requestId, serviceName } = request;
2011
2726
  const data = await ioc.logViewService.getList();
2012
2727
  const result = {
2013
2728
  data,
@@ -2032,7 +2747,7 @@ router$7.post("/api/v1/view/log_list", async (req, res) => {
2032
2747
  });
2033
2748
  }
2034
2749
  });
2035
- 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) => {
2036
2751
  try {
2037
2752
  const request = await micro.json(req);
2038
2753
  const { requestId, serviceName } = request;
@@ -2061,7 +2776,7 @@ router$7.post("/api/v1/view/log_one/:id", async (req, res) => {
2061
2776
  });
2062
2777
  }
2063
2778
  });
2064
- router$7.post("/api/v1/view/log_filter", async (req, res) => {
2779
+ router$9.post("/api/v1/view/log_filter", async (req, res) => {
2065
2780
  try {
2066
2781
  const request = await micro.json(req);
2067
2782
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -2089,8 +2804,66 @@ router$7.post("/api/v1/view/log_filter", async (req, res) => {
2089
2804
  });
2090
2805
  }
2091
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
+ });
2092
2865
  // StatusViewService endpoints
2093
- router$7.post("/api/v1/view/status_list", async (req, res) => {
2866
+ router$9.post("/api/v1/view/status_list", async (req, res) => {
2094
2867
  try {
2095
2868
  const request = await micro.json(req);
2096
2869
  const { requestId, serviceName } = request;
@@ -2118,7 +2891,7 @@ router$7.post("/api/v1/view/status_list", async (req, res) => {
2118
2891
  });
2119
2892
  }
2120
2893
  });
2121
- 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) => {
2122
2895
  try {
2123
2896
  const request = await micro.json(req);
2124
2897
  const { requestId, serviceName } = request;
@@ -2147,6 +2920,91 @@ router$7.post("/api/v1/view/status_one/:id", async (req, res) => {
2147
2920
  });
2148
2921
  }
2149
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
+ });
2150
3008
 
2151
3009
  const require$1 = createRequire(import.meta.url);
2152
3010
  function getModulesPath() {
@@ -2155,7 +3013,7 @@ function getModulesPath() {
2155
3013
  return join(basePath, "../../../");
2156
3014
  }
2157
3015
 
2158
- const router$6 = Router({
3016
+ const router$8 = Router({
2159
3017
  params: true,
2160
3018
  });
2161
3019
  // getModulesPath
@@ -2172,7 +3030,7 @@ const ASSET_32 = CC_ENABLE_MOCK
2172
3030
  const cache128 = new Map();
2173
3031
  const cache32 = new Map();
2174
3032
  const cacheSvg = new Map();
2175
- router$6.get("/icon/128/:filename", async (req, res) => {
3033
+ router$8.get("/icon/128/:filename", async (req, res) => {
2176
3034
  const filename = req.params.filename;
2177
3035
  // Check cache first
2178
3036
  if (cache128.has(filename)) {
@@ -2188,7 +3046,7 @@ router$6.get("/icon/128/:filename", async (req, res) => {
2188
3046
  }
2189
3047
  return await micro.send(res, 404, "File not found (128)");
2190
3048
  });
2191
- router$6.get("/icon/32/:filename", async (req, res) => {
3049
+ router$8.get("/icon/32/:filename", async (req, res) => {
2192
3050
  const filename = req.params.filename;
2193
3051
  // Check cache first
2194
3052
  if (cache32.has(filename)) {
@@ -2204,7 +3062,7 @@ router$6.get("/icon/32/:filename", async (req, res) => {
2204
3062
  }
2205
3063
  return await micro.send(res, 404, "File not found (32)");
2206
3064
  });
2207
- router$6.get("/icon/svg/:filename", async (req, res) => {
3065
+ router$8.get("/icon/svg/:filename", async (req, res) => {
2208
3066
  const filename = req.params.filename;
2209
3067
  // Check cache first
2210
3068
  if (cacheSvg.has(filename)) {
@@ -2220,7 +3078,7 @@ router$6.get("/icon/svg/:filename", async (req, res) => {
2220
3078
  }
2221
3079
  return await micro.send(res, 404, "File not found (svg)");
2222
3080
  });
2223
- router$6.get("/icon/:filename", async (req, res) => {
3081
+ router$8.get("/icon/:filename", async (req, res) => {
2224
3082
  const filename = req.params.filename;
2225
3083
  // Check cache first
2226
3084
  if (cache32.has(filename)) {
@@ -2237,10 +3095,10 @@ router$6.get("/icon/:filename", async (req, res) => {
2237
3095
  return await micro.send(res, 404, "File not found (root)");
2238
3096
  });
2239
3097
 
2240
- const router$5 = Router({
3098
+ const router$7 = Router({
2241
3099
  params: true,
2242
3100
  });
2243
- router$5.post("/api/v1/dict/symbol/list", async (req, res) => {
3101
+ router$7.post("/api/v1/dict/symbol/list", async (req, res) => {
2244
3102
  try {
2245
3103
  const request = await micro.json(req);
2246
3104
  const { requestId, serviceName } = request;
@@ -2268,7 +3126,7 @@ router$5.post("/api/v1/dict/symbol/list", async (req, res) => {
2268
3126
  });
2269
3127
  }
2270
3128
  });
2271
- router$5.post("/api/v1/dict/symbol/map", async (req, res) => {
3129
+ router$7.post("/api/v1/dict/symbol/map", async (req, res) => {
2272
3130
  try {
2273
3131
  const request = await micro.json(req);
2274
3132
  const { requestId, serviceName } = request;
@@ -2296,7 +3154,7 @@ router$5.post("/api/v1/dict/symbol/map", async (req, res) => {
2296
3154
  });
2297
3155
  }
2298
3156
  });
2299
- router$5.post("/api/v1/dict/symbol/one", async (req, res) => {
3157
+ router$7.post("/api/v1/dict/symbol/one", async (req, res) => {
2300
3158
  try {
2301
3159
  const request = await micro.json(req);
2302
3160
  const { requestId, serviceName, id } = request;
@@ -2325,10 +3183,38 @@ router$5.post("/api/v1/dict/symbol/one", async (req, res) => {
2325
3183
  }
2326
3184
  });
2327
3185
 
2328
- const router$4 = Router({
3186
+ const router$6 = Router({
2329
3187
  params: true,
2330
3188
  });
2331
- router$4.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
3189
+ router$6.post("/api/v1/markdown_mock/strategy_data", async (req, res) => {
3190
+ try {
3191
+ const request = await micro.json(req);
3192
+ const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
3193
+ const data = await ioc.markdownMockService.getStrategyData(symbol, strategyName, exchangeName, frameName);
3194
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3195
+ ioc.loggerService.log("/api/v1/markdown_mock/strategy_data ok", { request, result: omit(result, "data") });
3196
+ return await micro.send(res, 200, result);
3197
+ }
3198
+ catch (error) {
3199
+ ioc.loggerService.log("/api/v1/markdown_mock/strategy_data error", { error: errorData(error) });
3200
+ return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3201
+ }
3202
+ });
3203
+ router$6.post("/api/v1/markdown_mock/strategy_report", async (req, res) => {
3204
+ try {
3205
+ const request = await micro.json(req);
3206
+ const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
3207
+ const data = await ioc.markdownMockService.getStrategyReport(symbol, strategyName, exchangeName, frameName);
3208
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3209
+ ioc.loggerService.log("/api/v1/markdown_mock/strategy_report ok", { request, result: omit(result, "data") });
3210
+ return await micro.send(res, 200, result);
3211
+ }
3212
+ catch (error) {
3213
+ ioc.loggerService.log("/api/v1/markdown_mock/strategy_report error", { error: errorData(error) });
3214
+ return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3215
+ }
3216
+ });
3217
+ router$6.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
2332
3218
  try {
2333
3219
  const request = await micro.json(req);
2334
3220
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2342,7 +3228,7 @@ router$4.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
2342
3228
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2343
3229
  }
2344
3230
  });
2345
- 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) => {
2346
3232
  try {
2347
3233
  const request = await micro.json(req);
2348
3234
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2356,7 +3242,7 @@ router$4.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
2356
3242
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2357
3243
  }
2358
3244
  });
2359
- 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) => {
2360
3246
  try {
2361
3247
  const request = await micro.json(req);
2362
3248
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2370,7 +3256,7 @@ router$4.post("/api/v1/markdown_mock/live_data", async (req, res) => {
2370
3256
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2371
3257
  }
2372
3258
  });
2373
- 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) => {
2374
3260
  try {
2375
3261
  const request = await micro.json(req);
2376
3262
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2384,7 +3270,7 @@ router$4.post("/api/v1/markdown_mock/live_report", async (req, res) => {
2384
3270
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2385
3271
  }
2386
3272
  });
2387
- 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) => {
2388
3274
  try {
2389
3275
  const request = await micro.json(req);
2390
3276
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2398,7 +3284,7 @@ router$4.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
2398
3284
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2399
3285
  }
2400
3286
  });
2401
- 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) => {
2402
3288
  try {
2403
3289
  const request = await micro.json(req);
2404
3290
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2412,7 +3298,7 @@ router$4.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
2412
3298
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2413
3299
  }
2414
3300
  });
2415
- 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) => {
2416
3302
  try {
2417
3303
  const request = await micro.json(req);
2418
3304
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2426,7 +3312,7 @@ router$4.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
2426
3312
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2427
3313
  }
2428
3314
  });
2429
- 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) => {
2430
3316
  try {
2431
3317
  const request = await micro.json(req);
2432
3318
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2440,7 +3326,7 @@ router$4.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
2440
3326
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2441
3327
  }
2442
3328
  });
2443
- 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) => {
2444
3330
  try {
2445
3331
  const request = await micro.json(req);
2446
3332
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2454,7 +3340,7 @@ router$4.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
2454
3340
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2455
3341
  }
2456
3342
  });
2457
- 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) => {
2458
3344
  try {
2459
3345
  const request = await micro.json(req);
2460
3346
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2468,7 +3354,7 @@ router$4.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
2468
3354
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2469
3355
  }
2470
3356
  });
2471
- 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) => {
2472
3358
  try {
2473
3359
  const request = await micro.json(req);
2474
3360
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2482,7 +3368,7 @@ router$4.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
2482
3368
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2483
3369
  }
2484
3370
  });
2485
- 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) => {
2486
3372
  try {
2487
3373
  const request = await micro.json(req);
2488
3374
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2496,7 +3382,7 @@ router$4.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) =>
2496
3382
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2497
3383
  }
2498
3384
  });
2499
- 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) => {
2500
3386
  try {
2501
3387
  const request = await micro.json(req);
2502
3388
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2510,7 +3396,7 @@ router$4.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
2510
3396
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2511
3397
  }
2512
3398
  });
2513
- 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) => {
2514
3400
  try {
2515
3401
  const request = await micro.json(req);
2516
3402
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2524,7 +3410,7 @@ router$4.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
2524
3410
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2525
3411
  }
2526
3412
  });
2527
- 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) => {
2528
3414
  try {
2529
3415
  const request = await micro.json(req);
2530
3416
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2538,7 +3424,7 @@ router$4.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
2538
3424
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2539
3425
  }
2540
3426
  });
2541
- 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) => {
2542
3428
  try {
2543
3429
  const request = await micro.json(req);
2544
3430
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2552,7 +3438,7 @@ router$4.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
2552
3438
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2553
3439
  }
2554
3440
  });
2555
- 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) => {
2556
3442
  try {
2557
3443
  const request = await micro.json(req);
2558
3444
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2566,7 +3452,7 @@ router$4.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
2566
3452
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2567
3453
  }
2568
3454
  });
2569
- 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) => {
2570
3456
  try {
2571
3457
  const request = await micro.json(req);
2572
3458
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2580,7 +3466,7 @@ router$4.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
2580
3466
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2581
3467
  }
2582
3468
  });
2583
- 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) => {
2584
3470
  try {
2585
3471
  const request = await micro.json(req);
2586
3472
  const { requestId, serviceName, strategyName, exchangeName, frameName } = request;
@@ -2594,7 +3480,7 @@ router$4.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
2594
3480
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2595
3481
  }
2596
3482
  });
2597
- 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) => {
2598
3484
  try {
2599
3485
  const request = await micro.json(req);
2600
3486
  const { requestId, serviceName, strategyName, exchangeName, frameName } = request;
@@ -2608,7 +3494,7 @@ router$4.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
2608
3494
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2609
3495
  }
2610
3496
  });
2611
- 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) => {
2612
3498
  try {
2613
3499
  const request = await micro.json(req);
2614
3500
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2622,7 +3508,7 @@ router$4.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
2622
3508
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2623
3509
  }
2624
3510
  });
2625
- 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) => {
2626
3512
  try {
2627
3513
  const request = await micro.json(req);
2628
3514
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2637,10 +3523,38 @@ router$4.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
2637
3523
  }
2638
3524
  });
2639
3525
 
2640
- const router$3 = Router({
3526
+ const router$5 = Router({
2641
3527
  params: true,
2642
3528
  });
2643
- router$3.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
3529
+ router$5.post("/api/v1/markdown_view/strategy_data", async (req, res) => {
3530
+ try {
3531
+ const request = await micro.json(req);
3532
+ const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
3533
+ const data = await ioc.markdownViewService.getStrategyData(symbol, strategyName, exchangeName, frameName, backtest);
3534
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3535
+ ioc.loggerService.log("/api/v1/markdown_view/strategy_data ok", { request, result: omit(result, "data") });
3536
+ return await micro.send(res, 200, result);
3537
+ }
3538
+ catch (error) {
3539
+ ioc.loggerService.log("/api/v1/markdown_view/strategy_data error", { error: errorData(error) });
3540
+ return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3541
+ }
3542
+ });
3543
+ router$5.post("/api/v1/markdown_view/strategy_report", async (req, res) => {
3544
+ try {
3545
+ const request = await micro.json(req);
3546
+ const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
3547
+ const data = await ioc.markdownViewService.getStrategyReport(symbol, strategyName, exchangeName, frameName, backtest);
3548
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3549
+ ioc.loggerService.log("/api/v1/markdown_view/strategy_report ok", { request, result: omit(result, "data") });
3550
+ return await micro.send(res, 200, result);
3551
+ }
3552
+ catch (error) {
3553
+ ioc.loggerService.log("/api/v1/markdown_view/strategy_report error", { error: errorData(error) });
3554
+ return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
3555
+ }
3556
+ });
3557
+ router$5.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
2644
3558
  try {
2645
3559
  const request = await micro.json(req);
2646
3560
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2654,7 +3568,7 @@ router$3.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
2654
3568
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2655
3569
  }
2656
3570
  });
2657
- 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) => {
2658
3572
  try {
2659
3573
  const request = await micro.json(req);
2660
3574
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2668,7 +3582,7 @@ router$3.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
2668
3582
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2669
3583
  }
2670
3584
  });
2671
- 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) => {
2672
3586
  try {
2673
3587
  const request = await micro.json(req);
2674
3588
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2682,7 +3596,7 @@ router$3.post("/api/v1/markdown_view/live_data", async (req, res) => {
2682
3596
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2683
3597
  }
2684
3598
  });
2685
- 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) => {
2686
3600
  try {
2687
3601
  const request = await micro.json(req);
2688
3602
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2696,7 +3610,7 @@ router$3.post("/api/v1/markdown_view/live_report", async (req, res) => {
2696
3610
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2697
3611
  }
2698
3612
  });
2699
- 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) => {
2700
3614
  try {
2701
3615
  const request = await micro.json(req);
2702
3616
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2710,7 +3624,7 @@ router$3.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
2710
3624
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2711
3625
  }
2712
3626
  });
2713
- 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) => {
2714
3628
  try {
2715
3629
  const request = await micro.json(req);
2716
3630
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2724,7 +3638,7 @@ router$3.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
2724
3638
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2725
3639
  }
2726
3640
  });
2727
- 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) => {
2728
3642
  try {
2729
3643
  const request = await micro.json(req);
2730
3644
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2738,7 +3652,7 @@ router$3.post("/api/v1/markdown_view/risk_data", async (req, res) => {
2738
3652
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2739
3653
  }
2740
3654
  });
2741
- 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) => {
2742
3656
  try {
2743
3657
  const request = await micro.json(req);
2744
3658
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2752,7 +3666,7 @@ router$3.post("/api/v1/markdown_view/risk_report", async (req, res) => {
2752
3666
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2753
3667
  }
2754
3668
  });
2755
- 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) => {
2756
3670
  try {
2757
3671
  const request = await micro.json(req);
2758
3672
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2766,7 +3680,7 @@ router$3.post("/api/v1/markdown_view/partial_data", async (req, res) => {
2766
3680
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2767
3681
  }
2768
3682
  });
2769
- 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) => {
2770
3684
  try {
2771
3685
  const request = await micro.json(req);
2772
3686
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2780,7 +3694,7 @@ router$3.post("/api/v1/markdown_view/partial_report", async (req, res) => {
2780
3694
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2781
3695
  }
2782
3696
  });
2783
- 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) => {
2784
3698
  try {
2785
3699
  const request = await micro.json(req);
2786
3700
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2794,7 +3708,7 @@ router$3.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
2794
3708
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2795
3709
  }
2796
3710
  });
2797
- 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) => {
2798
3712
  try {
2799
3713
  const request = await micro.json(req);
2800
3714
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2808,7 +3722,7 @@ router$3.post("/api/v1/markdown_view/highest_profit_report", async (req, res) =>
2808
3722
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2809
3723
  }
2810
3724
  });
2811
- 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) => {
2812
3726
  try {
2813
3727
  const request = await micro.json(req);
2814
3728
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2822,7 +3736,7 @@ router$3.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
2822
3736
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2823
3737
  }
2824
3738
  });
2825
- 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) => {
2826
3740
  try {
2827
3741
  const request = await micro.json(req);
2828
3742
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2836,7 +3750,7 @@ router$3.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
2836
3750
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2837
3751
  }
2838
3752
  });
2839
- 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) => {
2840
3754
  try {
2841
3755
  const request = await micro.json(req);
2842
3756
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2850,7 +3764,7 @@ router$3.post("/api/v1/markdown_view/performance_data", async (req, res) => {
2850
3764
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2851
3765
  }
2852
3766
  });
2853
- 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) => {
2854
3768
  try {
2855
3769
  const request = await micro.json(req);
2856
3770
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2864,7 +3778,7 @@ router$3.post("/api/v1/markdown_view/performance_report", async (req, res) => {
2864
3778
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2865
3779
  }
2866
3780
  });
2867
- 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) => {
2868
3782
  try {
2869
3783
  const request = await micro.json(req);
2870
3784
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2878,7 +3792,7 @@ router$3.post("/api/v1/markdown_view/sync_data", async (req, res) => {
2878
3792
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2879
3793
  }
2880
3794
  });
2881
- 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) => {
2882
3796
  try {
2883
3797
  const request = await micro.json(req);
2884
3798
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2892,7 +3806,7 @@ router$3.post("/api/v1/markdown_view/sync_report", async (req, res) => {
2892
3806
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2893
3807
  }
2894
3808
  });
2895
- 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) => {
2896
3810
  try {
2897
3811
  const request = await micro.json(req);
2898
3812
  const { requestId, serviceName, strategyName, exchangeName, frameName, backtest } = request;
@@ -2906,7 +3820,7 @@ router$3.post("/api/v1/markdown_view/heat_data", async (req, res) => {
2906
3820
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2907
3821
  }
2908
3822
  });
2909
- 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) => {
2910
3824
  try {
2911
3825
  const request = await micro.json(req);
2912
3826
  const { requestId, serviceName, strategyName, exchangeName, frameName, backtest } = request;
@@ -2920,7 +3834,7 @@ router$3.post("/api/v1/markdown_view/heat_report", async (req, res) => {
2920
3834
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2921
3835
  }
2922
3836
  });
2923
- 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) => {
2924
3838
  try {
2925
3839
  const request = await micro.json(req);
2926
3840
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2934,7 +3848,7 @@ router$3.post("/api/v1/markdown_view/walker_data", async (req, res) => {
2934
3848
  return await micro.send(res, 200, { status: "error", error: getErrorMessage(error) });
2935
3849
  }
2936
3850
  });
2937
- 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) => {
2938
3852
  try {
2939
3853
  const request = await micro.json(req);
2940
3854
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2949,6 +3863,70 @@ router$3.post("/api/v1/markdown_view/walker_report", async (req, res) => {
2949
3863
  }
2950
3864
  });
2951
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
+
2952
3930
  const router$2 = Router({
2953
3931
  params: true,
2954
3932
  });
@@ -3020,25 +3998,31 @@ const router = Router({
3020
3998
  params: true,
3021
3999
  });
3022
4000
  router.all("/api/v1/health/*", (req, res) => {
3023
- return router$9(req, res, finalhandler(req, res));
4001
+ return router$b(req, res, finalhandler(req, res));
3024
4002
  });
3025
4003
  router.all("/api/v1/mock/*", (req, res) => {
3026
- return router$8(req, res, finalhandler(req, res));
4004
+ return router$a(req, res, finalhandler(req, res));
3027
4005
  });
3028
4006
  router.all("/api/v1/view/*", (req, res) => {
3029
- return router$7(req, res, finalhandler(req, res));
4007
+ return router$9(req, res, finalhandler(req, res));
3030
4008
  });
3031
4009
  router.all("/api/v1/markdown_mock/*", (req, res) => {
3032
- return router$4(req, res, finalhandler(req, res));
4010
+ return router$6(req, res, finalhandler(req, res));
3033
4011
  });
3034
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) => {
3035
4019
  return router$3(req, res, finalhandler(req, res));
3036
4020
  });
3037
4021
  router.all("/icon/*", (req, res) => {
3038
- return router$6(req, res, finalhandler(req, res));
4022
+ return router$8(req, res, finalhandler(req, res));
3039
4023
  });
3040
4024
  router.all("/api/v1/dict/*", (req, res) => {
3041
- return router$5(req, res, finalhandler(req, res));
4025
+ return router$7(req, res, finalhandler(req, res));
3042
4026
  });
3043
4027
  router.all("/api/v1/global/*", (req, res) => {
3044
4028
  return router$2(req, res, finalhandler(req, res));