@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.cjs CHANGED
@@ -11,6 +11,8 @@ var diKit = require('di-kit');
11
11
  var backtestKit = require('backtest-kit');
12
12
  var fs = require('fs/promises');
13
13
  var path = require('path');
14
+ var mime = require('mime-types');
15
+ var crypto = require('crypto');
14
16
  var module$1 = require('module');
15
17
  var fs$1 = require('fs');
16
18
 
@@ -20,10 +22,10 @@ const CC_WWWROOT_HOST = process.env.CC_WWWROOT_HOST || "0.0.0.0";
20
22
  const CC_WWWROOT_PORT = parseInt(process.env.CC_WWWROOT_PORT) || 60050;
21
23
  const CC_ENABLE_MOCK = !!parseInt(process.env.CC_ENABLE_MOCK) || false;
22
24
 
23
- const router$9 = Router({
25
+ const router$b = Router({
24
26
  params: true,
25
27
  });
26
- router$9.get("/api/v1/health/health_check", async (req, res) => {
28
+ router$b.get("/api/v1/health/health_check", async (req, res) => {
27
29
  const [cpuLoad] = os.loadavg();
28
30
  return await micro.send(res, 200, {
29
31
  uptime: process.uptime(),
@@ -72,6 +74,9 @@ const mockServices$1 = {
72
74
  logMockService: Symbol("logMockService"),
73
75
  statusMockService: Symbol("statusMockService"),
74
76
  markdownMockService: Symbol("markdownMockService"),
77
+ explorerMockService: Symbol("explorerMockService"),
78
+ signalMockService: Symbol("signalMockService"),
79
+ heatMockService: Symbol("heatMockService"),
75
80
  };
76
81
  const viewServices$1 = {
77
82
  notificationViewService: Symbol("notificationViewService"),
@@ -80,6 +85,9 @@ const viewServices$1 = {
80
85
  logViewService: Symbol("logViewService"),
81
86
  statusViewService: Symbol("statusViewService"),
82
87
  markdownViewService: Symbol("markdownViewService"),
88
+ explorerViewService: Symbol("explorerViewService"),
89
+ signalViewService: Symbol("signalViewService"),
90
+ heatViewService: Symbol("heatViewService"),
83
91
  };
84
92
  const TYPES = {
85
93
  ...baseServices$1,
@@ -148,6 +156,14 @@ class ExchangeService {
148
156
  exchangeName: dto.exchangeName,
149
157
  }, undefined, sDate, eDate);
150
158
  };
159
+ this.getLastCandles = async (dto) => {
160
+ this.loggerService.log("exchangeService getLastCandles", {
161
+ dto,
162
+ });
163
+ return await backtestKit.Exchange.getCandles(dto.symbol, dto.interval, dto.limit, {
164
+ exchangeName: dto.exchangeName,
165
+ });
166
+ };
151
167
  }
152
168
  }
153
169
 
@@ -182,9 +198,9 @@ class LoggerService {
182
198
  }
183
199
  }
184
200
 
185
- const MOCK_PATH$3 = "./mock/notifications.json";
201
+ const MOCK_PATH$5 = "./mock/notifications.json";
186
202
  const READ_NOTIFICATION_LIST_FN = functoolsKit.singleshot(async () => {
187
- const data = await fs.readFile(MOCK_PATH$3, "utf-8");
203
+ const data = await fs.readFile(MOCK_PATH$5, "utf-8");
188
204
  return JSON.parse(data);
189
205
  });
190
206
  const DEFAULT_LIMIT$3 = 25;
@@ -244,9 +260,9 @@ class NotificationMockService {
244
260
  }
245
261
  }
246
262
 
247
- const MOCK_PATH$2 = "./mock/db";
263
+ const MOCK_PATH$4 = "./mock/db";
248
264
  const READ_BACKTEST_STORAGE_FN = functoolsKit.singleshot(async () => {
249
- const dbPath = path.join(process.cwd(), MOCK_PATH$2);
265
+ const dbPath = path.join(process.cwd(), MOCK_PATH$4);
250
266
  const files = await fs.readdir(dbPath);
251
267
  const signals = [];
252
268
  for (const file of files) {
@@ -281,7 +297,7 @@ class StorageMockService {
281
297
  }
282
298
  }
283
299
 
284
- const MS_PER_MINUTE$1 = 60000;
300
+ const HISTORY_LAST_CANDLES_LIMIT$1 = 200;
285
301
  class ExchangeMockService {
286
302
  constructor() {
287
303
  this.loggerService = inject(TYPES.loggerService);
@@ -314,22 +330,56 @@ class ExchangeMockService {
314
330
  if (!signal) {
315
331
  throw new Error(`Signal with ID ${signalId} not found`);
316
332
  }
317
- const { pendingAt, scheduledAt, minuteEstimatedTime, } = signal;
333
+ const { pendingAt, scheduledAt, updatedAt } = signal;
318
334
  const eventAt = pendingAt || scheduledAt;
319
335
  return await this.exchangeService.getRangeCandles({
320
336
  symbol: signal.symbol,
321
337
  exchangeName: signal.exchangeName,
322
338
  signalStartTime: eventAt,
323
- signalStopTime: eventAt + minuteEstimatedTime * MS_PER_MINUTE$1,
339
+ signalStopTime: backtestKit.alignToInterval(new Date(updatedAt), interval).getTime(),
340
+ interval,
341
+ });
342
+ };
343
+ this.getLastCandles = async (symbol, interval) => {
344
+ this.loggerService.log("exchangeMockService getLastCandles", {
345
+ symbol,
324
346
  interval,
325
347
  });
348
+ const [backtestItem] = await backtestKit.Backtest.list();
349
+ const [liveItem] = await backtestKit.Live.list();
350
+ const [exchangeItem] = await backtestKit.listExchangeSchema();
351
+ if (backtestItem) {
352
+ return await this.exchangeService.getLastCandles({
353
+ symbol,
354
+ limit: HISTORY_LAST_CANDLES_LIMIT$1,
355
+ exchangeName: backtestItem.exchangeName,
356
+ interval,
357
+ });
358
+ }
359
+ if (liveItem) {
360
+ return await this.exchangeService.getLastCandles({
361
+ symbol,
362
+ limit: HISTORY_LAST_CANDLES_LIMIT$1,
363
+ exchangeName: liveItem.exchangeName,
364
+ interval,
365
+ });
366
+ }
367
+ if (exchangeItem) {
368
+ return await this.exchangeService.getLastCandles({
369
+ symbol,
370
+ limit: HISTORY_LAST_CANDLES_LIMIT$1,
371
+ exchangeName: exchangeItem.exchangeName,
372
+ interval,
373
+ });
374
+ }
375
+ throw new Error(`exchangeMockService getLastCandles no pending strategy symbol=${symbol} interval=${interval}`);
326
376
  };
327
377
  }
328
378
  }
329
379
 
330
- const MOCK_PATH$1 = "./mock/logs.json";
380
+ const MOCK_PATH$3 = "./mock/logs.json";
331
381
  const READ_LOG_LIST_FN = functoolsKit.singleshot(async () => {
332
- const data = await fs.readFile(MOCK_PATH$1, "utf-8");
382
+ const data = await fs.readFile(MOCK_PATH$3, "utf-8");
333
383
  return JSON.parse(data);
334
384
  });
335
385
  const DEFAULT_LIMIT$2 = 25;
@@ -377,14 +427,24 @@ class LogMockService {
377
427
  }
378
428
  }
379
429
 
380
- const MOCK_PATH = "./mock/status.json";
430
+ const MOCK_PATH$2 = "./mock/status.json";
431
+ const MOCK_INFO_PATH = "./mock/status-info.json";
381
432
  const READ_STATUS_LIST_FN = functoolsKit.singleshot(async () => {
382
- const data = await fs.readFile(MOCK_PATH, "utf-8");
433
+ const data = await fs.readFile(MOCK_PATH$2, "utf-8");
434
+ return JSON.parse(data);
435
+ });
436
+ const READ_STATUS_INFO_FN = functoolsKit.singleshot(async () => {
437
+ const data = await fs.readFile(MOCK_INFO_PATH, "utf-8");
383
438
  return JSON.parse(data);
384
439
  });
385
440
  class StatusMockService {
386
441
  constructor() {
387
442
  this.loggerService = inject(TYPES.loggerService);
443
+ this.signalMockService = inject(TYPES.signalMockService);
444
+ this.getStatusInfo = async () => {
445
+ this.loggerService.log("statusMockService getStatusInfo");
446
+ return await READ_STATUS_INFO_FN();
447
+ };
388
448
  this.getStatusList = async () => {
389
449
  this.loggerService.log("statusMockService getStatusList");
390
450
  const list = await READ_STATUS_LIST_FN();
@@ -404,33 +464,36 @@ class StatusMockService {
404
464
  this.getStatusOne = async (id) => {
405
465
  this.loggerService.log("statusMockService getStatusOne", { id });
406
466
  const list = await READ_STATUS_LIST_FN();
407
- const signal = list.find((s) => s.id === id);
408
- if (!signal) {
467
+ const status = list.find((s) => s.id === id);
468
+ if (!status) {
409
469
  return null;
410
470
  }
411
- const positionEntries = signal._entry ?? [];
471
+ const updatedAt = await this.signalMockService.getLastUpdateTimestamp(status.signalId);
472
+ const positionEntries = status._entry ?? [];
412
473
  const positionLevels = positionEntries.map((e) => e.price);
413
- const positionPartials = signal._partial ?? [];
474
+ const positionPartials = status._partial ?? [];
414
475
  return {
415
- signalId: signal.signalId,
416
- position: signal.position,
417
- symbol: signal.symbol,
418
- exchangeName: signal.exchangeName,
419
- strategyName: signal.strategyName,
420
- totalEntries: signal.totalEntries,
421
- totalPartials: signal.totalPartials,
422
- originalPriceStopLoss: signal.originalPriceStopLoss,
423
- originalPriceTakeProfit: signal.originalPriceTakeProfit,
424
- originalPriceOpen: signal.originalPriceOpen,
425
- priceOpen: signal.priceOpen,
426
- priceTakeProfit: signal.priceTakeProfit,
427
- priceStopLoss: signal.priceStopLoss,
428
- pnlPercentage: signal.pnl.pnlPercentage,
429
- pnlCost: signal.pnl.pnlCost,
430
- pnlEntries: signal.pnl.pnlEntries,
431
- partialExecuted: signal.partialExecuted,
432
- minuteEstimatedTime: signal.minuteEstimatedTime,
433
- pendingAt: signal.pendingAt,
476
+ signalId: status.signalId,
477
+ position: status.position,
478
+ symbol: status.symbol,
479
+ exchangeName: status.exchangeName,
480
+ strategyName: status.strategyName,
481
+ totalEntries: status.totalEntries,
482
+ totalPartials: status.totalPartials,
483
+ originalPriceStopLoss: status.originalPriceStopLoss,
484
+ originalPriceTakeProfit: status.originalPriceTakeProfit,
485
+ originalPriceOpen: status.originalPriceOpen,
486
+ priceOpen: status.priceOpen,
487
+ priceTakeProfit: status.priceTakeProfit,
488
+ priceStopLoss: status.priceStopLoss,
489
+ pnlPercentage: status.pnl.pnlPercentage,
490
+ pnlCost: status.pnl.pnlCost,
491
+ pnlEntries: status.pnl.pnlEntries,
492
+ partialExecuted: status.partialExecuted,
493
+ minuteEstimatedTime: status.minuteEstimatedTime,
494
+ pendingAt: status.pendingAt,
495
+ timestamp: status.timestamp,
496
+ updatedAt,
434
497
  positionLevels,
435
498
  positionEntries,
436
499
  positionPartials,
@@ -443,6 +506,7 @@ const MOCK_DIR = "./mock/markdown";
443
506
  const makeReader = (fileName) => functoolsKit.singleshot(() => fs.readFile(path.join(MOCK_DIR, fileName), "utf-8"));
444
507
  const makeDataReader = (fileName) => functoolsKit.singleshot(async () => JSON.parse(await fs.readFile(path.join(MOCK_DIR, "data", fileName), "utf-8")));
445
508
  const readBacktest = makeReader("backtest.md");
509
+ const readStrategy = makeReader("strategy.md");
446
510
  const readLive = makeReader("live.md");
447
511
  const readBreakeven = makeReader("breakeven.md");
448
512
  const readRisk = makeReader("risk.md");
@@ -454,6 +518,7 @@ const readSync = makeReader("sync.md");
454
518
  const readHeat = makeReader("heat.md");
455
519
  const readWalker = makeReader("walker.md");
456
520
  const readBacktestData = makeDataReader("backtest.json");
521
+ const readStrategyData = makeDataReader("strategy.json");
457
522
  const readLiveData = makeDataReader("live.json");
458
523
  const readBreakevenData = makeDataReader("breakeven.json");
459
524
  const readRiskData = makeDataReader("risk.json");
@@ -467,6 +532,15 @@ const readWalkerData = makeDataReader("walker.json");
467
532
  class MarkdownMockService {
468
533
  constructor() {
469
534
  this.loggerService = inject(TYPES.loggerService);
535
+ // Strategy
536
+ this.getStrategyData = async (symbol, strategyName, exchangeName, frameName) => {
537
+ this.loggerService.log("markdownMockService getStrategyData", { symbol, strategyName, exchangeName, frameName });
538
+ return readStrategyData();
539
+ };
540
+ this.getStrategyReport = async (symbol, strategyName, exchangeName, frameName) => {
541
+ this.loggerService.log("markdownMockService getStrategyReport", { symbol, strategyName, exchangeName, frameName });
542
+ return readStrategy();
543
+ };
470
544
  // Backtest
471
545
  this.getBacktestData = async (symbol, strategyName, exchangeName, frameName) => {
472
546
  this.loggerService.log("markdownMockService getBacktestData", { symbol, strategyName, exchangeName, frameName });
@@ -569,6 +643,127 @@ class MarkdownMockService {
569
643
  }
570
644
  }
571
645
 
646
+ const deepFlat = (arr) => {
647
+ const result = [];
648
+ const seen = new Set();
649
+ const process = (entries = []) => entries.forEach((entry) => {
650
+ if (seen.has(entry)) {
651
+ return;
652
+ }
653
+ seen.add(entry);
654
+ if (entry.type === "directory") {
655
+ process(entry.nodes);
656
+ }
657
+ result.push(entry);
658
+ });
659
+ process(arr);
660
+ return result;
661
+ };
662
+ const MOCK_PATH$1 = "./mock/explorer.json";
663
+ const READ_EXPLORER_TREE_FN = functoolsKit.singleshot(async () => {
664
+ const data = await fs.readFile(MOCK_PATH$1, "utf-8");
665
+ return JSON.parse(data);
666
+ });
667
+ const READ_EXPLORER_INDEX_FN = functoolsKit.singleshot(async () => {
668
+ const tree = await READ_EXPLORER_TREE_FN();
669
+ const treeList = deepFlat(tree);
670
+ if (treeList.length === 0) {
671
+ return {};
672
+ }
673
+ return treeList.reduce((acm, cur) => {
674
+ if (cur.type === "file" && "content" in cur) {
675
+ return { ...acm, [cur.path]: cur };
676
+ }
677
+ return acm;
678
+ }, {});
679
+ });
680
+ class ExplorerMockService {
681
+ constructor() {
682
+ this.loggerService = inject(TYPES.loggerService);
683
+ this.getNode = async (nodePath) => {
684
+ this.loggerService.log("explorerMockService getNode", {
685
+ nodePath,
686
+ });
687
+ const index = await READ_EXPLORER_INDEX_FN();
688
+ return index[nodePath]?.content ?? "";
689
+ };
690
+ this.getTree = async () => {
691
+ this.loggerService.log("explorerMockService getTree");
692
+ return await READ_EXPLORER_TREE_FN();
693
+ };
694
+ }
695
+ }
696
+
697
+ const MOCK_PATH = "./mock/db";
698
+ const MOCK_SIGNAL_PATH = "./mock/signal.json";
699
+ const READ_SIGNAL_STORAGE_FN = functoolsKit.singleshot(async () => {
700
+ const dbPath = path.join(process.cwd(), MOCK_PATH);
701
+ const files = await fs.readdir(dbPath);
702
+ const signals = [];
703
+ for (const file of files) {
704
+ if (!file.endsWith(".json")) {
705
+ continue;
706
+ }
707
+ const filePath = path.join(dbPath, file);
708
+ signals.push(JSON.parse(await fs.readFile(filePath, "utf-8")));
709
+ }
710
+ return signals;
711
+ });
712
+ const READ_PENDING_SIGNAL_FN = functoolsKit.singleshot(async () => {
713
+ const filePath = path.join(process.cwd(), MOCK_SIGNAL_PATH);
714
+ return JSON.parse(await fs.readFile(filePath, "utf-8"));
715
+ });
716
+ class SignalMockService {
717
+ constructor() {
718
+ this.loggerService = inject(TYPES.loggerService);
719
+ this.getLastUpdateTimestamp = async (signalId) => {
720
+ this.loggerService.log("signalMockService getLastUpdateTimestamp", {
721
+ signalId,
722
+ });
723
+ const signalList = await READ_SIGNAL_STORAGE_FN();
724
+ const signalMap = new Map(signalList.map((signal) => [signal.id, signal]));
725
+ const signal = signalMap.get(signalId);
726
+ if (!signal) {
727
+ throw new Error(`SignalMockService getLastUpdateTimestamp signal not found signalId=${signalId}`);
728
+ }
729
+ return signal.updatedAt;
730
+ };
731
+ this.getPendingSignal = async (symbol) => {
732
+ this.loggerService.log("signalMockService getPendingSignal", {
733
+ symbol,
734
+ });
735
+ const signal = await READ_PENDING_SIGNAL_FN();
736
+ if (signal.symbol !== symbol) {
737
+ return null;
738
+ }
739
+ return signal;
740
+ };
741
+ }
742
+ }
743
+
744
+ const MOCK_DATA_PATH = "./mock/heat.json";
745
+ const MOCK_REPORT_PATH = "./mock/heat-report.md";
746
+ const READ_HEAT_DATA_FN = functoolsKit.singleshot(async () => {
747
+ const data = await fs.readFile(MOCK_DATA_PATH, "utf-8");
748
+ return JSON.parse(data);
749
+ });
750
+ const READ_HEAT_REPORT_FN = functoolsKit.singleshot(async () => {
751
+ return await fs.readFile(MOCK_REPORT_PATH, "utf-8");
752
+ });
753
+ class HeatMockService {
754
+ constructor() {
755
+ this.loggerService = inject(TYPES.loggerService);
756
+ this.getStrategyHeatData = async () => {
757
+ this.loggerService.log("heatMockService getStrategyHeatData");
758
+ return await READ_HEAT_DATA_FN();
759
+ };
760
+ this.getStrategyHeatReport = async () => {
761
+ this.loggerService.log("heatMockService getStrategyHeatReport");
762
+ return await READ_HEAT_REPORT_FN();
763
+ };
764
+ }
765
+ }
766
+
572
767
  const DEFAULT_LIMIT$1 = 25;
573
768
  const DEFAULT_OFFSET$1 = 0;
574
769
  const CREATE_FILTER_LIST_FN$1 = (filterData) => Object.keys(filterData).map((key) => (row) => new RegExp(filterData[key], "i").test(row[key]));
@@ -713,13 +908,14 @@ class StorageViewService {
713
908
  }
714
909
  }
715
910
 
716
- const MS_PER_MINUTE = 60000;
911
+ const HISTORY_LAST_CANDLES_LIMIT = 200;
717
912
  class ExchangeViewService {
718
913
  constructor() {
719
914
  this.loggerService = inject(TYPES.loggerService);
720
915
  this.storageViewService = inject(TYPES.storageViewService);
721
916
  this.exchangeService = inject(TYPES.exchangeService);
722
917
  this.exchangeMockService = inject(TYPES.exchangeMockService);
918
+ this.signalViewService = inject(TYPES.signalViewService);
723
919
  this.getSignalCandles = async (signalId, interval) => {
724
920
  this.loggerService.log("exchangeViewService getCandles", {
725
921
  signalId,
@@ -753,15 +949,53 @@ class ExchangeViewService {
753
949
  if (!signal) {
754
950
  throw new Error(`Signal with ID ${signalId} not found`);
755
951
  }
756
- const { pendingAt, scheduledAt, minuteEstimatedTime, } = signal;
952
+ const { pendingAt, scheduledAt } = signal;
757
953
  const eventAt = pendingAt || scheduledAt;
954
+ const updatedAt = await this.signalViewService.getLastUpdateTimestamp(signalId);
758
955
  return await this.exchangeService.getRangeCandles({
759
956
  symbol: signal.symbol,
760
957
  exchangeName: signal.exchangeName,
761
958
  signalStartTime: eventAt,
762
- signalStopTime: eventAt + minuteEstimatedTime * MS_PER_MINUTE,
959
+ signalStopTime: backtestKit.alignToInterval(new Date(updatedAt), interval).getTime(),
960
+ interval,
961
+ });
962
+ };
963
+ this.getLastCandles = async (symbol, interval) => {
964
+ this.loggerService.log("exchangeViewService getLastCandles", {
965
+ symbol,
763
966
  interval,
764
967
  });
968
+ if (CC_ENABLE_MOCK) {
969
+ return await this.exchangeMockService.getLastCandles(symbol, interval);
970
+ }
971
+ const [backtestItem] = await backtestKit.Backtest.list();
972
+ const [liveItem] = await backtestKit.Live.list();
973
+ const [exchangeItem] = await backtestKit.listExchangeSchema();
974
+ if (backtestItem) {
975
+ return await this.exchangeService.getLastCandles({
976
+ symbol,
977
+ limit: HISTORY_LAST_CANDLES_LIMIT,
978
+ exchangeName: backtestItem.exchangeName,
979
+ interval,
980
+ });
981
+ }
982
+ if (liveItem) {
983
+ return await this.exchangeService.getLastCandles({
984
+ symbol,
985
+ limit: HISTORY_LAST_CANDLES_LIMIT,
986
+ exchangeName: liveItem.exchangeName,
987
+ interval,
988
+ });
989
+ }
990
+ if (exchangeItem) {
991
+ return await this.exchangeService.getLastCandles({
992
+ symbol,
993
+ limit: HISTORY_LAST_CANDLES_LIMIT,
994
+ exchangeName: exchangeItem.exchangeName,
995
+ interval,
996
+ });
997
+ }
998
+ throw new Error(`exchangeViewService getLastCandles no pending strategy symbol=${symbol} interval=${interval}`);
765
999
  };
766
1000
  }
767
1001
  }
@@ -825,6 +1059,7 @@ class StatusViewService {
825
1059
  constructor() {
826
1060
  this.loggerService = inject(TYPES.loggerService);
827
1061
  this.statusMockService = inject(TYPES.statusMockService);
1062
+ this.signalViewService = inject(TYPES.signalViewService);
828
1063
  this.getStatusList = async () => {
829
1064
  this.loggerService.log("statusViewService getStatusList");
830
1065
  if (CC_ENABLE_MOCK) {
@@ -887,6 +1122,12 @@ class StatusViewService {
887
1122
  if (!positionPartials) {
888
1123
  return null;
889
1124
  }
1125
+ const timestamp = await backtestKit.lib.timeMetaService.getTimestamp(pendingSignal.symbol, {
1126
+ strategyName: pendingSignal.strategyName,
1127
+ exchangeName: pendingSignal.exchangeName,
1128
+ frameName: pendingSignal.frameName,
1129
+ }, false);
1130
+ const updatedAt = await this.signalViewService.getLastUpdateTimestamp(pendingSignal.id);
890
1131
  return {
891
1132
  signalId: pendingSignal.id,
892
1133
  position: pendingSignal.position,
@@ -907,11 +1148,80 @@ class StatusViewService {
907
1148
  partialExecuted: pendingSignal.partialExecuted,
908
1149
  pendingAt: pendingSignal.pendingAt,
909
1150
  minuteEstimatedTime: pendingSignal.minuteEstimatedTime,
1151
+ timestamp,
1152
+ updatedAt,
910
1153
  positionEntries,
911
1154
  positionLevels,
912
1155
  positionPartials,
913
1156
  };
914
1157
  };
1158
+ this.getStatusInfo = async () => {
1159
+ this.loggerService.log("statusViewService getStatusInfo");
1160
+ if (CC_ENABLE_MOCK) {
1161
+ return this.statusMockService.getStatusInfo();
1162
+ }
1163
+ {
1164
+ const [backtestTarget = null] = await backtestKit.Backtest.list();
1165
+ if (backtestTarget) {
1166
+ const currentHeat = await backtestKit.Heat.getData({
1167
+ strategyName: backtestTarget.strategyName,
1168
+ exchangeName: backtestTarget.exchangeName,
1169
+ frameName: backtestTarget.frameName,
1170
+ });
1171
+ return {
1172
+ context: {
1173
+ strategyName: backtestTarget.strategyName,
1174
+ exchangeName: backtestTarget.exchangeName,
1175
+ frameName: backtestTarget.frameName,
1176
+ },
1177
+ portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1178
+ portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1179
+ portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1180
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1181
+ symbol,
1182
+ totalPnl,
1183
+ winRate,
1184
+ profitFactor,
1185
+ maxDrawdown,
1186
+ expectancy,
1187
+ totalTrades,
1188
+ })),
1189
+ backtest: true,
1190
+ };
1191
+ }
1192
+ }
1193
+ {
1194
+ const [liveTarget = null] = await backtestKit.Live.list();
1195
+ if (liveTarget) {
1196
+ const currentHeat = await backtestKit.Heat.getData({
1197
+ strategyName: liveTarget.strategyName,
1198
+ exchangeName: liveTarget.exchangeName,
1199
+ frameName: "",
1200
+ });
1201
+ return {
1202
+ context: {
1203
+ strategyName: liveTarget.strategyName,
1204
+ exchangeName: liveTarget.exchangeName,
1205
+ frameName: "",
1206
+ },
1207
+ portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1208
+ portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1209
+ portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1210
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1211
+ symbol,
1212
+ totalPnl,
1213
+ winRate,
1214
+ profitFactor,
1215
+ maxDrawdown,
1216
+ expectancy,
1217
+ totalTrades,
1218
+ })),
1219
+ backtest: false,
1220
+ };
1221
+ }
1222
+ }
1223
+ return null;
1224
+ };
915
1225
  }
916
1226
  }
917
1227
 
@@ -919,6 +1229,21 @@ class MarkdownViewService {
919
1229
  constructor() {
920
1230
  this.loggerService = inject(TYPES.loggerService);
921
1231
  this.markdownMockService = inject(TYPES.markdownMockService);
1232
+ // Strategy
1233
+ this.getStrategyData = async (symbol, strategyName, exchangeName, frameName, backtest = false) => {
1234
+ this.loggerService.log("markdownViewService getStrategyData", { symbol, strategyName, exchangeName, frameName, backtest });
1235
+ if (CC_ENABLE_MOCK) {
1236
+ return await this.markdownMockService.getStrategyData(symbol, strategyName, exchangeName, frameName);
1237
+ }
1238
+ return await backtestKit.Strategy.getData(symbol, { strategyName, exchangeName, frameName }, backtest);
1239
+ };
1240
+ this.getStrategyReport = async (symbol, strategyName, exchangeName, frameName, backtest = false) => {
1241
+ this.loggerService.log("markdownViewService getStrategyReport", { symbol, strategyName, exchangeName, frameName, backtest });
1242
+ if (CC_ENABLE_MOCK) {
1243
+ return await this.markdownMockService.getStrategyReport(symbol, strategyName, exchangeName, frameName);
1244
+ }
1245
+ return await backtestKit.Strategy.getReport(symbol, { strategyName, exchangeName, frameName }, backtest);
1246
+ };
922
1247
  // Backtest
923
1248
  this.getBacktestData = async (symbol, strategyName, exchangeName, frameName) => {
924
1249
  this.loggerService.log("markdownViewService getBacktestData", { symbol, strategyName, exchangeName, frameName });
@@ -1087,6 +1412,185 @@ class MarkdownViewService {
1087
1412
  }
1088
1413
  }
1089
1414
 
1415
+ const pathId = (p) => crypto.createHash("sha1").update(p).digest("hex").slice(0, 16);
1416
+ const buildTree = async (dir, visited) => {
1417
+ const realDir = await fs.realpath(dir);
1418
+ if (visited.has(realDir)) {
1419
+ return [];
1420
+ }
1421
+ visited.add(realDir);
1422
+ const entries = await fs.readdir(dir, { withFileTypes: true });
1423
+ const nodes = [];
1424
+ for (const entry of entries) {
1425
+ const childPath = path.join(dir, entry.name);
1426
+ const childRelPath = path.relative(process.cwd(), childPath).replace(/\\/g, "/");
1427
+ if (entry.isDirectory()) {
1428
+ nodes.push({
1429
+ id: pathId(childRelPath),
1430
+ path: childRelPath,
1431
+ label: entry.name,
1432
+ type: "directory",
1433
+ nodes: await buildTree(childPath, visited),
1434
+ });
1435
+ }
1436
+ else {
1437
+ nodes.push({
1438
+ id: pathId(childRelPath),
1439
+ path: childRelPath,
1440
+ label: entry.name,
1441
+ type: "file",
1442
+ mimeType: mime.lookup(entry.name) || "application/octet-stream",
1443
+ });
1444
+ }
1445
+ }
1446
+ return nodes;
1447
+ };
1448
+ class ExplorerViewService {
1449
+ constructor() {
1450
+ this.loggerService = inject(TYPES.loggerService);
1451
+ this.explorerMockService = inject(TYPES.explorerMockService);
1452
+ this.getDir = functoolsKit.singleshot(async () => {
1453
+ this.loggerService.log("explorerViewService getDir");
1454
+ const dir = path.join(process.cwd(), "dump");
1455
+ await fs.mkdir(dir, { recursive: true });
1456
+ return dir;
1457
+ });
1458
+ this.getNode = async (nodePath) => {
1459
+ this.loggerService.log("explorerViewService getNode", {
1460
+ nodePath,
1461
+ });
1462
+ if (CC_ENABLE_MOCK) {
1463
+ return await this.explorerMockService.getNode(nodePath);
1464
+ }
1465
+ const dir = await this.getDir();
1466
+ const absPath = path.resolve(process.cwd(), nodePath);
1467
+ if (!absPath.startsWith(dir + path.sep) && !absPath.startsWith(dir + "/") && absPath !== dir) {
1468
+ throw new Error(`Path is outside of dump dir: ${nodePath}`);
1469
+ }
1470
+ return await fs.readFile(absPath, "utf-8");
1471
+ };
1472
+ this.getTree = async () => {
1473
+ this.loggerService.log("explorerViewService getTree");
1474
+ if (CC_ENABLE_MOCK) {
1475
+ return await this.explorerMockService.getTree();
1476
+ }
1477
+ const dir = await this.getDir();
1478
+ const root = path.relative(process.cwd(), dir).replace(/\\/g, "/");
1479
+ const rootNode = {
1480
+ id: pathId(root),
1481
+ path: root,
1482
+ label: path.basename(root),
1483
+ type: "directory",
1484
+ nodes: await buildTree(dir, new Set([path.join(dir, "data")])),
1485
+ };
1486
+ return [rootNode];
1487
+ };
1488
+ }
1489
+ }
1490
+
1491
+ class SignalViewService {
1492
+ constructor() {
1493
+ this.loggerService = inject(TYPES.loggerService);
1494
+ this.signalMockService = inject(TYPES.signalMockService);
1495
+ this.getLastUpdateTimestamp = async (signalId) => {
1496
+ this.loggerService.log("signalViewService getLastUpdateTimestamp", {
1497
+ signalId,
1498
+ });
1499
+ if (CC_ENABLE_MOCK) {
1500
+ return await this.signalMockService.getLastUpdateTimestamp(signalId);
1501
+ }
1502
+ {
1503
+ const liveSignal = await backtestKit.StorageLive.findById(signalId);
1504
+ if (liveSignal) {
1505
+ return liveSignal.updatedAt;
1506
+ }
1507
+ }
1508
+ {
1509
+ const backtestSignal = await backtestKit.StorageBacktest.findById(signalId);
1510
+ if (backtestSignal) {
1511
+ return backtestSignal.updatedAt;
1512
+ }
1513
+ }
1514
+ throw new Error(`SignalViewService getLastUpdateTimestamp signal not found signalId=${signalId}`);
1515
+ };
1516
+ this.getPendingSignal = async (symbol) => {
1517
+ this.loggerService.log("signalViewService getPendingSignal", {
1518
+ symbol,
1519
+ });
1520
+ if (CC_ENABLE_MOCK) {
1521
+ return await this.signalMockService.getPendingSignal(symbol);
1522
+ }
1523
+ {
1524
+ const liveList = await backtestKit.Live.list();
1525
+ const liveTarget = liveList.find((live) => live.symbol === symbol);
1526
+ if (liveTarget) {
1527
+ const currentPrice = await backtestKit.Exchange.getAveragePrice(symbol, {
1528
+ exchangeName: liveTarget.exchangeName,
1529
+ });
1530
+ return await backtestKit.Live.getPendingSignal(symbol, currentPrice, {
1531
+ strategyName: liveTarget.strategyName,
1532
+ exchangeName: liveTarget.exchangeName,
1533
+ });
1534
+ }
1535
+ }
1536
+ return null;
1537
+ };
1538
+ }
1539
+ }
1540
+
1541
+ class HeatViewService {
1542
+ constructor() {
1543
+ this.loggerService = inject(TYPES.loggerService);
1544
+ this.heatMockService = inject(TYPES.heatMockService);
1545
+ this.getStrategyHeatData = async () => {
1546
+ this.loggerService.log("heatViewService getStrategyHeatData");
1547
+ if (CC_ENABLE_MOCK) {
1548
+ return await this.heatMockService.getStrategyHeatData();
1549
+ }
1550
+ const [backtestItem] = await backtestKit.Backtest.list();
1551
+ const [liveItem] = await backtestKit.Live.list();
1552
+ if (backtestItem) {
1553
+ return await backtestKit.Heat.getData({
1554
+ strategyName: backtestItem.strategyName,
1555
+ exchangeName: backtestItem.exchangeName,
1556
+ frameName: backtestItem.frameName,
1557
+ });
1558
+ }
1559
+ if (liveItem) {
1560
+ return await backtestKit.Heat.getData({
1561
+ strategyName: liveItem.strategyName,
1562
+ exchangeName: liveItem.exchangeName,
1563
+ frameName: "",
1564
+ });
1565
+ }
1566
+ return null;
1567
+ };
1568
+ this.getStrategyHeatReport = async () => {
1569
+ this.loggerService.log("heatViewService getStrategyHeatReport");
1570
+ if (CC_ENABLE_MOCK) {
1571
+ return await this.heatMockService.getStrategyHeatReport();
1572
+ }
1573
+ const [backtestItem] = await backtestKit.Backtest.list();
1574
+ const [liveItem] = await backtestKit.Live.list();
1575
+ if (backtestItem) {
1576
+ return await backtestKit.Heat.getReport({
1577
+ strategyName: backtestItem.strategyName,
1578
+ exchangeName: backtestItem.exchangeName,
1579
+ frameName: backtestItem.frameName,
1580
+ });
1581
+ }
1582
+ if (liveItem) {
1583
+ return await backtestKit.Heat.getReport({
1584
+ strategyName: liveItem.strategyName,
1585
+ exchangeName: liveItem.exchangeName,
1586
+ frameName: "",
1587
+ });
1588
+ }
1589
+ return null;
1590
+ };
1591
+ }
1592
+ }
1593
+
1090
1594
  const symbol_list = [
1091
1595
  {
1092
1596
  icon: "/icon/btc.png",
@@ -1283,6 +1787,9 @@ class LiveMetaService {
1283
1787
  provide(TYPES.logMockService, () => new LogMockService());
1284
1788
  provide(TYPES.statusMockService, () => new StatusMockService());
1285
1789
  provide(TYPES.markdownMockService, () => new MarkdownMockService());
1790
+ provide(TYPES.explorerMockService, () => new ExplorerMockService());
1791
+ provide(TYPES.signalMockService, () => new SignalMockService());
1792
+ provide(TYPES.heatMockService, () => new HeatMockService());
1286
1793
  }
1287
1794
  {
1288
1795
  provide(TYPES.notificationViewService, () => new NotificationViewService());
@@ -1291,6 +1798,9 @@ class LiveMetaService {
1291
1798
  provide(TYPES.logViewService, () => new LogViewService());
1292
1799
  provide(TYPES.statusViewService, () => new StatusViewService());
1293
1800
  provide(TYPES.markdownViewService, () => new MarkdownViewService());
1801
+ provide(TYPES.explorerViewService, () => new ExplorerViewService());
1802
+ provide(TYPES.signalViewService, () => new SignalViewService());
1803
+ provide(TYPES.heatViewService, () => new HeatViewService());
1294
1804
  }
1295
1805
 
1296
1806
  const baseServices = {
@@ -1313,6 +1823,9 @@ const mockServices = {
1313
1823
  logMockService: inject(TYPES.logMockService),
1314
1824
  statusMockService: inject(TYPES.statusMockService),
1315
1825
  markdownMockService: inject(TYPES.markdownMockService),
1826
+ explorerMockService: inject(TYPES.explorerMockService),
1827
+ signalMockService: inject(TYPES.signalMockService),
1828
+ heatMockService: inject(TYPES.heatMockService),
1316
1829
  };
1317
1830
  const viewServices = {
1318
1831
  notificationViewService: inject(TYPES.notificationViewService),
@@ -1321,6 +1834,9 @@ const viewServices = {
1321
1834
  logViewService: inject(TYPES.logViewService),
1322
1835
  statusViewService: inject(TYPES.statusViewService),
1323
1836
  markdownViewService: inject(TYPES.markdownViewService),
1837
+ explorerViewService: inject(TYPES.explorerViewService),
1838
+ signalViewService: inject(TYPES.signalViewService),
1839
+ heatViewService: inject(TYPES.heatViewService),
1324
1840
  };
1325
1841
  const ioc = {
1326
1842
  ...baseServices,
@@ -1331,11 +1847,11 @@ const ioc = {
1331
1847
  };
1332
1848
  init();
1333
1849
 
1334
- const router$8 = Router({
1850
+ const router$a = Router({
1335
1851
  params: true,
1336
1852
  });
1337
1853
  // ExchangeMockService endpoints
1338
- router$8.post("/api/v1/mock/candles_signal", async (req, res) => {
1854
+ router$a.post("/api/v1/mock/candles_signal", async (req, res) => {
1339
1855
  try {
1340
1856
  const request = await micro.json(req);
1341
1857
  const { signalId, interval, requestId, serviceName } = request;
@@ -1363,7 +1879,7 @@ router$8.post("/api/v1/mock/candles_signal", async (req, res) => {
1363
1879
  });
1364
1880
  }
1365
1881
  });
1366
- router$8.post("/api/v1/mock/candles_point", async (req, res) => {
1882
+ router$a.post("/api/v1/mock/candles_point", async (req, res) => {
1367
1883
  try {
1368
1884
  const request = await micro.json(req);
1369
1885
  const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
@@ -1397,7 +1913,7 @@ router$8.post("/api/v1/mock/candles_point", async (req, res) => {
1397
1913
  }
1398
1914
  });
1399
1915
  // NotificationMockService endpoints
1400
- router$8.post("/api/v1/mock/notification_list", async (req, res) => {
1916
+ router$a.post("/api/v1/mock/notification_list", async (req, res) => {
1401
1917
  try {
1402
1918
  const request = await micro.json(req);
1403
1919
  const { requestId, serviceName } = request;
@@ -1425,7 +1941,7 @@ router$8.post("/api/v1/mock/notification_list", async (req, res) => {
1425
1941
  });
1426
1942
  }
1427
1943
  });
1428
- router$8.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1944
+ router$a.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1429
1945
  try {
1430
1946
  const request = await micro.json(req);
1431
1947
  const { requestId, serviceName } = request;
@@ -1454,7 +1970,7 @@ router$8.post("/api/v1/mock/notification_one/:id", async (req, res) => {
1454
1970
  });
1455
1971
  }
1456
1972
  });
1457
- router$8.post("/api/v1/mock/notification_filter", async (req, res) => {
1973
+ router$a.post("/api/v1/mock/notification_filter", async (req, res) => {
1458
1974
  try {
1459
1975
  const request = await micro.json(req);
1460
1976
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1483,7 +1999,7 @@ router$8.post("/api/v1/mock/notification_filter", async (req, res) => {
1483
1999
  }
1484
2000
  });
1485
2001
  // StorageMockService endpoints
1486
- router$8.post("/api/v1/mock/storage_one/:id", async (req, res) => {
2002
+ router$a.post("/api/v1/mock/storage_one/:id", async (req, res) => {
1487
2003
  try {
1488
2004
  const request = await micro.json(req);
1489
2005
  const { requestId, serviceName } = request;
@@ -1512,7 +2028,7 @@ router$8.post("/api/v1/mock/storage_one/:id", async (req, res) => {
1512
2028
  });
1513
2029
  }
1514
2030
  });
1515
- router$8.post("/api/v1/mock/storage_list/live", async (req, res) => {
2031
+ router$a.post("/api/v1/mock/storage_list/live", async (req, res) => {
1516
2032
  try {
1517
2033
  const request = await micro.json(req);
1518
2034
  const { requestId, serviceName } = request;
@@ -1540,7 +2056,7 @@ router$8.post("/api/v1/mock/storage_list/live", async (req, res) => {
1540
2056
  });
1541
2057
  }
1542
2058
  });
1543
- router$8.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
2059
+ router$a.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
1544
2060
  try {
1545
2061
  const request = await micro.json(req);
1546
2062
  const { requestId, serviceName } = request;
@@ -1569,7 +2085,7 @@ router$8.post("/api/v1/mock/storage_list/backtest", async (req, res) => {
1569
2085
  }
1570
2086
  });
1571
2087
  // LogMockService endpoints
1572
- router$8.post("/api/v1/mock/log_list", async (req, res) => {
2088
+ router$a.post("/api/v1/mock/log_list", async (req, res) => {
1573
2089
  try {
1574
2090
  const request = await micro.json(req);
1575
2091
  const { requestId, serviceName } = request;
@@ -1597,7 +2113,7 @@ router$8.post("/api/v1/mock/log_list", async (req, res) => {
1597
2113
  });
1598
2114
  }
1599
2115
  });
1600
- router$8.post("/api/v1/mock/log_one/:id", async (req, res) => {
2116
+ router$a.post("/api/v1/mock/log_one/:id", async (req, res) => {
1601
2117
  try {
1602
2118
  const request = await micro.json(req);
1603
2119
  const { requestId, serviceName } = request;
@@ -1626,7 +2142,7 @@ router$8.post("/api/v1/mock/log_one/:id", async (req, res) => {
1626
2142
  });
1627
2143
  }
1628
2144
  });
1629
- router$8.post("/api/v1/mock/log_filter", async (req, res) => {
2145
+ router$a.post("/api/v1/mock/log_filter", async (req, res) => {
1630
2146
  try {
1631
2147
  const request = await micro.json(req);
1632
2148
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -1654,7 +2170,7 @@ router$8.post("/api/v1/mock/log_filter", async (req, res) => {
1654
2170
  });
1655
2171
  }
1656
2172
  });
1657
- router$8.post("/api/v1/mock/candles_live", async (req, res) => {
2173
+ router$a.post("/api/v1/mock/candles_live", async (req, res) => {
1658
2174
  try {
1659
2175
  const request = await micro.json(req);
1660
2176
  const { signalId, interval, requestId, serviceName } = request;
@@ -1682,12 +2198,11 @@ router$8.post("/api/v1/mock/candles_live", async (req, res) => {
1682
2198
  });
1683
2199
  }
1684
2200
  });
1685
- // StatusMockService endpoints
1686
- router$8.post("/api/v1/mock/status_list", async (req, res) => {
2201
+ router$a.post("/api/v1/mock/candles_last", async (req, res) => {
1687
2202
  try {
1688
2203
  const request = await micro.json(req);
1689
- const { requestId, serviceName } = request;
1690
- const data = await ioc.statusMockService.getStatusList();
2204
+ const { symbol, interval, requestId, serviceName } = request;
2205
+ const data = await ioc.exchangeMockService.getLastCandles(symbol, interval);
1691
2206
  const result = {
1692
2207
  data,
1693
2208
  status: "ok",
@@ -1695,14 +2210,14 @@ router$8.post("/api/v1/mock/status_list", async (req, res) => {
1695
2210
  requestId,
1696
2211
  serviceName,
1697
2212
  };
1698
- ioc.loggerService.log("/api/v1/mock/status_list ok", {
2213
+ ioc.loggerService.log("/api/v1/mock/candles_last ok", {
1699
2214
  request,
1700
2215
  result: omit(result, "data"),
1701
2216
  });
1702
2217
  return await micro.send(res, 200, result);
1703
2218
  }
1704
2219
  catch (error) {
1705
- ioc.loggerService.log("/api/v1/mock/status_list error", {
2220
+ ioc.loggerService.log("/api/v1/mock/candles_last error", {
1706
2221
  error: functoolsKit.errorData(error),
1707
2222
  });
1708
2223
  return await micro.send(res, 200, {
@@ -1711,12 +2226,13 @@ router$8.post("/api/v1/mock/status_list", async (req, res) => {
1711
2226
  });
1712
2227
  }
1713
2228
  });
1714
- router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
2229
+ // SignalMockService endpoints
2230
+ router$a.post("/api/v1/mock/signal_last_update/:id", async (req, res) => {
1715
2231
  try {
1716
2232
  const request = await micro.json(req);
1717
2233
  const { requestId, serviceName } = request;
1718
- const id = req.params.id;
1719
- const data = await ioc.statusMockService.getStatusOne(id);
2234
+ const signalId = req.params.id;
2235
+ const data = await ioc.signalMockService.getLastUpdateTimestamp(signalId);
1720
2236
  const result = {
1721
2237
  data,
1722
2238
  status: "ok",
@@ -1724,14 +2240,14 @@ router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
1724
2240
  requestId,
1725
2241
  serviceName,
1726
2242
  };
1727
- ioc.loggerService.log("/api/v1/mock/status_one/:id ok", {
2243
+ ioc.loggerService.log("/api/v1/mock/signal_last_update/:id ok", {
1728
2244
  request,
1729
2245
  result: omit(result, "data"),
1730
2246
  });
1731
2247
  return await micro.send(res, 200, result);
1732
2248
  }
1733
2249
  catch (error) {
1734
- ioc.loggerService.log("/api/v1/mock/status_one/:id error", {
2250
+ ioc.loggerService.log("/api/v1/mock/signal_last_update/:id error", {
1735
2251
  error: functoolsKit.errorData(error),
1736
2252
  });
1737
2253
  return await micro.send(res, 200, {
@@ -1740,16 +2256,11 @@ router$8.post("/api/v1/mock/status_one/:id", async (req, res) => {
1740
2256
  });
1741
2257
  }
1742
2258
  });
1743
-
1744
- const router$7 = Router({
1745
- params: true,
1746
- });
1747
- // ExchangeViewService endpoints
1748
- router$7.post("/api/v1/view/candles_signal", async (req, res) => {
2259
+ router$a.post("/api/v1/mock/signal_pending", async (req, res) => {
1749
2260
  try {
1750
2261
  const request = await micro.json(req);
1751
- const { signalId, interval, requestId, serviceName } = request;
1752
- const data = await ioc.exchangeViewService.getSignalCandles(signalId, interval);
2262
+ const { symbol, requestId, serviceName } = request;
2263
+ const data = await ioc.signalMockService.getPendingSignal(symbol);
1753
2264
  const result = {
1754
2265
  data,
1755
2266
  status: "ok",
@@ -1757,14 +2268,14 @@ router$7.post("/api/v1/view/candles_signal", async (req, res) => {
1757
2268
  requestId,
1758
2269
  serviceName,
1759
2270
  };
1760
- ioc.loggerService.log("/api/v1/view/candles_signal ok", {
2271
+ ioc.loggerService.log("/api/v1/mock/signal_pending ok", {
1761
2272
  request,
1762
2273
  result: omit(result, "data"),
1763
2274
  });
1764
2275
  return await micro.send(res, 200, result);
1765
2276
  }
1766
2277
  catch (error) {
1767
- ioc.loggerService.log("/api/v1/view/candles_signal error", {
2278
+ ioc.loggerService.log("/api/v1/mock/signal_pending error", {
1768
2279
  error: functoolsKit.errorData(error),
1769
2280
  });
1770
2281
  return await micro.send(res, 200, {
@@ -1773,16 +2284,12 @@ router$7.post("/api/v1/view/candles_signal", async (req, res) => {
1773
2284
  });
1774
2285
  }
1775
2286
  });
1776
- router$7.post("/api/v1/view/candles_point", async (req, res) => {
2287
+ // StatusMockService endpoints
2288
+ router$a.post("/api/v1/mock/status_list", async (req, res) => {
1777
2289
  try {
1778
2290
  const request = await micro.json(req);
1779
- const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
1780
- const data = await ioc.exchangeService.getPointCandles({
1781
- currentTime,
1782
- interval,
1783
- symbol,
1784
- exchangeName,
1785
- });
2291
+ const { requestId, serviceName } = request;
2292
+ const data = await ioc.statusMockService.getStatusList();
1786
2293
  const result = {
1787
2294
  data,
1788
2295
  status: "ok",
@@ -1790,14 +2297,14 @@ router$7.post("/api/v1/view/candles_point", async (req, res) => {
1790
2297
  requestId,
1791
2298
  serviceName,
1792
2299
  };
1793
- ioc.loggerService.log("/api/v1/view/candles_point ok", {
2300
+ ioc.loggerService.log("/api/v1/mock/status_list ok", {
1794
2301
  request,
1795
2302
  result: omit(result, "data"),
1796
2303
  });
1797
2304
  return await micro.send(res, 200, result);
1798
2305
  }
1799
2306
  catch (error) {
1800
- ioc.loggerService.log("/api/v1/view/candles_point error", {
2307
+ ioc.loggerService.log("/api/v1/mock/status_list error", {
1801
2308
  error: functoolsKit.errorData(error),
1802
2309
  });
1803
2310
  return await micro.send(res, 200, {
@@ -1806,11 +2313,12 @@ router$7.post("/api/v1/view/candles_point", async (req, res) => {
1806
2313
  });
1807
2314
  }
1808
2315
  });
1809
- router$7.post("/api/v1/view/candles_live", async (req, res) => {
2316
+ router$a.post("/api/v1/mock/status_one/:id", async (req, res) => {
1810
2317
  try {
1811
2318
  const request = await micro.json(req);
1812
- const { signalId, interval, requestId, serviceName } = request;
1813
- const data = await ioc.exchangeViewService.getLiveCandles(signalId, interval);
2319
+ const { requestId, serviceName } = request;
2320
+ const id = req.params.id;
2321
+ const data = await ioc.statusMockService.getStatusOne(id);
1814
2322
  const result = {
1815
2323
  data,
1816
2324
  status: "ok",
@@ -1818,14 +2326,14 @@ router$7.post("/api/v1/view/candles_live", async (req, res) => {
1818
2326
  requestId,
1819
2327
  serviceName,
1820
2328
  };
1821
- ioc.loggerService.log("/api/v1/view/candles_live ok", {
2329
+ ioc.loggerService.log("/api/v1/mock/status_one/:id ok", {
1822
2330
  request,
1823
2331
  result: omit(result, "data"),
1824
2332
  });
1825
2333
  return await micro.send(res, 200, result);
1826
2334
  }
1827
2335
  catch (error) {
1828
- ioc.loggerService.log("/api/v1/view/candles_live error", {
2336
+ ioc.loggerService.log("/api/v1/mock/status_one/:id error", {
1829
2337
  error: functoolsKit.errorData(error),
1830
2338
  });
1831
2339
  return await micro.send(res, 200, {
@@ -1834,12 +2342,12 @@ router$7.post("/api/v1/view/candles_live", async (req, res) => {
1834
2342
  });
1835
2343
  }
1836
2344
  });
1837
- // NotificationViewService endpoints
1838
- router$7.post("/api/v1/view/notification_list", async (req, res) => {
2345
+ // HeatMockService endpoints
2346
+ router$a.post("/api/v1/mock/heat_data", async (req, res) => {
1839
2347
  try {
1840
2348
  const request = await micro.json(req);
1841
2349
  const { requestId, serviceName } = request;
1842
- const data = await ioc.notificationViewService.getList();
2350
+ const data = await ioc.heatMockService.getStrategyHeatData();
1843
2351
  const result = {
1844
2352
  data,
1845
2353
  status: "ok",
@@ -1847,14 +2355,14 @@ router$7.post("/api/v1/view/notification_list", async (req, res) => {
1847
2355
  requestId,
1848
2356
  serviceName,
1849
2357
  };
1850
- ioc.loggerService.log("/api/v1/view/notification_list ok", {
2358
+ ioc.loggerService.log("/api/v1/mock/heat_data ok", {
1851
2359
  request,
1852
2360
  result: omit(result, "data"),
1853
2361
  });
1854
2362
  return await micro.send(res, 200, result);
1855
2363
  }
1856
2364
  catch (error) {
1857
- ioc.loggerService.log("/api/v1/view/notification_list error", {
2365
+ ioc.loggerService.log("/api/v1/mock/heat_data error", {
1858
2366
  error: functoolsKit.errorData(error),
1859
2367
  });
1860
2368
  return await micro.send(res, 200, {
@@ -1863,12 +2371,11 @@ router$7.post("/api/v1/view/notification_list", async (req, res) => {
1863
2371
  });
1864
2372
  }
1865
2373
  });
1866
- router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
2374
+ router$a.post("/api/v1/mock/heat_report", async (req, res) => {
1867
2375
  try {
1868
2376
  const request = await micro.json(req);
1869
2377
  const { requestId, serviceName } = request;
1870
- const id = req.params.id;
1871
- const data = await ioc.notificationViewService.getOne(id);
2378
+ const data = await ioc.heatMockService.getStrategyHeatReport();
1872
2379
  const result = {
1873
2380
  data,
1874
2381
  status: "ok",
@@ -1876,14 +2383,14 @@ router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
1876
2383
  requestId,
1877
2384
  serviceName,
1878
2385
  };
1879
- ioc.loggerService.log("/api/v1/view/notification_one/:id ok", {
2386
+ ioc.loggerService.log("/api/v1/mock/heat_report ok", {
1880
2387
  request,
1881
2388
  result: omit(result, "data"),
1882
2389
  });
1883
2390
  return await micro.send(res, 200, result);
1884
2391
  }
1885
2392
  catch (error) {
1886
- ioc.loggerService.log("/api/v1/view/notification_one/:id error", {
2393
+ ioc.loggerService.log("/api/v1/mock/heat_report error", {
1887
2394
  error: functoolsKit.errorData(error),
1888
2395
  });
1889
2396
  return await micro.send(res, 200, {
@@ -1892,11 +2399,11 @@ router$7.post("/api/v1/view/notification_one/:id", async (req, res) => {
1892
2399
  });
1893
2400
  }
1894
2401
  });
1895
- router$7.post("/api/v1/view/notification_filter", async (req, res) => {
2402
+ router$a.post("/api/v1/mock/status_info", async (req, res) => {
1896
2403
  try {
1897
2404
  const request = await micro.json(req);
1898
- const { requestId, serviceName, filterData, limit, offset } = request;
1899
- const data = await ioc.notificationViewService.findByFilter(filterData, limit, offset);
2405
+ const { requestId, serviceName } = request;
2406
+ const data = await ioc.statusMockService.getStatusInfo();
1900
2407
  const result = {
1901
2408
  data,
1902
2409
  status: "ok",
@@ -1904,14 +2411,14 @@ router$7.post("/api/v1/view/notification_filter", async (req, res) => {
1904
2411
  requestId,
1905
2412
  serviceName,
1906
2413
  };
1907
- ioc.loggerService.log("/api/v1/view/notification_filter ok", {
2414
+ ioc.loggerService.log("/api/v1/mock/status_info ok", {
1908
2415
  request,
1909
2416
  result: omit(result, "data"),
1910
2417
  });
1911
2418
  return await micro.send(res, 200, result);
1912
2419
  }
1913
2420
  catch (error) {
1914
- ioc.loggerService.log("/api/v1/view/notification_filter error", {
2421
+ ioc.loggerService.log("/api/v1/mock/status_info error", {
1915
2422
  error: functoolsKit.errorData(error),
1916
2423
  });
1917
2424
  return await micro.send(res, 200, {
@@ -1920,13 +2427,16 @@ router$7.post("/api/v1/view/notification_filter", async (req, res) => {
1920
2427
  });
1921
2428
  }
1922
2429
  });
1923
- // StorageViewService endpoints
1924
- router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
2430
+
2431
+ const router$9 = Router({
2432
+ params: true,
2433
+ });
2434
+ // ExchangeViewService endpoints
2435
+ router$9.post("/api/v1/view/candles_signal", async (req, res) => {
1925
2436
  try {
1926
2437
  const request = await micro.json(req);
1927
- const { requestId, serviceName } = request;
1928
- const signalId = req.params.id;
1929
- const data = await ioc.storageViewService.findSignalById(signalId);
2438
+ const { signalId, interval, requestId, serviceName } = request;
2439
+ const data = await ioc.exchangeViewService.getSignalCandles(signalId, interval);
1930
2440
  const result = {
1931
2441
  data,
1932
2442
  status: "ok",
@@ -1934,14 +2444,14 @@ router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
1934
2444
  requestId,
1935
2445
  serviceName,
1936
2446
  };
1937
- ioc.loggerService.log("/api/v1/view/storage_one/:id ok", {
2447
+ ioc.loggerService.log("/api/v1/view/candles_signal ok", {
1938
2448
  request,
1939
2449
  result: omit(result, "data"),
1940
2450
  });
1941
2451
  return await micro.send(res, 200, result);
1942
2452
  }
1943
2453
  catch (error) {
1944
- ioc.loggerService.log("/api/v1/view/storage_one/:id error", {
2454
+ ioc.loggerService.log("/api/v1/view/candles_signal error", {
1945
2455
  error: functoolsKit.errorData(error),
1946
2456
  });
1947
2457
  return await micro.send(res, 200, {
@@ -1950,11 +2460,16 @@ router$7.post("/api/v1/view/storage_one/:id", async (req, res) => {
1950
2460
  });
1951
2461
  }
1952
2462
  });
1953
- router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
2463
+ router$9.post("/api/v1/view/candles_point", async (req, res) => {
1954
2464
  try {
1955
2465
  const request = await micro.json(req);
1956
- const { requestId, serviceName } = request;
1957
- const data = await ioc.storageViewService.listSignalLive();
2466
+ const { currentTime, interval, requestId, serviceName, symbol, exchangeName } = request;
2467
+ const data = await ioc.exchangeService.getPointCandles({
2468
+ currentTime,
2469
+ interval,
2470
+ symbol,
2471
+ exchangeName,
2472
+ });
1958
2473
  const result = {
1959
2474
  data,
1960
2475
  status: "ok",
@@ -1962,14 +2477,14 @@ router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
1962
2477
  requestId,
1963
2478
  serviceName,
1964
2479
  };
1965
- ioc.loggerService.log("/api/v1/view/storage_list/live ok", {
2480
+ ioc.loggerService.log("/api/v1/view/candles_point ok", {
1966
2481
  request,
1967
2482
  result: omit(result, "data"),
1968
2483
  });
1969
2484
  return await micro.send(res, 200, result);
1970
2485
  }
1971
2486
  catch (error) {
1972
- ioc.loggerService.log("/api/v1/view/storage_list/live error", {
2487
+ ioc.loggerService.log("/api/v1/view/candles_point error", {
1973
2488
  error: functoolsKit.errorData(error),
1974
2489
  });
1975
2490
  return await micro.send(res, 200, {
@@ -1978,11 +2493,11 @@ router$7.post("/api/v1/view/storage_list/live", async (req, res) => {
1978
2493
  });
1979
2494
  }
1980
2495
  });
1981
- router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2496
+ router$9.post("/api/v1/view/candles_live", async (req, res) => {
1982
2497
  try {
1983
2498
  const request = await micro.json(req);
1984
- const { requestId, serviceName } = request;
1985
- const data = await ioc.storageViewService.listSignalBacktest();
2499
+ const { signalId, interval, requestId, serviceName } = request;
2500
+ const data = await ioc.exchangeViewService.getLiveCandles(signalId, interval);
1986
2501
  const result = {
1987
2502
  data,
1988
2503
  status: "ok",
@@ -1990,14 +2505,14 @@ router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
1990
2505
  requestId,
1991
2506
  serviceName,
1992
2507
  };
1993
- ioc.loggerService.log("/api/v1/view/storage_list/backtest ok", {
2508
+ ioc.loggerService.log("/api/v1/view/candles_live ok", {
1994
2509
  request,
1995
2510
  result: omit(result, "data"),
1996
2511
  });
1997
2512
  return await micro.send(res, 200, result);
1998
2513
  }
1999
2514
  catch (error) {
2000
- ioc.loggerService.log("/api/v1/view/storage_list/backtest error", {
2515
+ ioc.loggerService.log("/api/v1/view/candles_live error", {
2001
2516
  error: functoolsKit.errorData(error),
2002
2517
  });
2003
2518
  return await micro.send(res, 200, {
@@ -2006,11 +2521,211 @@ router$7.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2006
2521
  });
2007
2522
  }
2008
2523
  });
2009
- // LogViewService endpoints
2010
- router$7.post("/api/v1/view/log_list", async (req, res) => {
2524
+ router$9.post("/api/v1/view/candles_last", async (req, res) => {
2011
2525
  try {
2012
2526
  const request = await micro.json(req);
2013
- const { requestId, serviceName } = request;
2527
+ const { symbol, interval, requestId, serviceName } = request;
2528
+ const data = await ioc.exchangeViewService.getLastCandles(symbol, interval);
2529
+ const result = {
2530
+ data,
2531
+ status: "ok",
2532
+ error: "",
2533
+ requestId,
2534
+ serviceName,
2535
+ };
2536
+ ioc.loggerService.log("/api/v1/view/candles_last ok", {
2537
+ request,
2538
+ result: omit(result, "data"),
2539
+ });
2540
+ return await micro.send(res, 200, result);
2541
+ }
2542
+ catch (error) {
2543
+ ioc.loggerService.log("/api/v1/view/candles_last error", {
2544
+ error: functoolsKit.errorData(error),
2545
+ });
2546
+ return await micro.send(res, 200, {
2547
+ status: "error",
2548
+ error: functoolsKit.getErrorMessage(error),
2549
+ });
2550
+ }
2551
+ });
2552
+ // NotificationViewService endpoints
2553
+ router$9.post("/api/v1/view/notification_list", async (req, res) => {
2554
+ try {
2555
+ const request = await micro.json(req);
2556
+ const { requestId, serviceName } = request;
2557
+ const data = await ioc.notificationViewService.getList();
2558
+ const result = {
2559
+ data,
2560
+ status: "ok",
2561
+ error: "",
2562
+ requestId,
2563
+ serviceName,
2564
+ };
2565
+ ioc.loggerService.log("/api/v1/view/notification_list ok", {
2566
+ request,
2567
+ result: omit(result, "data"),
2568
+ });
2569
+ return await micro.send(res, 200, result);
2570
+ }
2571
+ catch (error) {
2572
+ ioc.loggerService.log("/api/v1/view/notification_list error", {
2573
+ error: functoolsKit.errorData(error),
2574
+ });
2575
+ return await micro.send(res, 200, {
2576
+ status: "error",
2577
+ error: functoolsKit.getErrorMessage(error),
2578
+ });
2579
+ }
2580
+ });
2581
+ router$9.post("/api/v1/view/notification_one/:id", async (req, res) => {
2582
+ try {
2583
+ const request = await micro.json(req);
2584
+ const { requestId, serviceName } = request;
2585
+ const id = req.params.id;
2586
+ const data = await ioc.notificationViewService.getOne(id);
2587
+ const result = {
2588
+ data,
2589
+ status: "ok",
2590
+ error: "",
2591
+ requestId,
2592
+ serviceName,
2593
+ };
2594
+ ioc.loggerService.log("/api/v1/view/notification_one/:id ok", {
2595
+ request,
2596
+ result: omit(result, "data"),
2597
+ });
2598
+ return await micro.send(res, 200, result);
2599
+ }
2600
+ catch (error) {
2601
+ ioc.loggerService.log("/api/v1/view/notification_one/:id error", {
2602
+ error: functoolsKit.errorData(error),
2603
+ });
2604
+ return await micro.send(res, 200, {
2605
+ status: "error",
2606
+ error: functoolsKit.getErrorMessage(error),
2607
+ });
2608
+ }
2609
+ });
2610
+ router$9.post("/api/v1/view/notification_filter", async (req, res) => {
2611
+ try {
2612
+ const request = await micro.json(req);
2613
+ const { requestId, serviceName, filterData, limit, offset } = request;
2614
+ const data = await ioc.notificationViewService.findByFilter(filterData, limit, offset);
2615
+ const result = {
2616
+ data,
2617
+ status: "ok",
2618
+ error: "",
2619
+ requestId,
2620
+ serviceName,
2621
+ };
2622
+ ioc.loggerService.log("/api/v1/view/notification_filter ok", {
2623
+ request,
2624
+ result: omit(result, "data"),
2625
+ });
2626
+ return await micro.send(res, 200, result);
2627
+ }
2628
+ catch (error) {
2629
+ ioc.loggerService.log("/api/v1/view/notification_filter error", {
2630
+ error: functoolsKit.errorData(error),
2631
+ });
2632
+ return await micro.send(res, 200, {
2633
+ status: "error",
2634
+ error: functoolsKit.getErrorMessage(error),
2635
+ });
2636
+ }
2637
+ });
2638
+ // StorageViewService endpoints
2639
+ router$9.post("/api/v1/view/storage_one/:id", async (req, res) => {
2640
+ try {
2641
+ const request = await micro.json(req);
2642
+ const { requestId, serviceName } = request;
2643
+ const signalId = req.params.id;
2644
+ const data = await ioc.storageViewService.findSignalById(signalId);
2645
+ const result = {
2646
+ data,
2647
+ status: "ok",
2648
+ error: "",
2649
+ requestId,
2650
+ serviceName,
2651
+ };
2652
+ ioc.loggerService.log("/api/v1/view/storage_one/:id ok", {
2653
+ request,
2654
+ result: omit(result, "data"),
2655
+ });
2656
+ return await micro.send(res, 200, result);
2657
+ }
2658
+ catch (error) {
2659
+ ioc.loggerService.log("/api/v1/view/storage_one/:id error", {
2660
+ error: functoolsKit.errorData(error),
2661
+ });
2662
+ return await micro.send(res, 200, {
2663
+ status: "error",
2664
+ error: functoolsKit.getErrorMessage(error),
2665
+ });
2666
+ }
2667
+ });
2668
+ router$9.post("/api/v1/view/storage_list/live", async (req, res) => {
2669
+ try {
2670
+ const request = await micro.json(req);
2671
+ const { requestId, serviceName } = request;
2672
+ const data = await ioc.storageViewService.listSignalLive();
2673
+ const result = {
2674
+ data,
2675
+ status: "ok",
2676
+ error: "",
2677
+ requestId,
2678
+ serviceName,
2679
+ };
2680
+ ioc.loggerService.log("/api/v1/view/storage_list/live ok", {
2681
+ request,
2682
+ result: omit(result, "data"),
2683
+ });
2684
+ return await micro.send(res, 200, result);
2685
+ }
2686
+ catch (error) {
2687
+ ioc.loggerService.log("/api/v1/view/storage_list/live error", {
2688
+ error: functoolsKit.errorData(error),
2689
+ });
2690
+ return await micro.send(res, 200, {
2691
+ status: "error",
2692
+ error: functoolsKit.getErrorMessage(error),
2693
+ });
2694
+ }
2695
+ });
2696
+ router$9.post("/api/v1/view/storage_list/backtest", async (req, res) => {
2697
+ try {
2698
+ const request = await micro.json(req);
2699
+ const { requestId, serviceName } = request;
2700
+ const data = await ioc.storageViewService.listSignalBacktest();
2701
+ const result = {
2702
+ data,
2703
+ status: "ok",
2704
+ error: "",
2705
+ requestId,
2706
+ serviceName,
2707
+ };
2708
+ ioc.loggerService.log("/api/v1/view/storage_list/backtest ok", {
2709
+ request,
2710
+ result: omit(result, "data"),
2711
+ });
2712
+ return await micro.send(res, 200, result);
2713
+ }
2714
+ catch (error) {
2715
+ ioc.loggerService.log("/api/v1/view/storage_list/backtest error", {
2716
+ error: functoolsKit.errorData(error),
2717
+ });
2718
+ return await micro.send(res, 200, {
2719
+ status: "error",
2720
+ error: functoolsKit.getErrorMessage(error),
2721
+ });
2722
+ }
2723
+ });
2724
+ // LogViewService endpoints
2725
+ router$9.post("/api/v1/view/log_list", async (req, res) => {
2726
+ try {
2727
+ const request = await micro.json(req);
2728
+ const { requestId, serviceName } = request;
2014
2729
  const data = await ioc.logViewService.getList();
2015
2730
  const result = {
2016
2731
  data,
@@ -2035,7 +2750,7 @@ router$7.post("/api/v1/view/log_list", async (req, res) => {
2035
2750
  });
2036
2751
  }
2037
2752
  });
2038
- router$7.post("/api/v1/view/log_one/:id", async (req, res) => {
2753
+ router$9.post("/api/v1/view/log_one/:id", async (req, res) => {
2039
2754
  try {
2040
2755
  const request = await micro.json(req);
2041
2756
  const { requestId, serviceName } = request;
@@ -2064,7 +2779,7 @@ router$7.post("/api/v1/view/log_one/:id", async (req, res) => {
2064
2779
  });
2065
2780
  }
2066
2781
  });
2067
- router$7.post("/api/v1/view/log_filter", async (req, res) => {
2782
+ router$9.post("/api/v1/view/log_filter", async (req, res) => {
2068
2783
  try {
2069
2784
  const request = await micro.json(req);
2070
2785
  const { requestId, serviceName, filterData, limit, offset } = request;
@@ -2092,8 +2807,66 @@ router$7.post("/api/v1/view/log_filter", async (req, res) => {
2092
2807
  });
2093
2808
  }
2094
2809
  });
2810
+ // SignalViewService endpoints
2811
+ router$9.post("/api/v1/view/signal_last_update/:id", async (req, res) => {
2812
+ try {
2813
+ const request = await micro.json(req);
2814
+ const { requestId, serviceName } = request;
2815
+ const signalId = req.params.id;
2816
+ const data = await ioc.signalViewService.getLastUpdateTimestamp(signalId);
2817
+ const result = {
2818
+ data,
2819
+ status: "ok",
2820
+ error: "",
2821
+ requestId,
2822
+ serviceName,
2823
+ };
2824
+ ioc.loggerService.log("/api/v1/view/signal_last_update/:id ok", {
2825
+ request,
2826
+ result: omit(result, "data"),
2827
+ });
2828
+ return await micro.send(res, 200, result);
2829
+ }
2830
+ catch (error) {
2831
+ ioc.loggerService.log("/api/v1/view/signal_last_update/:id error", {
2832
+ error: functoolsKit.errorData(error),
2833
+ });
2834
+ return await micro.send(res, 200, {
2835
+ status: "error",
2836
+ error: functoolsKit.getErrorMessage(error),
2837
+ });
2838
+ }
2839
+ });
2840
+ router$9.post("/api/v1/view/signal_pending", async (req, res) => {
2841
+ try {
2842
+ const request = await micro.json(req);
2843
+ const { symbol, requestId, serviceName } = request;
2844
+ const data = await ioc.signalViewService.getPendingSignal(symbol);
2845
+ const result = {
2846
+ data,
2847
+ status: "ok",
2848
+ error: "",
2849
+ requestId,
2850
+ serviceName,
2851
+ };
2852
+ ioc.loggerService.log("/api/v1/view/signal_pending ok", {
2853
+ request,
2854
+ result: omit(result, "data"),
2855
+ });
2856
+ return await micro.send(res, 200, result);
2857
+ }
2858
+ catch (error) {
2859
+ ioc.loggerService.log("/api/v1/view/signal_pending error", {
2860
+ error: functoolsKit.errorData(error),
2861
+ });
2862
+ return await micro.send(res, 200, {
2863
+ status: "error",
2864
+ error: functoolsKit.getErrorMessage(error),
2865
+ });
2866
+ }
2867
+ });
2095
2868
  // StatusViewService endpoints
2096
- router$7.post("/api/v1/view/status_list", async (req, res) => {
2869
+ router$9.post("/api/v1/view/status_list", async (req, res) => {
2097
2870
  try {
2098
2871
  const request = await micro.json(req);
2099
2872
  const { requestId, serviceName } = request;
@@ -2121,7 +2894,7 @@ router$7.post("/api/v1/view/status_list", async (req, res) => {
2121
2894
  });
2122
2895
  }
2123
2896
  });
2124
- router$7.post("/api/v1/view/status_one/:id", async (req, res) => {
2897
+ router$9.post("/api/v1/view/status_one/:id", async (req, res) => {
2125
2898
  try {
2126
2899
  const request = await micro.json(req);
2127
2900
  const { requestId, serviceName } = request;
@@ -2150,6 +2923,91 @@ router$7.post("/api/v1/view/status_one/:id", async (req, res) => {
2150
2923
  });
2151
2924
  }
2152
2925
  });
2926
+ // HeatViewService endpoints
2927
+ router$9.post("/api/v1/view/heat_data", async (req, res) => {
2928
+ try {
2929
+ const request = await micro.json(req);
2930
+ const { requestId, serviceName } = request;
2931
+ const data = await ioc.heatViewService.getStrategyHeatData();
2932
+ const result = {
2933
+ data,
2934
+ status: "ok",
2935
+ error: "",
2936
+ requestId,
2937
+ serviceName,
2938
+ };
2939
+ ioc.loggerService.log("/api/v1/view/heat_data ok", {
2940
+ request,
2941
+ result: omit(result, "data"),
2942
+ });
2943
+ return await micro.send(res, 200, result);
2944
+ }
2945
+ catch (error) {
2946
+ ioc.loggerService.log("/api/v1/view/heat_data error", {
2947
+ error: functoolsKit.errorData(error),
2948
+ });
2949
+ return await micro.send(res, 200, {
2950
+ status: "error",
2951
+ error: functoolsKit.getErrorMessage(error),
2952
+ });
2953
+ }
2954
+ });
2955
+ router$9.post("/api/v1/view/heat_report", async (req, res) => {
2956
+ try {
2957
+ const request = await micro.json(req);
2958
+ const { requestId, serviceName } = request;
2959
+ const data = await ioc.heatViewService.getStrategyHeatReport();
2960
+ const result = {
2961
+ data,
2962
+ status: "ok",
2963
+ error: "",
2964
+ requestId,
2965
+ serviceName,
2966
+ };
2967
+ ioc.loggerService.log("/api/v1/view/heat_report ok", {
2968
+ request,
2969
+ result: omit(result, "data"),
2970
+ });
2971
+ return await micro.send(res, 200, result);
2972
+ }
2973
+ catch (error) {
2974
+ ioc.loggerService.log("/api/v1/view/heat_report error", {
2975
+ error: functoolsKit.errorData(error),
2976
+ });
2977
+ return await micro.send(res, 200, {
2978
+ status: "error",
2979
+ error: functoolsKit.getErrorMessage(error),
2980
+ });
2981
+ }
2982
+ });
2983
+ router$9.post("/api/v1/view/status_info", async (req, res) => {
2984
+ try {
2985
+ const request = await micro.json(req);
2986
+ const { requestId, serviceName } = request;
2987
+ const data = await ioc.statusViewService.getStatusInfo();
2988
+ const result = {
2989
+ data,
2990
+ status: "ok",
2991
+ error: "",
2992
+ requestId,
2993
+ serviceName,
2994
+ };
2995
+ ioc.loggerService.log("/api/v1/view/status_info ok", {
2996
+ request,
2997
+ result: omit(result, "data"),
2998
+ });
2999
+ return await micro.send(res, 200, result);
3000
+ }
3001
+ catch (error) {
3002
+ ioc.loggerService.log("/api/v1/view/status_info error", {
3003
+ error: functoolsKit.errorData(error),
3004
+ });
3005
+ return await micro.send(res, 200, {
3006
+ status: "error",
3007
+ error: functoolsKit.getErrorMessage(error),
3008
+ });
3009
+ }
3010
+ });
2153
3011
 
2154
3012
  const require$2 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
2155
3013
  function getModulesPath() {
@@ -2158,7 +3016,7 @@ function getModulesPath() {
2158
3016
  return path.join(basePath, "../../../");
2159
3017
  }
2160
3018
 
2161
- const router$6 = Router({
3019
+ const router$8 = Router({
2162
3020
  params: true,
2163
3021
  });
2164
3022
  // getModulesPath
@@ -2175,7 +3033,7 @@ const ASSET_32 = CC_ENABLE_MOCK
2175
3033
  const cache128 = new Map();
2176
3034
  const cache32 = new Map();
2177
3035
  const cacheSvg = new Map();
2178
- router$6.get("/icon/128/:filename", async (req, res) => {
3036
+ router$8.get("/icon/128/:filename", async (req, res) => {
2179
3037
  const filename = req.params.filename;
2180
3038
  // Check cache first
2181
3039
  if (cache128.has(filename)) {
@@ -2191,7 +3049,7 @@ router$6.get("/icon/128/:filename", async (req, res) => {
2191
3049
  }
2192
3050
  return await micro.send(res, 404, "File not found (128)");
2193
3051
  });
2194
- router$6.get("/icon/32/:filename", async (req, res) => {
3052
+ router$8.get("/icon/32/:filename", async (req, res) => {
2195
3053
  const filename = req.params.filename;
2196
3054
  // Check cache first
2197
3055
  if (cache32.has(filename)) {
@@ -2207,7 +3065,7 @@ router$6.get("/icon/32/:filename", async (req, res) => {
2207
3065
  }
2208
3066
  return await micro.send(res, 404, "File not found (32)");
2209
3067
  });
2210
- router$6.get("/icon/svg/:filename", async (req, res) => {
3068
+ router$8.get("/icon/svg/:filename", async (req, res) => {
2211
3069
  const filename = req.params.filename;
2212
3070
  // Check cache first
2213
3071
  if (cacheSvg.has(filename)) {
@@ -2223,7 +3081,7 @@ router$6.get("/icon/svg/:filename", async (req, res) => {
2223
3081
  }
2224
3082
  return await micro.send(res, 404, "File not found (svg)");
2225
3083
  });
2226
- router$6.get("/icon/:filename", async (req, res) => {
3084
+ router$8.get("/icon/:filename", async (req, res) => {
2227
3085
  const filename = req.params.filename;
2228
3086
  // Check cache first
2229
3087
  if (cache32.has(filename)) {
@@ -2240,10 +3098,10 @@ router$6.get("/icon/:filename", async (req, res) => {
2240
3098
  return await micro.send(res, 404, "File not found (root)");
2241
3099
  });
2242
3100
 
2243
- const router$5 = Router({
3101
+ const router$7 = Router({
2244
3102
  params: true,
2245
3103
  });
2246
- router$5.post("/api/v1/dict/symbol/list", async (req, res) => {
3104
+ router$7.post("/api/v1/dict/symbol/list", async (req, res) => {
2247
3105
  try {
2248
3106
  const request = await micro.json(req);
2249
3107
  const { requestId, serviceName } = request;
@@ -2271,7 +3129,7 @@ router$5.post("/api/v1/dict/symbol/list", async (req, res) => {
2271
3129
  });
2272
3130
  }
2273
3131
  });
2274
- router$5.post("/api/v1/dict/symbol/map", async (req, res) => {
3132
+ router$7.post("/api/v1/dict/symbol/map", async (req, res) => {
2275
3133
  try {
2276
3134
  const request = await micro.json(req);
2277
3135
  const { requestId, serviceName } = request;
@@ -2299,7 +3157,7 @@ router$5.post("/api/v1/dict/symbol/map", async (req, res) => {
2299
3157
  });
2300
3158
  }
2301
3159
  });
2302
- router$5.post("/api/v1/dict/symbol/one", async (req, res) => {
3160
+ router$7.post("/api/v1/dict/symbol/one", async (req, res) => {
2303
3161
  try {
2304
3162
  const request = await micro.json(req);
2305
3163
  const { requestId, serviceName, id } = request;
@@ -2328,10 +3186,38 @@ router$5.post("/api/v1/dict/symbol/one", async (req, res) => {
2328
3186
  }
2329
3187
  });
2330
3188
 
2331
- const router$4 = Router({
3189
+ const router$6 = Router({
2332
3190
  params: true,
2333
3191
  });
2334
- router$4.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
3192
+ router$6.post("/api/v1/markdown_mock/strategy_data", async (req, res) => {
3193
+ try {
3194
+ const request = await micro.json(req);
3195
+ const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
3196
+ const data = await ioc.markdownMockService.getStrategyData(symbol, strategyName, exchangeName, frameName);
3197
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3198
+ ioc.loggerService.log("/api/v1/markdown_mock/strategy_data ok", { request, result: omit(result, "data") });
3199
+ return await micro.send(res, 200, result);
3200
+ }
3201
+ catch (error) {
3202
+ ioc.loggerService.log("/api/v1/markdown_mock/strategy_data error", { error: functoolsKit.errorData(error) });
3203
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3204
+ }
3205
+ });
3206
+ router$6.post("/api/v1/markdown_mock/strategy_report", async (req, res) => {
3207
+ try {
3208
+ const request = await micro.json(req);
3209
+ const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
3210
+ const data = await ioc.markdownMockService.getStrategyReport(symbol, strategyName, exchangeName, frameName);
3211
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3212
+ ioc.loggerService.log("/api/v1/markdown_mock/strategy_report ok", { request, result: omit(result, "data") });
3213
+ return await micro.send(res, 200, result);
3214
+ }
3215
+ catch (error) {
3216
+ ioc.loggerService.log("/api/v1/markdown_mock/strategy_report error", { error: functoolsKit.errorData(error) });
3217
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3218
+ }
3219
+ });
3220
+ router$6.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
2335
3221
  try {
2336
3222
  const request = await micro.json(req);
2337
3223
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2345,7 +3231,7 @@ router$4.post("/api/v1/markdown_mock/backtest_data", async (req, res) => {
2345
3231
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2346
3232
  }
2347
3233
  });
2348
- router$4.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
3234
+ router$6.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
2349
3235
  try {
2350
3236
  const request = await micro.json(req);
2351
3237
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2359,7 +3245,7 @@ router$4.post("/api/v1/markdown_mock/backtest_report", async (req, res) => {
2359
3245
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2360
3246
  }
2361
3247
  });
2362
- router$4.post("/api/v1/markdown_mock/live_data", async (req, res) => {
3248
+ router$6.post("/api/v1/markdown_mock/live_data", async (req, res) => {
2363
3249
  try {
2364
3250
  const request = await micro.json(req);
2365
3251
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2373,7 +3259,7 @@ router$4.post("/api/v1/markdown_mock/live_data", async (req, res) => {
2373
3259
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2374
3260
  }
2375
3261
  });
2376
- router$4.post("/api/v1/markdown_mock/live_report", async (req, res) => {
3262
+ router$6.post("/api/v1/markdown_mock/live_report", async (req, res) => {
2377
3263
  try {
2378
3264
  const request = await micro.json(req);
2379
3265
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2387,7 +3273,7 @@ router$4.post("/api/v1/markdown_mock/live_report", async (req, res) => {
2387
3273
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2388
3274
  }
2389
3275
  });
2390
- router$4.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
3276
+ router$6.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
2391
3277
  try {
2392
3278
  const request = await micro.json(req);
2393
3279
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2401,7 +3287,7 @@ router$4.post("/api/v1/markdown_mock/breakeven_data", async (req, res) => {
2401
3287
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2402
3288
  }
2403
3289
  });
2404
- router$4.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
3290
+ router$6.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
2405
3291
  try {
2406
3292
  const request = await micro.json(req);
2407
3293
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2415,7 +3301,7 @@ router$4.post("/api/v1/markdown_mock/breakeven_report", async (req, res) => {
2415
3301
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2416
3302
  }
2417
3303
  });
2418
- router$4.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
3304
+ router$6.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
2419
3305
  try {
2420
3306
  const request = await micro.json(req);
2421
3307
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2429,7 +3315,7 @@ router$4.post("/api/v1/markdown_mock/risk_data", async (req, res) => {
2429
3315
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2430
3316
  }
2431
3317
  });
2432
- router$4.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
3318
+ router$6.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
2433
3319
  try {
2434
3320
  const request = await micro.json(req);
2435
3321
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2443,7 +3329,7 @@ router$4.post("/api/v1/markdown_mock/risk_report", async (req, res) => {
2443
3329
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2444
3330
  }
2445
3331
  });
2446
- router$4.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
3332
+ router$6.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
2447
3333
  try {
2448
3334
  const request = await micro.json(req);
2449
3335
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2457,7 +3343,7 @@ router$4.post("/api/v1/markdown_mock/partial_data", async (req, res) => {
2457
3343
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2458
3344
  }
2459
3345
  });
2460
- router$4.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
3346
+ router$6.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
2461
3347
  try {
2462
3348
  const request = await micro.json(req);
2463
3349
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2471,7 +3357,7 @@ router$4.post("/api/v1/markdown_mock/partial_report", async (req, res) => {
2471
3357
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2472
3358
  }
2473
3359
  });
2474
- router$4.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
3360
+ router$6.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
2475
3361
  try {
2476
3362
  const request = await micro.json(req);
2477
3363
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2485,7 +3371,7 @@ router$4.post("/api/v1/markdown_mock/highest_profit_data", async (req, res) => {
2485
3371
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2486
3372
  }
2487
3373
  });
2488
- router$4.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) => {
3374
+ router$6.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) => {
2489
3375
  try {
2490
3376
  const request = await micro.json(req);
2491
3377
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2499,7 +3385,7 @@ router$4.post("/api/v1/markdown_mock/highest_profit_report", async (req, res) =>
2499
3385
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2500
3386
  }
2501
3387
  });
2502
- router$4.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
3388
+ router$6.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
2503
3389
  try {
2504
3390
  const request = await micro.json(req);
2505
3391
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2513,7 +3399,7 @@ router$4.post("/api/v1/markdown_mock/schedule_data", async (req, res) => {
2513
3399
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2514
3400
  }
2515
3401
  });
2516
- router$4.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
3402
+ router$6.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
2517
3403
  try {
2518
3404
  const request = await micro.json(req);
2519
3405
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2527,7 +3413,7 @@ router$4.post("/api/v1/markdown_mock/schedule_report", async (req, res) => {
2527
3413
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2528
3414
  }
2529
3415
  });
2530
- router$4.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
3416
+ router$6.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
2531
3417
  try {
2532
3418
  const request = await micro.json(req);
2533
3419
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2541,7 +3427,7 @@ router$4.post("/api/v1/markdown_mock/performance_data", async (req, res) => {
2541
3427
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2542
3428
  }
2543
3429
  });
2544
- router$4.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
3430
+ router$6.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
2545
3431
  try {
2546
3432
  const request = await micro.json(req);
2547
3433
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2555,7 +3441,7 @@ router$4.post("/api/v1/markdown_mock/performance_report", async (req, res) => {
2555
3441
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2556
3442
  }
2557
3443
  });
2558
- router$4.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
3444
+ router$6.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
2559
3445
  try {
2560
3446
  const request = await micro.json(req);
2561
3447
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2569,7 +3455,7 @@ router$4.post("/api/v1/markdown_mock/sync_data", async (req, res) => {
2569
3455
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2570
3456
  }
2571
3457
  });
2572
- router$4.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
3458
+ router$6.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
2573
3459
  try {
2574
3460
  const request = await micro.json(req);
2575
3461
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2583,7 +3469,7 @@ router$4.post("/api/v1/markdown_mock/sync_report", async (req, res) => {
2583
3469
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2584
3470
  }
2585
3471
  });
2586
- router$4.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
3472
+ router$6.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
2587
3473
  try {
2588
3474
  const request = await micro.json(req);
2589
3475
  const { requestId, serviceName, strategyName, exchangeName, frameName } = request;
@@ -2597,7 +3483,7 @@ router$4.post("/api/v1/markdown_mock/heat_data", async (req, res) => {
2597
3483
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2598
3484
  }
2599
3485
  });
2600
- router$4.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
3486
+ router$6.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
2601
3487
  try {
2602
3488
  const request = await micro.json(req);
2603
3489
  const { requestId, serviceName, strategyName, exchangeName, frameName } = request;
@@ -2611,7 +3497,7 @@ router$4.post("/api/v1/markdown_mock/heat_report", async (req, res) => {
2611
3497
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2612
3498
  }
2613
3499
  });
2614
- router$4.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
3500
+ router$6.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
2615
3501
  try {
2616
3502
  const request = await micro.json(req);
2617
3503
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2625,7 +3511,7 @@ router$4.post("/api/v1/markdown_mock/walker_data", async (req, res) => {
2625
3511
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2626
3512
  }
2627
3513
  });
2628
- router$4.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
3514
+ router$6.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
2629
3515
  try {
2630
3516
  const request = await micro.json(req);
2631
3517
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2640,10 +3526,38 @@ router$4.post("/api/v1/markdown_mock/walker_report", async (req, res) => {
2640
3526
  }
2641
3527
  });
2642
3528
 
2643
- const router$3 = Router({
3529
+ const router$5 = Router({
2644
3530
  params: true,
2645
3531
  });
2646
- router$3.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
3532
+ router$5.post("/api/v1/markdown_view/strategy_data", async (req, res) => {
3533
+ try {
3534
+ const request = await micro.json(req);
3535
+ const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
3536
+ const data = await ioc.markdownViewService.getStrategyData(symbol, strategyName, exchangeName, frameName, backtest);
3537
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3538
+ ioc.loggerService.log("/api/v1/markdown_view/strategy_data ok", { request, result: omit(result, "data") });
3539
+ return await micro.send(res, 200, result);
3540
+ }
3541
+ catch (error) {
3542
+ ioc.loggerService.log("/api/v1/markdown_view/strategy_data error", { error: functoolsKit.errorData(error) });
3543
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3544
+ }
3545
+ });
3546
+ router$5.post("/api/v1/markdown_view/strategy_report", async (req, res) => {
3547
+ try {
3548
+ const request = await micro.json(req);
3549
+ const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
3550
+ const data = await ioc.markdownViewService.getStrategyReport(symbol, strategyName, exchangeName, frameName, backtest);
3551
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3552
+ ioc.loggerService.log("/api/v1/markdown_view/strategy_report ok", { request, result: omit(result, "data") });
3553
+ return await micro.send(res, 200, result);
3554
+ }
3555
+ catch (error) {
3556
+ ioc.loggerService.log("/api/v1/markdown_view/strategy_report error", { error: functoolsKit.errorData(error) });
3557
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3558
+ }
3559
+ });
3560
+ router$5.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
2647
3561
  try {
2648
3562
  const request = await micro.json(req);
2649
3563
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2657,7 +3571,7 @@ router$3.post("/api/v1/markdown_view/backtest_data", async (req, res) => {
2657
3571
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2658
3572
  }
2659
3573
  });
2660
- router$3.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
3574
+ router$5.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
2661
3575
  try {
2662
3576
  const request = await micro.json(req);
2663
3577
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName } = request;
@@ -2671,7 +3585,7 @@ router$3.post("/api/v1/markdown_view/backtest_report", async (req, res) => {
2671
3585
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2672
3586
  }
2673
3587
  });
2674
- router$3.post("/api/v1/markdown_view/live_data", async (req, res) => {
3588
+ router$5.post("/api/v1/markdown_view/live_data", async (req, res) => {
2675
3589
  try {
2676
3590
  const request = await micro.json(req);
2677
3591
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2685,7 +3599,7 @@ router$3.post("/api/v1/markdown_view/live_data", async (req, res) => {
2685
3599
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2686
3600
  }
2687
3601
  });
2688
- router$3.post("/api/v1/markdown_view/live_report", async (req, res) => {
3602
+ router$5.post("/api/v1/markdown_view/live_report", async (req, res) => {
2689
3603
  try {
2690
3604
  const request = await micro.json(req);
2691
3605
  const { requestId, serviceName, symbol, strategyName, exchangeName } = request;
@@ -2699,7 +3613,7 @@ router$3.post("/api/v1/markdown_view/live_report", async (req, res) => {
2699
3613
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2700
3614
  }
2701
3615
  });
2702
- router$3.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
3616
+ router$5.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
2703
3617
  try {
2704
3618
  const request = await micro.json(req);
2705
3619
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2713,7 +3627,7 @@ router$3.post("/api/v1/markdown_view/breakeven_data", async (req, res) => {
2713
3627
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2714
3628
  }
2715
3629
  });
2716
- router$3.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
3630
+ router$5.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
2717
3631
  try {
2718
3632
  const request = await micro.json(req);
2719
3633
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2727,7 +3641,7 @@ router$3.post("/api/v1/markdown_view/breakeven_report", async (req, res) => {
2727
3641
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2728
3642
  }
2729
3643
  });
2730
- router$3.post("/api/v1/markdown_view/risk_data", async (req, res) => {
3644
+ router$5.post("/api/v1/markdown_view/risk_data", async (req, res) => {
2731
3645
  try {
2732
3646
  const request = await micro.json(req);
2733
3647
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2741,7 +3655,7 @@ router$3.post("/api/v1/markdown_view/risk_data", async (req, res) => {
2741
3655
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2742
3656
  }
2743
3657
  });
2744
- router$3.post("/api/v1/markdown_view/risk_report", async (req, res) => {
3658
+ router$5.post("/api/v1/markdown_view/risk_report", async (req, res) => {
2745
3659
  try {
2746
3660
  const request = await micro.json(req);
2747
3661
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2755,7 +3669,7 @@ router$3.post("/api/v1/markdown_view/risk_report", async (req, res) => {
2755
3669
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2756
3670
  }
2757
3671
  });
2758
- router$3.post("/api/v1/markdown_view/partial_data", async (req, res) => {
3672
+ router$5.post("/api/v1/markdown_view/partial_data", async (req, res) => {
2759
3673
  try {
2760
3674
  const request = await micro.json(req);
2761
3675
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2769,7 +3683,7 @@ router$3.post("/api/v1/markdown_view/partial_data", async (req, res) => {
2769
3683
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2770
3684
  }
2771
3685
  });
2772
- router$3.post("/api/v1/markdown_view/partial_report", async (req, res) => {
3686
+ router$5.post("/api/v1/markdown_view/partial_report", async (req, res) => {
2773
3687
  try {
2774
3688
  const request = await micro.json(req);
2775
3689
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2783,7 +3697,7 @@ router$3.post("/api/v1/markdown_view/partial_report", async (req, res) => {
2783
3697
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2784
3698
  }
2785
3699
  });
2786
- router$3.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
3700
+ router$5.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
2787
3701
  try {
2788
3702
  const request = await micro.json(req);
2789
3703
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2797,7 +3711,7 @@ router$3.post("/api/v1/markdown_view/highest_profit_data", async (req, res) => {
2797
3711
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2798
3712
  }
2799
3713
  });
2800
- router$3.post("/api/v1/markdown_view/highest_profit_report", async (req, res) => {
3714
+ router$5.post("/api/v1/markdown_view/highest_profit_report", async (req, res) => {
2801
3715
  try {
2802
3716
  const request = await micro.json(req);
2803
3717
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2811,7 +3725,7 @@ router$3.post("/api/v1/markdown_view/highest_profit_report", async (req, res) =>
2811
3725
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2812
3726
  }
2813
3727
  });
2814
- router$3.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
3728
+ router$5.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
2815
3729
  try {
2816
3730
  const request = await micro.json(req);
2817
3731
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2825,7 +3739,7 @@ router$3.post("/api/v1/markdown_view/schedule_data", async (req, res) => {
2825
3739
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2826
3740
  }
2827
3741
  });
2828
- router$3.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
3742
+ router$5.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
2829
3743
  try {
2830
3744
  const request = await micro.json(req);
2831
3745
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2839,7 +3753,7 @@ router$3.post("/api/v1/markdown_view/schedule_report", async (req, res) => {
2839
3753
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2840
3754
  }
2841
3755
  });
2842
- router$3.post("/api/v1/markdown_view/performance_data", async (req, res) => {
3756
+ router$5.post("/api/v1/markdown_view/performance_data", async (req, res) => {
2843
3757
  try {
2844
3758
  const request = await micro.json(req);
2845
3759
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2853,7 +3767,7 @@ router$3.post("/api/v1/markdown_view/performance_data", async (req, res) => {
2853
3767
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2854
3768
  }
2855
3769
  });
2856
- router$3.post("/api/v1/markdown_view/performance_report", async (req, res) => {
3770
+ router$5.post("/api/v1/markdown_view/performance_report", async (req, res) => {
2857
3771
  try {
2858
3772
  const request = await micro.json(req);
2859
3773
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2867,7 +3781,7 @@ router$3.post("/api/v1/markdown_view/performance_report", async (req, res) => {
2867
3781
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2868
3782
  }
2869
3783
  });
2870
- router$3.post("/api/v1/markdown_view/sync_data", async (req, res) => {
3784
+ router$5.post("/api/v1/markdown_view/sync_data", async (req, res) => {
2871
3785
  try {
2872
3786
  const request = await micro.json(req);
2873
3787
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2881,7 +3795,7 @@ router$3.post("/api/v1/markdown_view/sync_data", async (req, res) => {
2881
3795
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2882
3796
  }
2883
3797
  });
2884
- router$3.post("/api/v1/markdown_view/sync_report", async (req, res) => {
3798
+ router$5.post("/api/v1/markdown_view/sync_report", async (req, res) => {
2885
3799
  try {
2886
3800
  const request = await micro.json(req);
2887
3801
  const { requestId, serviceName, symbol, strategyName, exchangeName, frameName, backtest } = request;
@@ -2895,7 +3809,7 @@ router$3.post("/api/v1/markdown_view/sync_report", async (req, res) => {
2895
3809
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2896
3810
  }
2897
3811
  });
2898
- router$3.post("/api/v1/markdown_view/heat_data", async (req, res) => {
3812
+ router$5.post("/api/v1/markdown_view/heat_data", async (req, res) => {
2899
3813
  try {
2900
3814
  const request = await micro.json(req);
2901
3815
  const { requestId, serviceName, strategyName, exchangeName, frameName, backtest } = request;
@@ -2909,7 +3823,7 @@ router$3.post("/api/v1/markdown_view/heat_data", async (req, res) => {
2909
3823
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2910
3824
  }
2911
3825
  });
2912
- router$3.post("/api/v1/markdown_view/heat_report", async (req, res) => {
3826
+ router$5.post("/api/v1/markdown_view/heat_report", async (req, res) => {
2913
3827
  try {
2914
3828
  const request = await micro.json(req);
2915
3829
  const { requestId, serviceName, strategyName, exchangeName, frameName, backtest } = request;
@@ -2923,7 +3837,7 @@ router$3.post("/api/v1/markdown_view/heat_report", async (req, res) => {
2923
3837
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2924
3838
  }
2925
3839
  });
2926
- router$3.post("/api/v1/markdown_view/walker_data", async (req, res) => {
3840
+ router$5.post("/api/v1/markdown_view/walker_data", async (req, res) => {
2927
3841
  try {
2928
3842
  const request = await micro.json(req);
2929
3843
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2937,7 +3851,7 @@ router$3.post("/api/v1/markdown_view/walker_data", async (req, res) => {
2937
3851
  return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
2938
3852
  }
2939
3853
  });
2940
- router$3.post("/api/v1/markdown_view/walker_report", async (req, res) => {
3854
+ router$5.post("/api/v1/markdown_view/walker_report", async (req, res) => {
2941
3855
  try {
2942
3856
  const request = await micro.json(req);
2943
3857
  const { requestId, serviceName, symbol, walkerName } = request;
@@ -2952,6 +3866,70 @@ router$3.post("/api/v1/markdown_view/walker_report", async (req, res) => {
2952
3866
  }
2953
3867
  });
2954
3868
 
3869
+ const router$4 = Router({
3870
+ params: true,
3871
+ });
3872
+ router$4.post("/api/v1/explorer_mock/tree", async (req, res) => {
3873
+ try {
3874
+ const request = await micro.json(req);
3875
+ const { requestId, serviceName } = request;
3876
+ const data = await ioc.explorerMockService.getTree();
3877
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3878
+ ioc.loggerService.log("/api/v1/explorer_mock/tree ok", { request, result: omit(result, "data") });
3879
+ return await micro.send(res, 200, result);
3880
+ }
3881
+ catch (error) {
3882
+ ioc.loggerService.log("/api/v1/explorer_mock/tree error", { error: functoolsKit.errorData(error) });
3883
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3884
+ }
3885
+ });
3886
+ router$4.post("/api/v1/explorer_mock/node", async (req, res) => {
3887
+ try {
3888
+ const request = await micro.json(req);
3889
+ const { requestId, serviceName, path } = request;
3890
+ const data = await ioc.explorerMockService.getNode(path);
3891
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3892
+ ioc.loggerService.log("/api/v1/explorer_mock/node ok", { request, result: omit(result, "data") });
3893
+ return await micro.send(res, 200, result);
3894
+ }
3895
+ catch (error) {
3896
+ ioc.loggerService.log("/api/v1/explorer_mock/node error", { error: functoolsKit.errorData(error) });
3897
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3898
+ }
3899
+ });
3900
+
3901
+ const router$3 = Router({
3902
+ params: true,
3903
+ });
3904
+ router$3.post("/api/v1/explorer_view/tree", async (req, res) => {
3905
+ try {
3906
+ const request = await micro.json(req);
3907
+ const { requestId, serviceName } = request;
3908
+ const data = await ioc.explorerViewService.getTree();
3909
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3910
+ ioc.loggerService.log("/api/v1/explorer_view/tree ok", { request, result: omit(result, "data") });
3911
+ return await micro.send(res, 200, result);
3912
+ }
3913
+ catch (error) {
3914
+ ioc.loggerService.log("/api/v1/explorer_view/tree error", { error: functoolsKit.errorData(error) });
3915
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3916
+ }
3917
+ });
3918
+ router$3.post("/api/v1/explorer_view/node", async (req, res) => {
3919
+ try {
3920
+ const request = await micro.json(req);
3921
+ const { requestId, serviceName, path } = request;
3922
+ const data = await ioc.explorerViewService.getNode(path);
3923
+ const result = { data, status: "ok", error: "", requestId, serviceName };
3924
+ ioc.loggerService.log("/api/v1/explorer_view/node ok", { request, result: omit(result, "data") });
3925
+ return await micro.send(res, 200, result);
3926
+ }
3927
+ catch (error) {
3928
+ ioc.loggerService.log("/api/v1/explorer_view/node error", { error: functoolsKit.errorData(error) });
3929
+ return await micro.send(res, 200, { status: "error", error: functoolsKit.getErrorMessage(error) });
3930
+ }
3931
+ });
3932
+
2955
3933
  const router$2 = Router({
2956
3934
  params: true,
2957
3935
  });
@@ -3023,25 +4001,31 @@ const router = Router({
3023
4001
  params: true,
3024
4002
  });
3025
4003
  router.all("/api/v1/health/*", (req, res) => {
3026
- return router$9(req, res, finalhandler(req, res));
4004
+ return router$b(req, res, finalhandler(req, res));
3027
4005
  });
3028
4006
  router.all("/api/v1/mock/*", (req, res) => {
3029
- return router$8(req, res, finalhandler(req, res));
4007
+ return router$a(req, res, finalhandler(req, res));
3030
4008
  });
3031
4009
  router.all("/api/v1/view/*", (req, res) => {
3032
- return router$7(req, res, finalhandler(req, res));
4010
+ return router$9(req, res, finalhandler(req, res));
3033
4011
  });
3034
4012
  router.all("/api/v1/markdown_mock/*", (req, res) => {
3035
- return router$4(req, res, finalhandler(req, res));
4013
+ return router$6(req, res, finalhandler(req, res));
3036
4014
  });
3037
4015
  router.all("/api/v1/markdown_view/*", (req, res) => {
4016
+ return router$5(req, res, finalhandler(req, res));
4017
+ });
4018
+ router.all("/api/v1/explorer_mock/*", (req, res) => {
4019
+ return router$4(req, res, finalhandler(req, res));
4020
+ });
4021
+ router.all("/api/v1/explorer_view/*", (req, res) => {
3038
4022
  return router$3(req, res, finalhandler(req, res));
3039
4023
  });
3040
4024
  router.all("/icon/*", (req, res) => {
3041
- return router$6(req, res, finalhandler(req, res));
4025
+ return router$8(req, res, finalhandler(req, res));
3042
4026
  });
3043
4027
  router.all("/api/v1/dict/*", (req, res) => {
3044
- return router$5(req, res, finalhandler(req, res));
4028
+ return router$7(req, res, finalhandler(req, res));
3045
4029
  });
3046
4030
  router.all("/api/v1/global/*", (req, res) => {
3047
4031
  return router$2(req, res, finalhandler(req, res));