@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.
- package/.agents/plugins/marketplace.json +32 -0
- package/.agents/plugins/plugins/developer-toolkit/.codex-plugin/plugin.json +24 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/code-review/SKILL.md +9 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/code-review/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/release-notes/SKILL.md +9 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/release-notes/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/security-review/SKILL.md +9 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/security-review/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/test-plan/SKILL.md +9 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/test-plan/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/writing-toolkit/.codex-plugin/plugin.json +24 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/meeting-notes/SKILL.md +9 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/meeting-notes/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/resume-tune/SKILL.md +9 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/resume-tune/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/weekly-report/SKILL.md +9 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/weekly-report/agents/openai.yaml +3 -0
- package/.agents/skills/.gitkeep +1 -0
- package/.agents/skills/wanghong-handwritten-ppt/SKILL.md +172 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/HTML-PPT-LICENSE +21 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/NEAT-ANNOTATIONS-LICENSE +21 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/animations.css +138 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/base.css +150 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/deepseek-example.css +893 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/neat-annotations.css +152 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/preview-cover.png +0 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/preview-diagram.png +0 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/preview-summary.png +0 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/preview-table.png +0 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/runtime.js +960 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/template.css +198 -0
- package/.agents/skills/wanghong-handwritten-ppt/evals/evals.json +20 -0
- package/.agents/skills/wanghong-handwritten-ppt/examples/deepseek-v4-flash/index.html +414 -0
- package/.agents/skills/wanghong-handwritten-ppt/examples/deepseek-v4-flash/style.css +897 -0
- package/.agents/skills/wanghong-handwritten-ppt/references/prompts.md +170 -0
- package/.agents/skills/wanghong-handwritten-ppt/references/style-guide.md +133 -0
- package/.agents/skills/wanghong-handwritten-ppt/scripts/check_deck.py +41 -0
- package/.agents/skills/wanghong-handwritten-ppt/scripts/prepare_render_html.py +137 -0
- package/.agents/skills/wanghong-handwritten-ppt/scripts/render.sh +110 -0
- package/.agents/skills/wanghong-handwritten-ppt/templates/deck.html +94 -0
- package/.agents/skills/wanghong-handwritten-ppt/tests/test_font_contract.py +73 -0
- package/LICENSE +21 -0
- package/README.md +186 -0
- package/backend/adapters/README.md +77 -0
- package/backend/adapters/anthropic.ts +115 -0
- package/backend/adapters/base.ts +47 -0
- package/backend/adapters/index.ts +41 -0
- package/backend/adapters/lmstudio.ts +7 -0
- package/backend/adapters/moonshot.ts +7 -0
- package/backend/adapters/ollama.ts +7 -0
- package/backend/adapters/openai-compatible.ts +51 -0
- package/backend/adapters/openai.ts +7 -0
- package/backend/adapters/qwen.ts +112 -0
- package/backend/adapters/wenxin.ts +136 -0
- package/backend/adapters/zhipu.ts +93 -0
- package/backend/dist/adapters/anthropic.js +130 -0
- package/backend/dist/adapters/anthropic.js.map +1 -0
- package/backend/dist/adapters/base.js +38 -0
- package/backend/dist/adapters/base.js.map +1 -0
- package/backend/dist/adapters/index.js +39 -0
- package/backend/dist/adapters/index.js.map +1 -0
- package/backend/dist/adapters/lmstudio.js +8 -0
- package/backend/dist/adapters/lmstudio.js.map +1 -0
- package/backend/dist/adapters/moonshot.js +8 -0
- package/backend/dist/adapters/moonshot.js.map +1 -0
- package/backend/dist/adapters/ollama.js +8 -0
- package/backend/dist/adapters/ollama.js.map +1 -0
- package/backend/dist/adapters/openai-compatible.js +47 -0
- package/backend/dist/adapters/openai-compatible.js.map +1 -0
- package/backend/dist/adapters/openai.js +8 -0
- package/backend/dist/adapters/openai.js.map +1 -0
- package/backend/dist/adapters/qwen.js +103 -0
- package/backend/dist/adapters/qwen.js.map +1 -0
- package/backend/dist/adapters/wenxin.js +114 -0
- package/backend/dist/adapters/wenxin.js.map +1 -0
- package/backend/dist/adapters/zhipu.js +86 -0
- package/backend/dist/adapters/zhipu.js.map +1 -0
- package/backend/dist/extensions/demo-mcp-server.js +75 -0
- package/backend/dist/extensions/demo-mcp-server.js.map +1 -0
- package/backend/dist/extensions/importer.js +828 -0
- package/backend/dist/extensions/importer.js.map +1 -0
- package/backend/dist/extensions/manager.js +1154 -0
- package/backend/dist/extensions/manager.js.map +1 -0
- package/backend/dist/lib/catalog.js +30 -0
- package/backend/dist/lib/catalog.js.map +1 -0
- package/backend/dist/lib/context.js +59 -0
- package/backend/dist/lib/context.js.map +1 -0
- package/backend/dist/lib/errors.js +75 -0
- package/backend/dist/lib/errors.js.map +1 -0
- package/backend/dist/lib/provider-store.js +116 -0
- package/backend/dist/lib/provider-store.js.map +1 -0
- package/backend/dist/lib/redact.js +11 -0
- package/backend/dist/lib/redact.js.map +1 -0
- package/backend/dist/lib/runtime-store.js +28 -0
- package/backend/dist/lib/runtime-store.js.map +1 -0
- package/backend/dist/lib/sqlite-store.js +218 -0
- package/backend/dist/lib/sqlite-store.js.map +1 -0
- package/backend/dist/lib/sse.js +46 -0
- package/backend/dist/lib/sse.js.map +1 -0
- package/backend/dist/lib/ssrf.js +131 -0
- package/backend/dist/lib/ssrf.js.map +1 -0
- package/backend/dist/lib/store.js +84 -0
- package/backend/dist/lib/store.js.map +1 -0
- package/backend/dist/lib/usage.js +219 -0
- package/backend/dist/lib/usage.js.map +1 -0
- package/backend/dist/lib/util.js +38 -0
- package/backend/dist/lib/util.js.map +1 -0
- package/backend/dist/lib/workspace-store.js +152 -0
- package/backend/dist/lib/workspace-store.js.map +1 -0
- package/backend/dist/mcp.js +429 -0
- package/backend/dist/mcp.js.map +1 -0
- package/backend/dist/routes/agents.js +51 -0
- package/backend/dist/routes/agents.js.map +1 -0
- package/backend/dist/routes/assistants.js +32 -0
- package/backend/dist/routes/assistants.js.map +1 -0
- package/backend/dist/routes/chat.js +697 -0
- package/backend/dist/routes/chat.js.map +1 -0
- package/backend/dist/routes/control-plane.js +200 -0
- package/backend/dist/routes/control-plane.js.map +1 -0
- package/backend/dist/routes/conversations.js +66 -0
- package/backend/dist/routes/conversations.js.map +1 -0
- package/backend/dist/routes/extensions-import.js +22 -0
- package/backend/dist/routes/extensions-import.js.map +1 -0
- package/backend/dist/routes/import.js +85 -0
- package/backend/dist/routes/import.js.map +1 -0
- package/backend/dist/routes/mcp-servers.js +56 -0
- package/backend/dist/routes/mcp-servers.js.map +1 -0
- package/backend/dist/routes/meta.js +37 -0
- package/backend/dist/routes/meta.js.map +1 -0
- package/backend/dist/routes/mock.js +28 -0
- package/backend/dist/routes/mock.js.map +1 -0
- package/backend/dist/routes/plugins.js +41 -0
- package/backend/dist/routes/plugins.js.map +1 -0
- package/backend/dist/routes/providers.js +197 -0
- package/backend/dist/routes/providers.js.map +1 -0
- package/backend/dist/routes/runs.js +57 -0
- package/backend/dist/routes/runs.js.map +1 -0
- package/backend/dist/routes/skills.js +73 -0
- package/backend/dist/routes/skills.js.map +1 -0
- package/backend/dist/routes/tools.js +40 -0
- package/backend/dist/routes/tools.js.map +1 -0
- package/backend/dist/routes/usage.js +14 -0
- package/backend/dist/routes/usage.js.map +1 -0
- package/backend/dist/routes/workspaces.js +158 -0
- package/backend/dist/routes/workspaces.js.map +1 -0
- package/backend/dist/runtime/agent.js +518 -0
- package/backend/dist/runtime/agent.js.map +1 -0
- package/backend/dist/server.js +103 -0
- package/backend/dist/server.js.map +1 -0
- package/backend/dist/types.js +3 -0
- package/backend/dist/types.js.map +1 -0
- package/backend/extensions/demo-mcp-server.js +70 -0
- package/backend/extensions/importer.ts +709 -0
- package/backend/extensions/manager.ts +1055 -0
- package/backend/lib/catalog.ts +28 -0
- package/backend/lib/context.ts +61 -0
- package/backend/lib/errors.ts +78 -0
- package/backend/lib/provider-store.ts +116 -0
- package/backend/lib/redact.ts +9 -0
- package/backend/lib/runtime-store.ts +38 -0
- package/backend/lib/sqlite-store.ts +220 -0
- package/backend/lib/sse.ts +42 -0
- package/backend/lib/ssrf.ts +120 -0
- package/backend/lib/store.ts +79 -0
- package/backend/lib/usage.ts +212 -0
- package/backend/lib/util.ts +31 -0
- package/backend/lib/workspace-store.ts +150 -0
- package/backend/mcp.ts +417 -0
- package/backend/package.json +34 -0
- package/backend/prompts.json +82 -0
- package/backend/routes/agents.ts +55 -0
- package/backend/routes/assistants.ts +30 -0
- package/backend/routes/chat.ts +660 -0
- package/backend/routes/control-plane.ts +165 -0
- package/backend/routes/conversations.ts +62 -0
- package/backend/routes/extensions-import.ts +15 -0
- package/backend/routes/import.ts +72 -0
- package/backend/routes/mcp-servers.ts +36 -0
- package/backend/routes/meta.ts +38 -0
- package/backend/routes/mock.ts +25 -0
- package/backend/routes/plugins.ts +27 -0
- package/backend/routes/providers.ts +166 -0
- package/backend/routes/runs.ts +55 -0
- package/backend/routes/skills.ts +52 -0
- package/backend/routes/tools.ts +40 -0
- package/backend/routes/usage.ts +13 -0
- package/backend/routes/workspaces.ts +124 -0
- package/backend/runtime/agent.ts +474 -0
- package/backend/server.ts +106 -0
- package/backend/types.ts +126 -0
- package/bin/multichat.mjs +535 -0
- package/frontend/dist/assets/agentPicker-C39VzmYa.js +13 -0
- package/frontend/dist/assets/compare-BpaGD32J.js +1 -0
- package/frontend/dist/assets/conversations-COuLmg99.js +7 -0
- package/frontend/dist/assets/data-ZH7Dux1K.js +1 -0
- package/frontend/dist/assets/extensionImport-CnTWKtWm.js +28 -0
- package/frontend/dist/assets/importExport-B3mB-9zs.js +70 -0
- package/frontend/dist/assets/index-CASVCOUO.js +34 -0
- package/frontend/dist/assets/index-DSvbjNLc.css +1 -0
- package/frontend/dist/assets/init-ZPK483vB.js +1 -0
- package/frontend/dist/assets/jsx-runtime-ZSsbr0oW.js +9 -0
- package/frontend/dist/assets/modal-CgHocv3n.js +2 -0
- package/frontend/dist/assets/modelPicker-EUmmVnbj.js +14 -0
- package/frontend/dist/assets/pluginsUI-B6jGUQkx.js +16 -0
- package/frontend/dist/assets/render-DgAg1K8A.js +1 -0
- package/frontend/dist/assets/send-BJhZ_5YA.js +14 -0
- package/frontend/dist/assets/settings-DdnYwZl-.js +2 -0
- package/frontend/dist/assets/shell-DFV2khQl.js +1 -0
- package/frontend/dist/assets/workbench-BY2J4vWC.js +41 -0
- package/frontend/dist/icon-maskable.svg +4 -0
- package/frontend/dist/icon.svg +4 -0
- package/frontend/dist/index.html +21 -0
- package/frontend/dist/manifest.webmanifest +26 -0
- 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 @@
|
|
|
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
|
+
});
|