@leterhong/multichat 1.6.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 (214) hide show
  1. package/.agents/plugins/marketplace.json +32 -0
  2. package/.agents/plugins/plugins/developer-toolkit/.codex-plugin/plugin.json +24 -0
  3. package/.agents/plugins/plugins/developer-toolkit/skills/code-review/SKILL.md +9 -0
  4. package/.agents/plugins/plugins/developer-toolkit/skills/code-review/agents/openai.yaml +3 -0
  5. package/.agents/plugins/plugins/developer-toolkit/skills/release-notes/SKILL.md +9 -0
  6. package/.agents/plugins/plugins/developer-toolkit/skills/release-notes/agents/openai.yaml +3 -0
  7. package/.agents/plugins/plugins/developer-toolkit/skills/security-review/SKILL.md +9 -0
  8. package/.agents/plugins/plugins/developer-toolkit/skills/security-review/agents/openai.yaml +3 -0
  9. package/.agents/plugins/plugins/developer-toolkit/skills/test-plan/SKILL.md +9 -0
  10. package/.agents/plugins/plugins/developer-toolkit/skills/test-plan/agents/openai.yaml +3 -0
  11. package/.agents/plugins/plugins/writing-toolkit/.codex-plugin/plugin.json +24 -0
  12. package/.agents/plugins/plugins/writing-toolkit/skills/meeting-notes/SKILL.md +9 -0
  13. package/.agents/plugins/plugins/writing-toolkit/skills/meeting-notes/agents/openai.yaml +3 -0
  14. package/.agents/plugins/plugins/writing-toolkit/skills/resume-tune/SKILL.md +9 -0
  15. package/.agents/plugins/plugins/writing-toolkit/skills/resume-tune/agents/openai.yaml +3 -0
  16. package/.agents/plugins/plugins/writing-toolkit/skills/weekly-report/SKILL.md +9 -0
  17. package/.agents/plugins/plugins/writing-toolkit/skills/weekly-report/agents/openai.yaml +3 -0
  18. package/.agents/skills/.gitkeep +1 -0
  19. package/.agents/skills/wanghong-handwritten-ppt/SKILL.md +172 -0
  20. package/.agents/skills/wanghong-handwritten-ppt/assets/HTML-PPT-LICENSE +21 -0
  21. package/.agents/skills/wanghong-handwritten-ppt/assets/NEAT-ANNOTATIONS-LICENSE +21 -0
  22. package/.agents/skills/wanghong-handwritten-ppt/assets/animations.css +138 -0
  23. package/.agents/skills/wanghong-handwritten-ppt/assets/base.css +150 -0
  24. package/.agents/skills/wanghong-handwritten-ppt/assets/deepseek-example.css +893 -0
  25. package/.agents/skills/wanghong-handwritten-ppt/assets/neat-annotations.css +152 -0
  26. package/.agents/skills/wanghong-handwritten-ppt/assets/preview-cover.png +0 -0
  27. package/.agents/skills/wanghong-handwritten-ppt/assets/preview-diagram.png +0 -0
  28. package/.agents/skills/wanghong-handwritten-ppt/assets/preview-summary.png +0 -0
  29. package/.agents/skills/wanghong-handwritten-ppt/assets/preview-table.png +0 -0
  30. package/.agents/skills/wanghong-handwritten-ppt/assets/runtime.js +960 -0
  31. package/.agents/skills/wanghong-handwritten-ppt/assets/template.css +198 -0
  32. package/.agents/skills/wanghong-handwritten-ppt/evals/evals.json +20 -0
  33. package/.agents/skills/wanghong-handwritten-ppt/examples/deepseek-v4-flash/index.html +414 -0
  34. package/.agents/skills/wanghong-handwritten-ppt/examples/deepseek-v4-flash/style.css +897 -0
  35. package/.agents/skills/wanghong-handwritten-ppt/references/prompts.md +170 -0
  36. package/.agents/skills/wanghong-handwritten-ppt/references/style-guide.md +133 -0
  37. package/.agents/skills/wanghong-handwritten-ppt/scripts/check_deck.py +41 -0
  38. package/.agents/skills/wanghong-handwritten-ppt/scripts/prepare_render_html.py +137 -0
  39. package/.agents/skills/wanghong-handwritten-ppt/scripts/render.sh +110 -0
  40. package/.agents/skills/wanghong-handwritten-ppt/templates/deck.html +94 -0
  41. package/.agents/skills/wanghong-handwritten-ppt/tests/test_font_contract.py +73 -0
  42. package/LICENSE +21 -0
  43. package/README.md +186 -0
  44. package/backend/adapters/README.md +77 -0
  45. package/backend/adapters/anthropic.ts +115 -0
  46. package/backend/adapters/base.ts +47 -0
  47. package/backend/adapters/index.ts +41 -0
  48. package/backend/adapters/lmstudio.ts +7 -0
  49. package/backend/adapters/moonshot.ts +7 -0
  50. package/backend/adapters/ollama.ts +7 -0
  51. package/backend/adapters/openai-compatible.ts +51 -0
  52. package/backend/adapters/openai.ts +7 -0
  53. package/backend/adapters/qwen.ts +112 -0
  54. package/backend/adapters/wenxin.ts +136 -0
  55. package/backend/adapters/zhipu.ts +93 -0
  56. package/backend/dist/adapters/anthropic.js +130 -0
  57. package/backend/dist/adapters/anthropic.js.map +1 -0
  58. package/backend/dist/adapters/base.js +38 -0
  59. package/backend/dist/adapters/base.js.map +1 -0
  60. package/backend/dist/adapters/index.js +39 -0
  61. package/backend/dist/adapters/index.js.map +1 -0
  62. package/backend/dist/adapters/lmstudio.js +8 -0
  63. package/backend/dist/adapters/lmstudio.js.map +1 -0
  64. package/backend/dist/adapters/moonshot.js +8 -0
  65. package/backend/dist/adapters/moonshot.js.map +1 -0
  66. package/backend/dist/adapters/ollama.js +8 -0
  67. package/backend/dist/adapters/ollama.js.map +1 -0
  68. package/backend/dist/adapters/openai-compatible.js +47 -0
  69. package/backend/dist/adapters/openai-compatible.js.map +1 -0
  70. package/backend/dist/adapters/openai.js +8 -0
  71. package/backend/dist/adapters/openai.js.map +1 -0
  72. package/backend/dist/adapters/qwen.js +103 -0
  73. package/backend/dist/adapters/qwen.js.map +1 -0
  74. package/backend/dist/adapters/wenxin.js +114 -0
  75. package/backend/dist/adapters/wenxin.js.map +1 -0
  76. package/backend/dist/adapters/zhipu.js +86 -0
  77. package/backend/dist/adapters/zhipu.js.map +1 -0
  78. package/backend/dist/extensions/demo-mcp-server.js +75 -0
  79. package/backend/dist/extensions/demo-mcp-server.js.map +1 -0
  80. package/backend/dist/extensions/importer.js +828 -0
  81. package/backend/dist/extensions/importer.js.map +1 -0
  82. package/backend/dist/extensions/manager.js +1154 -0
  83. package/backend/dist/extensions/manager.js.map +1 -0
  84. package/backend/dist/lib/catalog.js +30 -0
  85. package/backend/dist/lib/catalog.js.map +1 -0
  86. package/backend/dist/lib/context.js +59 -0
  87. package/backend/dist/lib/context.js.map +1 -0
  88. package/backend/dist/lib/errors.js +75 -0
  89. package/backend/dist/lib/errors.js.map +1 -0
  90. package/backend/dist/lib/provider-store.js +116 -0
  91. package/backend/dist/lib/provider-store.js.map +1 -0
  92. package/backend/dist/lib/redact.js +11 -0
  93. package/backend/dist/lib/redact.js.map +1 -0
  94. package/backend/dist/lib/runtime-store.js +28 -0
  95. package/backend/dist/lib/runtime-store.js.map +1 -0
  96. package/backend/dist/lib/sqlite-store.js +218 -0
  97. package/backend/dist/lib/sqlite-store.js.map +1 -0
  98. package/backend/dist/lib/sse.js +46 -0
  99. package/backend/dist/lib/sse.js.map +1 -0
  100. package/backend/dist/lib/ssrf.js +131 -0
  101. package/backend/dist/lib/ssrf.js.map +1 -0
  102. package/backend/dist/lib/store.js +84 -0
  103. package/backend/dist/lib/store.js.map +1 -0
  104. package/backend/dist/lib/usage.js +219 -0
  105. package/backend/dist/lib/usage.js.map +1 -0
  106. package/backend/dist/lib/util.js +38 -0
  107. package/backend/dist/lib/util.js.map +1 -0
  108. package/backend/dist/lib/workspace-store.js +152 -0
  109. package/backend/dist/lib/workspace-store.js.map +1 -0
  110. package/backend/dist/mcp.js +429 -0
  111. package/backend/dist/mcp.js.map +1 -0
  112. package/backend/dist/routes/agents.js +51 -0
  113. package/backend/dist/routes/agents.js.map +1 -0
  114. package/backend/dist/routes/assistants.js +32 -0
  115. package/backend/dist/routes/assistants.js.map +1 -0
  116. package/backend/dist/routes/chat.js +697 -0
  117. package/backend/dist/routes/chat.js.map +1 -0
  118. package/backend/dist/routes/control-plane.js +200 -0
  119. package/backend/dist/routes/control-plane.js.map +1 -0
  120. package/backend/dist/routes/conversations.js +66 -0
  121. package/backend/dist/routes/conversations.js.map +1 -0
  122. package/backend/dist/routes/extensions-import.js +22 -0
  123. package/backend/dist/routes/extensions-import.js.map +1 -0
  124. package/backend/dist/routes/import.js +85 -0
  125. package/backend/dist/routes/import.js.map +1 -0
  126. package/backend/dist/routes/mcp-servers.js +56 -0
  127. package/backend/dist/routes/mcp-servers.js.map +1 -0
  128. package/backend/dist/routes/meta.js +37 -0
  129. package/backend/dist/routes/meta.js.map +1 -0
  130. package/backend/dist/routes/mock.js +28 -0
  131. package/backend/dist/routes/mock.js.map +1 -0
  132. package/backend/dist/routes/plugins.js +41 -0
  133. package/backend/dist/routes/plugins.js.map +1 -0
  134. package/backend/dist/routes/providers.js +197 -0
  135. package/backend/dist/routes/providers.js.map +1 -0
  136. package/backend/dist/routes/runs.js +57 -0
  137. package/backend/dist/routes/runs.js.map +1 -0
  138. package/backend/dist/routes/skills.js +73 -0
  139. package/backend/dist/routes/skills.js.map +1 -0
  140. package/backend/dist/routes/tools.js +40 -0
  141. package/backend/dist/routes/tools.js.map +1 -0
  142. package/backend/dist/routes/usage.js +14 -0
  143. package/backend/dist/routes/usage.js.map +1 -0
  144. package/backend/dist/routes/workspaces.js +158 -0
  145. package/backend/dist/routes/workspaces.js.map +1 -0
  146. package/backend/dist/runtime/agent.js +518 -0
  147. package/backend/dist/runtime/agent.js.map +1 -0
  148. package/backend/dist/server.js +103 -0
  149. package/backend/dist/server.js.map +1 -0
  150. package/backend/dist/types.js +3 -0
  151. package/backend/dist/types.js.map +1 -0
  152. package/backend/extensions/demo-mcp-server.js +70 -0
  153. package/backend/extensions/importer.ts +709 -0
  154. package/backend/extensions/manager.ts +1055 -0
  155. package/backend/lib/catalog.ts +28 -0
  156. package/backend/lib/context.ts +61 -0
  157. package/backend/lib/errors.ts +78 -0
  158. package/backend/lib/provider-store.ts +116 -0
  159. package/backend/lib/redact.ts +9 -0
  160. package/backend/lib/runtime-store.ts +38 -0
  161. package/backend/lib/sqlite-store.ts +220 -0
  162. package/backend/lib/sse.ts +42 -0
  163. package/backend/lib/ssrf.ts +120 -0
  164. package/backend/lib/store.ts +79 -0
  165. package/backend/lib/usage.ts +212 -0
  166. package/backend/lib/util.ts +31 -0
  167. package/backend/lib/workspace-store.ts +150 -0
  168. package/backend/mcp.ts +417 -0
  169. package/backend/package.json +34 -0
  170. package/backend/prompts.json +82 -0
  171. package/backend/routes/agents.ts +55 -0
  172. package/backend/routes/assistants.ts +30 -0
  173. package/backend/routes/chat.ts +660 -0
  174. package/backend/routes/control-plane.ts +165 -0
  175. package/backend/routes/conversations.ts +62 -0
  176. package/backend/routes/extensions-import.ts +15 -0
  177. package/backend/routes/import.ts +72 -0
  178. package/backend/routes/mcp-servers.ts +36 -0
  179. package/backend/routes/meta.ts +38 -0
  180. package/backend/routes/mock.ts +25 -0
  181. package/backend/routes/plugins.ts +27 -0
  182. package/backend/routes/providers.ts +166 -0
  183. package/backend/routes/runs.ts +55 -0
  184. package/backend/routes/skills.ts +52 -0
  185. package/backend/routes/tools.ts +40 -0
  186. package/backend/routes/usage.ts +13 -0
  187. package/backend/routes/workspaces.ts +124 -0
  188. package/backend/runtime/agent.ts +474 -0
  189. package/backend/server.ts +106 -0
  190. package/backend/types.ts +126 -0
  191. package/bin/multichat.mjs +535 -0
  192. package/frontend/dist/assets/agentPicker-C39VzmYa.js +13 -0
  193. package/frontend/dist/assets/compare-BpaGD32J.js +1 -0
  194. package/frontend/dist/assets/conversations-COuLmg99.js +7 -0
  195. package/frontend/dist/assets/data-ZH7Dux1K.js +1 -0
  196. package/frontend/dist/assets/extensionImport-CnTWKtWm.js +28 -0
  197. package/frontend/dist/assets/importExport-B3mB-9zs.js +70 -0
  198. package/frontend/dist/assets/index-CASVCOUO.js +34 -0
  199. package/frontend/dist/assets/index-DSvbjNLc.css +1 -0
  200. package/frontend/dist/assets/init-ZPK483vB.js +1 -0
  201. package/frontend/dist/assets/jsx-runtime-ZSsbr0oW.js +9 -0
  202. package/frontend/dist/assets/modal-CgHocv3n.js +2 -0
  203. package/frontend/dist/assets/modelPicker-EUmmVnbj.js +14 -0
  204. package/frontend/dist/assets/pluginsUI-B6jGUQkx.js +16 -0
  205. package/frontend/dist/assets/render-DgAg1K8A.js +1 -0
  206. package/frontend/dist/assets/send-BJhZ_5YA.js +14 -0
  207. package/frontend/dist/assets/settings-DdnYwZl-.js +2 -0
  208. package/frontend/dist/assets/shell-DFV2khQl.js +1 -0
  209. package/frontend/dist/assets/workbench-BY2J4vWC.js +41 -0
  210. package/frontend/dist/icon-maskable.svg +4 -0
  211. package/frontend/dist/icon.svg +4 -0
  212. package/frontend/dist/index.html +21 -0
  213. package/frontend/dist/manifest.webmanifest +26 -0
  214. package/package.json +58 -0
@@ -0,0 +1,103 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // ── MultiChat Agent Workspace · 应用装配入口 ───────────────────────────
4
+ // 本文件只负责:加载共享上下文、注册中间件、挂载各路由模块、托管前端静态资源、
5
+ // 注册全局错误处理、执行数据种子、监听端口。具体业务逻辑已拆分到:
6
+ // routes/ —— 各 REST 端点(providers / conversations / workspaces /
7
+ // assistants / runs / skills / agents / plugins / import / chat / meta)
8
+ // runtime/ —— Agent 运行时核心(技能 / 智能体 / 运行)
9
+ // extensions/—— 标准 Skills、MCP servers 与插件来源注册表
10
+ // lib/ —— 存储、SSRF、catalog、workspace-store、统一错误码、共享上下文
11
+ const express = require('express');
12
+ const cors = require('cors');
13
+ const path = require('path');
14
+ const crypto = require('crypto');
15
+ const ctx = require('./lib/context');
16
+ const { requestIdMiddleware, errorHandler } = require('./lib/errors');
17
+ const runtime = require('./runtime/agent');
18
+ const app = express();
19
+ const PORT = ctx.PORT;
20
+ const HOST = process.env.HOST || '127.0.0.1';
21
+ // ── 基础中间件 ──
22
+ const corsOrigins = String(process.env.CORS_ORIGINS || '').split(',').map(value => value.trim()).filter(Boolean);
23
+ if (corsOrigins.length)
24
+ app.use(cors({ origin: corsOrigins, credentials: false }));
25
+ // Extension packages are transported as Base64 JSON so the API stays usable
26
+ // behind the same reverse proxies as the rest of MultiChat. The importer
27
+ // applies a stricter 20 MB compressed / 80 MB unpacked limit of its own.
28
+ app.use(express.json({ limit: '32mb' }));
29
+ const apiToken = String(process.env.MULTICHAT_API_TOKEN || process.env.MC_API_TOKEN || '');
30
+ const basicAuth = String(process.env.MULTICHAT_BASIC_AUTH || '');
31
+ function equalSecret(actual, expected) {
32
+ const left = Buffer.from(String(actual || ''));
33
+ const right = Buffer.from(String(expected || ''));
34
+ return left.length === right.length && crypto.timingSafeEqual(left, right);
35
+ }
36
+ app.use((req, res, next) => {
37
+ if ((!apiToken && !basicAuth) || (!req.path.startsWith('/api/') && !req.path.startsWith('/v1/')) || req.path === '/api/health')
38
+ return next();
39
+ const authorization = String(req.headers.authorization || '');
40
+ const bearerOk = apiToken && authorization.startsWith('Bearer ') && equalSecret(authorization.slice(7), apiToken);
41
+ const basicOk = basicAuth && authorization.startsWith('Basic ') && equalSecret(Buffer.from(authorization.slice(6), 'base64').toString('utf8'), basicAuth);
42
+ if (bearerOk || basicOk)
43
+ return next();
44
+ res.setHeader('WWW-Authenticate', 'Bearer realm="MultiChat"');
45
+ return res.status(401).json({ error: { message: 'MultiChat access token required' }, code: 'AUTH_REQUIRED' });
46
+ });
47
+ app.use((req, res, next) => {
48
+ res.setHeader('X-Content-Type-Options', 'nosniff');
49
+ res.setHeader('X-Frame-Options', 'DENY');
50
+ res.setHeader('Referrer-Policy', 'no-referrer');
51
+ res.setHeader('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
52
+ res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
53
+ res.setHeader('Content-Security-Policy', "default-src 'self'; base-uri 'none'; object-src 'none'; frame-ancestors 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'self' http://127.0.0.1:* http://localhost:*");
54
+ if (req.path.startsWith('/api/') || req.path.startsWith('/v1/'))
55
+ res.setHeader('Cache-Control', 'no-store');
56
+ next();
57
+ });
58
+ // 统一请求ID:每个请求分配 id 并写入响应头 X-Request-Id(A3)
59
+ app.use(requestIdMiddleware);
60
+ // ── 路由注册 ──
61
+ require('./routes/providers')(app);
62
+ require('./routes/conversations')(app);
63
+ require('./routes/workspaces')(app);
64
+ require('./routes/assistants')(app);
65
+ require('./routes/runs')(app);
66
+ require('./routes/usage')(app);
67
+ require('./routes/control-plane')(app);
68
+ require('./routes/skills')(app);
69
+ require('./routes/tools')(app);
70
+ require('./routes/mcp-servers')(app);
71
+ require('./routes/agents')(app);
72
+ require('./routes/plugins')(app);
73
+ require('./routes/extensions-import')(app);
74
+ require('./routes/import')(app);
75
+ require('./routes/mock')(app);
76
+ require('./routes/chat')(app);
77
+ require('./routes/meta')(app);
78
+ // ── 前端静态资源(生产构建件) ──
79
+ // 默认按源码布局取 ../frontend/dist;CLI 或打包运行时可通过 FRONTEND_DIST 覆盖。
80
+ const frontendDist = process.env.FRONTEND_DIST || path.join(ctx.BACKEND_ROOT, '..', 'frontend', 'dist');
81
+ app.use(express.static(frontendDist));
82
+ // ── 全局错误处理(兜底未捕获异常,统一输出 { error, code, requestId })──
83
+ app.use(errorHandler);
84
+ // ── 启动 ──
85
+ runtime.ensureSeed();
86
+ require('./extensions/manager').ensureDefaults();
87
+ const server = app.listen(PORT, HOST, () => {
88
+ console.log(`Multi-model chat server running on http://${HOST}:${PORT}`);
89
+ console.log(`OpenAI-compatible endpoint: POST /v1/chat/completions`);
90
+ console.log(`Agent endpoint: POST /api/agents/:id/chat`);
91
+ });
92
+ function shutdown(signal) {
93
+ console.log(`${signal}: closing MCP clients and HTTP server`);
94
+ ctx.closeAllMcpClients();
95
+ server.close(() => {
96
+ ctx.store.close?.();
97
+ process.exit(0);
98
+ });
99
+ setTimeout(() => process.exit(1), 5000).unref();
100
+ }
101
+ process.once('SIGINT', () => shutdown('SIGINT'));
102
+ process.once('SIGTERM', () => shutdown('SIGTERM'));
103
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ // Dependency-free MCP STDIO fixture used by the default project setup and
4
+ // interoperability tests. Each JSON-RPC message occupies exactly one line.
5
+ const readline = require('readline');
6
+
7
+ const tools = [
8
+ {
9
+ name: 'get_current_time',
10
+ description: '返回 UTC 时间、本地时间和当前时区。',
11
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
12
+ annotations: { readOnlyHint: true },
13
+ },
14
+ {
15
+ name: 'get_project_summary',
16
+ description: '返回当前 MultiChat 项目的运行目录与 Node.js 版本。',
17
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
18
+ annotations: { readOnlyHint: true },
19
+ },
20
+ ];
21
+
22
+ function send(message) { process.stdout.write(JSON.stringify(message) + '\n'); }
23
+
24
+ async function handle(message) {
25
+ if (!message || message.jsonrpc !== '2.0') return;
26
+ if (message.id === undefined || message.id === null) return;
27
+ if (message.method === 'initialize') {
28
+ return send({
29
+ jsonrpc: '2.0',
30
+ id: message.id,
31
+ result: {
32
+ protocolVersion: '2025-06-18',
33
+ capabilities: { tools: { listChanged: false } },
34
+ serverInfo: { name: 'multichat-demo', version: '1.0.0' },
35
+ instructions: 'These tools are read-only and intended for local interoperability checks.',
36
+ },
37
+ });
38
+ }
39
+ if (message.method === 'tools/list') {
40
+ return send({ jsonrpc: '2.0', id: message.id, result: { tools } });
41
+ }
42
+ if (message.method === 'tools/call') {
43
+ const name = message.params?.name;
44
+ let data;
45
+ if (name === 'get_current_time') {
46
+ data = { utc: new Date().toISOString(), local: new Date().toString(), timezone: Intl.DateTimeFormat().resolvedOptions().timeZone };
47
+ } else if (name === 'get_project_summary') {
48
+ data = { cwd: process.cwd(), node: process.version, platform: process.platform };
49
+ } else {
50
+ return send({ jsonrpc: '2.0', id: message.id, error: { code: -32602, message: `Unknown tool: ${name}` } });
51
+ }
52
+ return send({
53
+ jsonrpc: '2.0',
54
+ id: message.id,
55
+ result: {
56
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
57
+ structuredContent: data,
58
+ isError: false,
59
+ },
60
+ });
61
+ }
62
+ send({ jsonrpc: '2.0', id: message.id, error: { code: -32601, message: 'Method not found' } });
63
+ }
64
+
65
+ const lines = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });
66
+ lines.on('line', line => {
67
+ if (!line.trim()) return;
68
+ try { void handle(JSON.parse(line)); }
69
+ catch (error) { console.error(error.message); }
70
+ });