openmcp-sdk 0.0.4 → 0.0.5

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 (170) hide show
  1. package/main.js +59 -0
  2. package/package.json +5 -2
  3. package/renderer/CascadiaCode.woff2 +0 -0
  4. package/renderer/animation.css +121 -0
  5. package/renderer/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  6. package/renderer/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  7. package/renderer/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  8. package/renderer/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  9. package/renderer/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  10. package/renderer/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  11. package/renderer/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  12. package/renderer/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  13. package/renderer/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  14. package/renderer/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  15. package/renderer/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  16. package/renderer/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  17. package/renderer/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  18. package/renderer/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  19. package/renderer/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  20. package/renderer/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  21. package/renderer/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  22. package/renderer/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  23. package/renderer/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  24. package/renderer/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  25. package/renderer/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  26. package/renderer/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  27. package/renderer/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  28. package/renderer/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  29. package/renderer/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  30. package/renderer/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  31. package/renderer/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  32. package/renderer/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  33. package/renderer/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  34. package/renderer/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  35. package/renderer/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  36. package/renderer/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  37. package/renderer/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  38. package/renderer/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  39. package/renderer/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  40. package/renderer/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  41. package/renderer/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  42. package/renderer/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  43. package/renderer/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  44. package/renderer/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  45. package/renderer/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  46. package/renderer/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  47. package/renderer/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  48. package/renderer/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  49. package/renderer/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  50. package/renderer/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  51. package/renderer/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  52. package/renderer/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  53. package/renderer/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  54. package/renderer/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  55. package/renderer/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  56. package/renderer/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  57. package/renderer/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  58. package/renderer/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  59. package/renderer/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  60. package/renderer/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  61. package/renderer/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  62. package/renderer/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  63. package/renderer/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  64. package/renderer/assets/index-3W5tQSKs.js +447 -0
  65. package/renderer/assets/style-DX4gh5fe.css +1 -0
  66. package/renderer/default-dark.css +772 -0
  67. package/renderer/default-light.css +777 -0
  68. package/renderer/favicon.png +0 -0
  69. package/renderer/iconfont.css +219 -0
  70. package/renderer/iconfont.woff2 +0 -0
  71. package/renderer/images/deepseek.com.ico +0 -0
  72. package/renderer/images/grok.com.png +0 -0
  73. package/renderer/images/gstatic.com.svg +22 -0
  74. package/renderer/images/kimichat.cn.png +0 -0
  75. package/renderer/images/mistral.ai.ico +0 -0
  76. package/renderer/images/ollama.png +0 -0
  77. package/renderer/images/openai.com.ico +0 -0
  78. package/renderer/images/openmcp-qq-qrcode.jpg +0 -0
  79. package/renderer/images/openmcp.png +0 -0
  80. package/renderer/images/openmcp.svg +22 -0
  81. package/renderer/images/perplexity.ai.ico +0 -0
  82. package/renderer/index.html +19 -0
  83. package/renderer/mcp.css +230 -0
  84. package/renderer/sf-mono-regular.woff2 +0 -0
  85. package/renderer/vscode.css +149 -0
  86. package/service/common/index.d.ts +1 -2
  87. package/service/common/index.d.ts.map +1 -1
  88. package/service/common/index.dto.d.ts +7 -3
  89. package/service/common/index.dto.d.ts.map +1 -1
  90. package/service/common/index.dto.js +1 -2
  91. package/service/common/index.js +4 -8
  92. package/service/common/router.d.ts +7 -7
  93. package/service/common/router.d.ts.map +1 -1
  94. package/service/common/router.js +18 -22
  95. package/service/hook/adapter.d.ts +10 -17
  96. package/service/hook/adapter.d.ts.map +1 -1
  97. package/service/hook/adapter.js +31 -51
  98. package/service/hook/axios-fetch.d.ts +7 -0
  99. package/service/hook/axios-fetch.d.ts.map +1 -0
  100. package/service/hook/axios-fetch.js +162 -0
  101. package/service/hook/db.d.ts.map +1 -1
  102. package/service/hook/db.js +11 -50
  103. package/service/hook/llm.d.ts.map +1 -1
  104. package/service/hook/llm.js +49 -4
  105. package/service/hook/setting.js +6 -11
  106. package/service/hook/types.js +1 -2
  107. package/service/hook/util.d.ts +2 -0
  108. package/service/hook/util.d.ts.map +1 -0
  109. package/service/hook/util.js +1 -0
  110. package/service/index.d.ts +4 -4
  111. package/service/index.d.ts.map +1 -1
  112. package/service/index.js +4 -14
  113. package/service/llm/llm.controller.d.ts +9 -4
  114. package/service/llm/llm.controller.d.ts.map +1 -1
  115. package/service/llm/llm.controller.js +27 -20
  116. package/service/llm/llm.dto.d.ts +15 -0
  117. package/service/llm/llm.dto.d.ts.map +1 -1
  118. package/service/llm/llm.dto.js +1 -2
  119. package/service/llm/llm.service.d.ts +3 -3
  120. package/service/llm/llm.service.d.ts.map +1 -1
  121. package/service/llm/llm.service.js +48 -28
  122. package/service/main.d.ts +7 -0
  123. package/service/main.d.ts.map +1 -0
  124. package/service/main.js +107 -0
  125. package/service/mcp/auth.service.d.ts +23 -0
  126. package/service/mcp/auth.service.d.ts.map +1 -0
  127. package/service/mcp/auth.service.js +158 -0
  128. package/service/mcp/client.controller.d.ts +146 -40
  129. package/service/mcp/client.controller.d.ts.map +1 -1
  130. package/service/mcp/client.controller.js +34 -31
  131. package/service/mcp/client.dto.d.ts +4 -3
  132. package/service/mcp/client.dto.d.ts.map +1 -1
  133. package/service/mcp/client.dto.js +1 -2
  134. package/service/mcp/client.service.d.ts +140 -32
  135. package/service/mcp/client.service.d.ts.map +1 -1
  136. package/service/mcp/client.service.js +55 -22
  137. package/service/mcp/connect.controller.d.ts +5 -5
  138. package/service/mcp/connect.controller.d.ts.map +1 -1
  139. package/service/mcp/connect.controller.js +28 -15
  140. package/service/mcp/connect.service.d.ts +7 -5
  141. package/service/mcp/connect.service.d.ts.map +1 -1
  142. package/service/mcp/connect.service.js +235 -27
  143. package/service/mcp/ocr.controller.d.ts +3 -4
  144. package/service/mcp/ocr.controller.d.ts.map +1 -1
  145. package/service/mcp/ocr.controller.js +11 -15
  146. package/service/mcp/ocr.dto.js +1 -2
  147. package/service/mcp/ocr.service.d.ts +2 -2
  148. package/service/mcp/ocr.service.d.ts.map +1 -1
  149. package/service/mcp/ocr.service.js +21 -64
  150. package/service/panel/panel.controller.d.ts +9 -9
  151. package/service/panel/panel.controller.d.ts.map +1 -1
  152. package/service/panel/panel.controller.js +28 -26
  153. package/service/panel/panel.dto.js +1 -2
  154. package/service/panel/panel.service.d.ts +3 -3
  155. package/service/panel/panel.service.d.ts.map +1 -1
  156. package/service/panel/panel.service.js +7 -44
  157. package/service/server.d.ts +7 -0
  158. package/service/server.d.ts.map +1 -0
  159. package/service/server.js +131 -0
  160. package/service/setting/setting.controller.d.ts +7 -7
  161. package/service/setting/setting.controller.d.ts.map +1 -1
  162. package/service/setting/setting.controller.js +15 -21
  163. package/service/setting/setting.dto.js +1 -2
  164. package/service/setting/setting.service.d.ts +1 -1
  165. package/service/setting/setting.service.d.ts.map +1 -1
  166. package/service/setting/setting.service.js +14 -49
  167. package/task-loop.d.ts +35 -0
  168. package/task-loop.js +8480 -205
  169. package/tools.js +8 -1
  170. package/task-loop.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import Tesseract from 'tesseract.js';
2
- import { PostMessageble } from '../hook/adapter';
3
- import { OcrWorker } from './ocr.dto';
2
+ import { PostMessageble } from '../hook/adapter.js';
3
+ import { OcrWorker } from './ocr.dto.js';
4
4
  export declare const ocrWorkerStorage: Map<string, OcrWorker>;
5
5
  export declare function saveBase64ImageData(base64String: string, mimeType: string): string;
6
6
  export declare function loadBase64ImageData(fileName: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"ocr.service.d.ts","sourceRoot":"","sources":["../../src/mcp/ocr.service.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOtC,eAAO,MAAM,gBAAgB,wBAA+B,CAAC;AAE7D,wBAAgB,mBAAmB,CAC/B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACjB,MAAM,CAWR;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa5D;AAGD,wBAAsB,YAAY,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,aAAa,KAAK,IAAI,EAClD,IAAI,GAAE,MAAsB,mBA2B/B;AAGD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,SAAS,CAoDpF"}
1
+ {"version":3,"file":"ocr.service.d.ts","sourceRoot":"","sources":["../../src/mcp/ocr.service.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,eAAO,MAAM,gBAAgB,wBAA+B,CAAC;AAE7D,wBAAgB,mBAAmB,CAC/B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACjB,MAAM,CAWR;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa5D;AAGD,wBAAsB,YAAY,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,aAAa,KAAK,IAAI,EAClD,IAAI,GAAE,MAAsB,mBA2B/B;AAGD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,SAAS,CAoDpF"}
@@ -1,37 +1,3 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
1
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
2
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
3
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -41,32 +7,23 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
41
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
42
8
  });
43
9
  };
44
- var __importDefault = (this && this.__importDefault) || function (mod) {
45
- return (mod && mod.__esModule) ? mod : { "default": mod };
46
- };
47
- Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.ocrWorkerStorage = void 0;
49
- exports.saveBase64ImageData = saveBase64ImageData;
50
- exports.loadBase64ImageData = loadBase64ImageData;
51
- exports.tesseractOCR = tesseractOCR;
52
- exports.createOcrWorker = createOcrWorker;
53
- const tesseract_js_1 = __importDefault(require("tesseract.js"));
54
- const uuid_1 = require("uuid");
55
- const db_1 = require("../hook/db");
56
- const fs = __importStar(require("fs"));
57
- const os = __importStar(require("os"));
58
- const path = __importStar(require("path"));
59
- const setting_1 = require("../hook/setting");
60
- exports.ocrWorkerStorage = new Map();
61
- function saveBase64ImageData(base64String, mimeType) {
10
+ import Tesseract from 'tesseract.js';
11
+ import { v4 as uuidv4 } from 'uuid';
12
+ import { diskStorage, ocrDB } from '../hook/db.js';
13
+ import * as fs from 'fs';
14
+ import * as os from 'os';
15
+ import * as path from 'path';
16
+ import { RUNNING_CWD } from '../hook/setting.js';
17
+ export const ocrWorkerStorage = new Map();
18
+ export function saveBase64ImageData(base64String, mimeType) {
62
19
  // 从 base64 字符串中提取数据部分
63
20
  const base64Data = base64String.replace(/^data:.+;base64,/, '');
64
21
  // 生成唯一文件名
65
- const fileName = `${(0, uuid_1.v4)()}.${mimeType.split('/')[1]}`;
66
- db_1.diskStorage.setSync(fileName, base64Data, { encoding: 'base64' });
22
+ const fileName = `${uuidv4()}.${mimeType.split('/')[1]}`;
23
+ diskStorage.setSync(fileName, base64Data, { encoding: 'base64' });
67
24
  return fileName;
68
25
  }
69
- function loadBase64ImageData(fileName) {
26
+ export function loadBase64ImageData(fileName) {
70
27
  const homedir = os.homedir();
71
28
  const imageStorageFolder = path.join(homedir, '.openmcp', 'storage');
72
29
  const filePath = path.join(imageStorageFolder, fileName);
@@ -79,15 +36,15 @@ function loadBase64ImageData(fileName) {
79
36
  const base64String = `data:image/png;base64,${fileContent}`;
80
37
  return base64String;
81
38
  }
82
- function tesseractOCR(imagePath_1, logger_1) {
39
+ export function tesseractOCR(imagePath_1, logger_1) {
83
40
  return __awaiter(this, arguments, void 0, function* (imagePath, logger, lang = 'eng+chi_sim') {
84
- const ocrHome = path.join(setting_1.RUNNING_CWD, 'resources', 'ocr');
41
+ const ocrHome = path.join(RUNNING_CWD, 'resources', 'ocr');
85
42
  if (!ocrHome) {
86
43
  console.log('ocr 目录不存在');
87
44
  return '安装包已经损坏';
88
45
  }
89
46
  try {
90
- const { data: { text } } = yield tesseract_js_1.default.recognize(imagePath, lang, {
47
+ const { data: { text } } = yield Tesseract.recognize(imagePath, lang, {
91
48
  logger,
92
49
  gzip: false,
93
50
  langPath: ocrHome,
@@ -102,8 +59,8 @@ function tesseractOCR(imagePath_1, logger_1) {
102
59
  return '无法识别图片';
103
60
  });
104
61
  }
105
- function createOcrWorker(filename, webview) {
106
- const workerId = (0, uuid_1.v4)();
62
+ export function createOcrWorker(filename, webview) {
63
+ const workerId = uuidv4();
107
64
  const logger = (message) => {
108
65
  console.log('report ocr status');
109
66
  console.log(message);
@@ -112,7 +69,7 @@ function createOcrWorker(filename, webview) {
112
69
  data: Object.assign({ id: workerId }, message)
113
70
  });
114
71
  };
115
- const imagePath = db_1.diskStorage.getStoragePath(filename);
72
+ const imagePath = diskStorage.getStoragePath(filename);
116
73
  console.log(imagePath);
117
74
  const fut = tesseractOCR(imagePath, logger);
118
75
  fut.then((text) => {
@@ -123,13 +80,13 @@ function createOcrWorker(filename, webview) {
123
80
  text
124
81
  }
125
82
  });
126
- db_1.ocrDB.insert({
83
+ ocrDB.insert({
127
84
  id: filename,
128
85
  filename,
129
86
  text,
130
87
  createTime: Date.now()
131
88
  });
132
- exports.ocrWorkerStorage.delete(workerId);
89
+ ocrWorkerStorage.delete(workerId);
133
90
  });
134
91
  const worker = {
135
92
  id: workerId,
@@ -138,6 +95,6 @@ function createOcrWorker(filename, webview) {
138
95
  createTime: Date.now(),
139
96
  fut
140
97
  };
141
- exports.ocrWorkerStorage.set(workerId, worker);
98
+ ocrWorkerStorage.set(workerId, worker);
142
99
  return worker;
143
100
  }
@@ -1,27 +1,27 @@
1
- import { RequestClientType } from "../common";
2
- import { PostMessageble } from "../hook/adapter";
1
+ import { PostMessageble } from "../hook/adapter.js";
2
+ import { RequestData } from "../common/index.dto.js";
3
3
  export declare class PanelController {
4
- savePanel(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
4
+ savePanel(data: RequestData, webview: PostMessageble): Promise<{
5
5
  code: number;
6
6
  msg: string;
7
7
  }>;
8
- loadPanel(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
8
+ loadPanel(data: RequestData, webview: PostMessageble): Promise<{
9
9
  code: number;
10
- msg: import("./panel.dto").SaveTab;
10
+ msg: import("./panel.dto.js").SaveTab;
11
11
  }>;
12
- setSystemPrompt(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
12
+ setSystemPrompt(data: RequestData, webview: PostMessageble): Promise<{
13
13
  code: number;
14
14
  msg: string;
15
15
  }>;
16
- deleteSystemPrompt(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
16
+ deleteSystemPrompt(data: RequestData, webview: PostMessageble): Promise<{
17
17
  code: number;
18
18
  msg: string;
19
19
  }>;
20
- saveSystemPrompts(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
20
+ saveSystemPrompts(data: RequestData, webview: PostMessageble): Promise<{
21
21
  code: number;
22
22
  msg: string;
23
23
  }>;
24
- loadSystemPrompts(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
24
+ loadSystemPrompts(data: RequestData, webview: PostMessageble): Promise<{
25
25
  code: number;
26
26
  msg: {
27
27
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"panel.controller.d.ts","sourceRoot":"","sources":["../../src/panel/panel.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,qBAAa,eAAe;IAElB,SAAS,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;IAYvE,SAAS,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;IAWvE,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;IAgB7E,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;IAUhF,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;IAkB/E,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;;;;CAgBxF"}
1
+ {"version":3,"file":"panel.controller.d.ts","sourceRoot":"","sources":["../../src/panel/panel.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAKrD,qBAAa,eAAe;IAElB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc;;;;IAYpD,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc;;;;IAYpD,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc;;;;IAiB1D,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc;;;;IAW7D,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc;;;;IAmB5D,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc;;;;;;;CAerE"}
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
2
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
3
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -14,36 +13,38 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
14
13
  step((generator = generator.apply(thisArg, _arguments || [])).next());
15
14
  });
16
15
  };
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.PanelController = void 0;
19
- const common_1 = require("../common");
20
- const db_1 = require("../hook/db");
21
- const panel_service_1 = require("./panel.service");
22
- class PanelController {
23
- savePanel(client, data, webview) {
16
+ import { Controller } from "../common/index.js";
17
+ import { getClient } from "../mcp/connect.service.js";
18
+ import { systemPromptDB } from "../hook/db.js";
19
+ import { loadTabSaveConfig, saveTabSaveConfig } from "./panel.service.js";
20
+ export class PanelController {
21
+ savePanel(data, webview) {
24
22
  return __awaiter(this, void 0, void 0, function* () {
23
+ const client = getClient(data.clientId);
25
24
  const serverInfo = client === null || client === void 0 ? void 0 : client.getServerVersion();
26
- (0, panel_service_1.saveTabSaveConfig)(serverInfo, data);
25
+ saveTabSaveConfig(serverInfo, data);
27
26
  return {
28
27
  code: 200,
29
28
  msg: 'Settings saved successfully'
30
29
  };
31
30
  });
32
31
  }
33
- loadPanel(client, data, webview) {
32
+ loadPanel(data, webview) {
34
33
  return __awaiter(this, void 0, void 0, function* () {
34
+ const client = getClient(data.clientId);
35
35
  const serverInfo = client === null || client === void 0 ? void 0 : client.getServerVersion();
36
- const config = (0, panel_service_1.loadTabSaveConfig)(serverInfo);
36
+ const config = loadTabSaveConfig(serverInfo);
37
37
  return {
38
38
  code: 200,
39
39
  msg: config
40
40
  };
41
41
  });
42
42
  }
43
- setSystemPrompt(client, data, webview) {
43
+ setSystemPrompt(data, webview) {
44
44
  return __awaiter(this, void 0, void 0, function* () {
45
+ const client = getClient(data.clientId);
45
46
  const { name, content } = data;
46
- yield db_1.systemPromptDB.insert({
47
+ yield systemPromptDB.insert({
47
48
  id: name,
48
49
  name,
49
50
  content
@@ -54,21 +55,23 @@ class PanelController {
54
55
  };
55
56
  });
56
57
  }
57
- deleteSystemPrompt(client, data, webview) {
58
+ deleteSystemPrompt(data, webview) {
58
59
  return __awaiter(this, void 0, void 0, function* () {
60
+ const client = getClient(data.clientId);
59
61
  const { name } = data;
60
- yield db_1.systemPromptDB.delete(name);
62
+ yield systemPromptDB.delete(name);
61
63
  return {
62
64
  code: 200,
63
65
  msg: 'Settings saved successfully'
64
66
  };
65
67
  });
66
68
  }
67
- saveSystemPrompts(client, data, webview) {
69
+ saveSystemPrompts(data, webview) {
68
70
  return __awaiter(this, void 0, void 0, function* () {
71
+ const client = getClient(data.clientId);
69
72
  const { prompts } = data;
70
73
  yield Promise.all(prompts.map((prompt) => {
71
- db_1.systemPromptDB.insert({
74
+ systemPromptDB.insert({
72
75
  id: prompt.name,
73
76
  name: prompt.name,
74
77
  content: prompt.content
@@ -80,9 +83,9 @@ class PanelController {
80
83
  };
81
84
  });
82
85
  }
83
- loadSystemPrompts(client, data, webview) {
86
+ loadSystemPrompts(data, webview) {
84
87
  return __awaiter(this, void 0, void 0, function* () {
85
- const queryPrompts = yield db_1.systemPromptDB.findAll();
88
+ const queryPrompts = yield systemPromptDB.findAll();
86
89
  const prompts = [];
87
90
  for (const prompt of queryPrompts) {
88
91
  prompts.push({
@@ -97,22 +100,21 @@ class PanelController {
97
100
  });
98
101
  }
99
102
  }
100
- exports.PanelController = PanelController;
101
103
  __decorate([
102
- (0, common_1.Controller)('panel/save')
104
+ Controller('panel/save')
103
105
  ], PanelController.prototype, "savePanel", null);
104
106
  __decorate([
105
- (0, common_1.Controller)('panel/load')
107
+ Controller('panel/load')
106
108
  ], PanelController.prototype, "loadPanel", null);
107
109
  __decorate([
108
- (0, common_1.Controller)('system-prompts/set')
110
+ Controller('system-prompts/set')
109
111
  ], PanelController.prototype, "setSystemPrompt", null);
110
112
  __decorate([
111
- (0, common_1.Controller)('system-prompts/delete')
113
+ Controller('system-prompts/delete')
112
114
  ], PanelController.prototype, "deleteSystemPrompt", null);
113
115
  __decorate([
114
- (0, common_1.Controller)('system-prompts/save')
116
+ Controller('system-prompts/save')
115
117
  ], PanelController.prototype, "saveSystemPrompts", null);
116
118
  __decorate([
117
- (0, common_1.Controller)('system-prompts/load')
119
+ Controller('system-prompts/load')
118
120
  ], PanelController.prototype, "loadSystemPrompts", null);
@@ -1,2 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
@@ -1,6 +1,6 @@
1
- import { IServerVersion } from '../mcp/client.dto';
2
- import { SaveTab } from './panel.dto';
3
- import { IConfig } from '../setting/setting.dto';
1
+ import { IServerVersion } from '../mcp/client.dto.js';
2
+ import { SaveTab } from './panel.dto.js';
3
+ import { IConfig } from '../setting/setting.dto.js';
4
4
  export declare function loadTabSaveConfig(serverInfo: IServerVersion): SaveTab;
5
5
  export declare function saveTabSaveConfig(serverInfo: IServerVersion, config: Partial<IConfig>): void;
6
6
  //# sourceMappingURL=panel.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"panel.service.d.ts","sourceRoot":"","sources":["../../src/panel/panel.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAyCjD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAcrE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAS5F"}
1
+ {"version":3,"file":"panel.service.d.ts","sourceRoot":"","sources":["../../src/panel/panel.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAyCpD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAcrE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAS5F"}
@@ -1,43 +1,6 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.loadTabSaveConfig = loadTabSaveConfig;
37
- exports.saveTabSaveConfig = saveTabSaveConfig;
38
- const fs = __importStar(require("fs"));
39
- const path = __importStar(require("path"));
40
- const setting_1 = require("../hook/setting");
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { VSCODE_WORKSPACE } from '../hook/setting.js';
41
4
  const DEFAULT_TABS = {
42
5
  tabs: [],
43
6
  currentIndex: -1
@@ -48,9 +11,9 @@ function getTabSavePath(serverInfo) {
48
11
  const escapeName = name.replace(/[\\/:*?"<>|]/g, '_');
49
12
  const tabSaveName = `tabs.${escapeName}.json`;
50
13
  // 如果是 vscode 插件下,则修改为 ~/.vscode/openmcp.json
51
- if (setting_1.VSCODE_WORKSPACE) {
14
+ if (VSCODE_WORKSPACE) {
52
15
  // 在 VSCode 插件环境下
53
- const configDir = path.join(setting_1.VSCODE_WORKSPACE, '.vscode');
16
+ const configDir = path.join(VSCODE_WORKSPACE, '.vscode');
54
17
  if (!fs.existsSync(configDir)) {
55
18
  fs.mkdirSync(configDir, { recursive: true });
56
19
  }
@@ -69,7 +32,7 @@ function createSaveTabConfig(serverInfo) {
69
32
  fs.writeFileSync(configPath, JSON.stringify(DEFAULT_TABS, null, 2), 'utf-8');
70
33
  return DEFAULT_TABS;
71
34
  }
72
- function loadTabSaveConfig(serverInfo) {
35
+ export function loadTabSaveConfig(serverInfo) {
73
36
  const tabSavePath = getTabSavePath(serverInfo);
74
37
  if (!fs.existsSync(tabSavePath)) {
75
38
  return createSaveTabConfig(serverInfo);
@@ -83,7 +46,7 @@ function loadTabSaveConfig(serverInfo) {
83
46
  return createSaveTabConfig(serverInfo);
84
47
  }
85
48
  }
86
- function saveTabSaveConfig(serverInfo, config) {
49
+ export function saveTabSaveConfig(serverInfo, config) {
87
50
  const tabSavePath = getTabSavePath(serverInfo);
88
51
  try {
89
52
  fs.writeFileSync(tabSavePath, JSON.stringify(config, null, 2), 'utf-8');
@@ -0,0 +1,7 @@
1
+ export interface VSCodeMessage {
2
+ command: string;
3
+ data?: unknown;
4
+ callbackId?: string;
5
+ }
6
+ export type MessageHandler = (message: VSCodeMessage) => void;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import pino from 'pino';
3
+ import { routeMessage } from './common/router.js';
4
+ import { VSCodeWebViewLike } from './hook/adapter.js';
5
+ import path from 'node:path';
6
+ import * as fs from 'node:fs';
7
+ import { setRunningCWD } from './hook/setting.js';
8
+ import { exit } from 'node:process';
9
+ const logger = pino.default({
10
+ transport: {
11
+ target: 'pino-pretty', // 启用 pino-pretty
12
+ options: {
13
+ colorize: true, // 开启颜色
14
+ levelFirst: true, // 先打印日志级别
15
+ translateTime: 'SYS:yyyy-mm-dd HH:MM:ss', // 格式化时间
16
+ ignore: 'pid,hostname', // 忽略部分字段
17
+ }
18
+ }
19
+ });
20
+ function refreshConnectionOption(envPath) {
21
+ const serverPath = path.join(__dirname, '..', '..', 'servers');
22
+ const defaultOption = {
23
+ connectionType: 'STDIO',
24
+ commandString: 'mcp run main.py',
25
+ cwd: serverPath
26
+ };
27
+ fs.writeFileSync(envPath, JSON.stringify(defaultOption, null, 4));
28
+ return { items: [defaultOption] };
29
+ }
30
+ function acquireConnectionOption() {
31
+ const envPath = path.join(__dirname, '..', '.env');
32
+ if (!fs.existsSync(envPath)) {
33
+ return refreshConnectionOption(envPath);
34
+ }
35
+ try {
36
+ const option = JSON.parse(fs.readFileSync(envPath, 'utf-8'));
37
+ if (!option.items) {
38
+ return refreshConnectionOption(envPath);
39
+ }
40
+ if (option.items && option.items.length === 0) {
41
+ return refreshConnectionOption(envPath);
42
+ }
43
+ // 按照前端的规范,整理成 commandString 样式
44
+ option.items = option.items.map((item) => {
45
+ var _a;
46
+ if (item.connectionType === 'STDIO') {
47
+ item.commandString = (_a = [item.command, ...item.args]) === null || _a === void 0 ? void 0 : _a.join(' ');
48
+ }
49
+ else {
50
+ item.url = item.url;
51
+ }
52
+ return item;
53
+ });
54
+ return option;
55
+ }
56
+ catch (error) {
57
+ logger.error('读取 .env 配置文件');
58
+ return refreshConnectionOption(envPath);
59
+ }
60
+ }
61
+ if (!fs.existsSync(path.join(__dirname, '..', '.env.website.local'))) {
62
+ console.log('.env.website.local 不存在!');
63
+ exit(0);
64
+ }
65
+ const authPassword = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '.env.website.local'), 'utf-8')).password;
66
+ function updateConnectionOption(data) {
67
+ const envPath = path.join(__dirname, '..', '.env');
68
+ const connection = { items: data };
69
+ fs.writeFileSync(envPath, JSON.stringify(connection, null, 4));
70
+ }
71
+ const devHome = path.join(__dirname, '..', '..');
72
+ setRunningCWD(devHome);
73
+ function verifyToken(url) {
74
+ try {
75
+ const token = url.split('=')[1];
76
+ return token === authPassword.toString();
77
+ }
78
+ catch (error) {
79
+ return false;
80
+ }
81
+ }
82
+ const wss = new WebSocketServer({
83
+ port: 8282,
84
+ verifyClient: (info, callback) => {
85
+ console.log(info.req.url);
86
+ const ok = verifyToken(info.req.url || '');
87
+ if (!ok) {
88
+ callback(false, 401, 'Unauthorized: Invalid token');
89
+ }
90
+ else {
91
+ callback(true); // 允许连接
92
+ }
93
+ }
94
+ });
95
+ console.log('listen on ws://localhost:8282');
96
+ wss.on('connection', (ws) => {
97
+ // 仿造 webview 进行统一接口访问
98
+ const webview = new VSCodeWebViewLike(ws);
99
+ // 先发送成功建立的消息
100
+ webview.postMessage({
101
+ command: 'hello',
102
+ data: {
103
+ version: '0.0.1',
104
+ name: '消息桥连接完成'
105
+ }
106
+ });
107
+ const option = acquireConnectionOption();
108
+ // 注册消息接受的管线
109
+ webview.onDidReceiveMessage(message => {
110
+ logger.info(`command: [${message.command || 'No Command'}]`);
111
+ const { command, data } = message;
112
+ switch (command) {
113
+ case 'web/launch-signature':
114
+ const launchResult = {
115
+ code: 200,
116
+ msg: option.items
117
+ };
118
+ webview.postMessage({
119
+ command: 'web/launch-signature',
120
+ data: launchResult
121
+ });
122
+ break;
123
+ case 'web/update-connection-signature':
124
+ updateConnectionOption(data);
125
+ break;
126
+ default:
127
+ routeMessage(command, data, webview);
128
+ break;
129
+ }
130
+ });
131
+ });
@@ -1,19 +1,19 @@
1
- import { RequestClientType } from "../common";
2
- import { PostMessageble } from "../hook/adapter";
1
+ import { PostMessageble } from "../hook/adapter.js";
2
+ import { RequestData } from "../common/index.dto.js";
3
3
  export declare class SettingController {
4
- saveSetting(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
4
+ saveSetting(data: RequestData, webview: PostMessageble): Promise<{
5
5
  code: number;
6
6
  msg: string;
7
7
  }>;
8
- loadSetting(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
8
+ loadSetting(data: RequestData, webview: PostMessageble): Promise<{
9
9
  code: number;
10
- msg: import("./setting.dto").IConfig;
10
+ msg: import("./setting.dto.js").IConfig;
11
11
  }>;
12
- setTourController(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
12
+ setTourController(data: any, webview: PostMessageble): Promise<{
13
13
  code: number;
14
14
  msg: string;
15
15
  }>;
16
- getTourController(client: RequestClientType, data: any, webview: PostMessageble): Promise<{
16
+ getTourController(data: any, webview: PostMessageble): Promise<{
17
17
  code: number;
18
18
  msg: {
19
19
  userHasReadGuide: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"setting.controller.d.ts","sourceRoot":"","sources":["../../src/setting/setting.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,qBAAa,iBAAiB;IAGpB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;IAWzE,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;IAWzE,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;IAa/E,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;;;CAYxF"}
1
+ {"version":3,"file":"setting.controller.d.ts","sourceRoot":"","sources":["../../src/setting/setting.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAIrD,qBAAa,iBAAiB;IAGpB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc;;;;IAWtD,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc;;;;IAStD,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;IAWpD,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc;;;;;;CAW7D"}