proxy-api-mcp 1.0.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/.env.example +57 -0
- package/README.md +443 -0
- package/api-tools.json.example +226 -0
- package/dist/examples/env-in-json-usage.d.ts +43 -0
- package/dist/examples/env-in-json-usage.d.ts.map +1 -0
- package/dist/examples/env-in-json-usage.js +242 -0
- package/dist/examples/env-in-json-usage.js.map +1 -0
- package/dist/examples/env-usage.d.ts +7 -0
- package/dist/examples/env-usage.d.ts.map +1 -0
- package/dist/examples/env-usage.js +108 -0
- package/dist/examples/env-usage.js.map +1 -0
- package/dist/examples/preprocessor-usage.d.ts +14 -0
- package/dist/examples/preprocessor-usage.d.ts.map +1 -0
- package/dist/examples/preprocessor-usage.js +196 -0
- package/dist/examples/preprocessor-usage.js.map +1 -0
- package/dist/src/config/env.d.ts +97 -0
- package/dist/src/config/env.d.ts.map +1 -0
- package/dist/src/config/env.js +228 -0
- package/dist/src/config/env.js.map +1 -0
- package/dist/src/core/registry.d.ts +59 -0
- package/dist/src/core/registry.d.ts.map +1 -0
- package/dist/src/core/registry.js +126 -0
- package/dist/src/core/registry.js.map +1 -0
- package/dist/src/core/router.d.ts +34 -0
- package/dist/src/core/router.d.ts.map +1 -0
- package/dist/src/core/router.js +108 -0
- package/dist/src/core/router.js.map +1 -0
- package/dist/src/core/server.d.ts +55 -0
- package/dist/src/core/server.d.ts.map +1 -0
- package/dist/src/core/server.js +159 -0
- package/dist/src/core/server.js.map +1 -0
- package/dist/src/core/session.d.ts +70 -0
- package/dist/src/core/session.d.ts.map +1 -0
- package/dist/src/core/session.js +171 -0
- package/dist/src/core/session.js.map +1 -0
- package/dist/src/core/transports/http.d.ts +16 -0
- package/dist/src/core/transports/http.d.ts.map +1 -0
- package/dist/src/core/transports/http.js +169 -0
- package/dist/src/core/transports/http.js.map +1 -0
- package/dist/src/core/transports/stdio.d.ts +9 -0
- package/dist/src/core/transports/stdio.d.ts.map +1 -0
- package/dist/src/core/transports/stdio.js +32 -0
- package/dist/src/core/transports/stdio.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +22 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/server.d.ts +6 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +121 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/tools/api/builder.d.ts +34 -0
- package/dist/src/tools/api/builder.d.ts.map +1 -0
- package/dist/src/tools/api/builder.js +196 -0
- package/dist/src/tools/api/builder.js.map +1 -0
- package/dist/src/tools/api/executor.d.ts +57 -0
- package/dist/src/tools/api/executor.d.ts.map +1 -0
- package/dist/src/tools/api/executor.js +317 -0
- package/dist/src/tools/api/executor.js.map +1 -0
- package/dist/src/tools/api/index.d.ts +12 -0
- package/dist/src/tools/api/index.d.ts.map +1 -0
- package/dist/src/tools/api/index.js +12 -0
- package/dist/src/tools/api/index.js.map +1 -0
- package/dist/src/tools/api/json/kingdee/kingdee_caiwukuaiji_chunaguanli.json +879 -0
- package/dist/src/tools/api/json/kingdee/kingdee_caiwukuaiji_yingfukuanguanli.json +1673 -0
- package/dist/src/tools/api/json/kingdee/kingdee_caiwukuaiji_yingshoukuanguanli.json +1081 -0
- package/dist/src/tools/api/json/kingdee/kingdee_caiwukuaiji_zongzhang.json +976 -0
- package/dist/src/tools/api/json/kingdee/kingdee_chengbenguanli_biaozhunchengbenfenxi.json +1 -0
- package/dist/src/tools/api/json/kingdee/kingdee_chengbenguanli_chanpinchengbenhesuan.json +1 -0
- package/dist/src/tools/api/json/kingdee/kingdee_chengbenguanli_cunhuohesuan.json +1858 -0
- package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_caigouguanli.json +1 -0
- package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_gongyingshangguanli.json +616 -0
- package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_kucunguanli.json +858 -0
- package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_xiaoshouguanli.json +858 -0
- package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_zuzhijianjiesuan.json +858 -0
- package/dist/src/tools/api/json/kingdee/kingdee_jichuguanli_jichuziliao.json +867 -0
- package/dist/src/tools/api/json/kingdee/kingdee_jichuguanli_xiaoxipingtai.json +374 -0
- package/dist/src/tools/api/json/kingdee/kingdee_shengchanzhizao_chejianguanli.json +923 -0
- package/dist/src/tools/api/json/kingdee/kingdee_shengchanzhizao_gongchengshujuguanli.json +923 -0
- package/dist/src/tools/api/json/kingdee/kingdee_shengchanzhizao_shengchanguanli.json +858 -0
- package/dist/src/tools/api/json/kingdee/kingdee_shuiwuguanli_fapiaoguanli.json +1081 -0
- package/dist/src/tools/api/json/kingdee/kingdee_yuangongfuwu_renrenbaoxiao.json +858 -0
- package/dist/src/tools/api/json/kingdee/kingdee_zichanguanli_gudingzichan.json +1 -0
- package/dist/src/tools/api/json-config-loader.d.ts +28 -0
- package/dist/src/tools/api/json-config-loader.d.ts.map +1 -0
- package/dist/src/tools/api/json-config-loader.js +123 -0
- package/dist/src/tools/api/json-config-loader.js.map +1 -0
- package/dist/src/tools/api/json-config-mapping.d.ts +41 -0
- package/dist/src/tools/api/json-config-mapping.d.ts.map +1 -0
- package/dist/src/tools/api/json-config-mapping.js +138 -0
- package/dist/src/tools/api/json-config-mapping.js.map +1 -0
- package/dist/src/tools/api/loader.d.ts +38 -0
- package/dist/src/tools/api/loader.d.ts.map +1 -0
- package/dist/src/tools/api/loader.js +240 -0
- package/dist/src/tools/api/loader.js.map +1 -0
- package/dist/src/tools/api/preprocessor.d.ts +39 -0
- package/dist/src/tools/api/preprocessor.d.ts.map +1 -0
- package/dist/src/tools/api/preprocessor.js +64 -0
- package/dist/src/tools/api/preprocessor.js.map +1 -0
- package/dist/src/tools/api/preprocessors/example.d.ts +59 -0
- package/dist/src/tools/api/preprocessors/example.d.ts.map +1 -0
- package/dist/src/tools/api/preprocessors/example.js +133 -0
- package/dist/src/tools/api/preprocessors/example.js.map +1 -0
- package/dist/src/tools/api/preprocessors/index.d.ts +10 -0
- package/dist/src/tools/api/preprocessors/index.d.ts.map +1 -0
- package/dist/src/tools/api/preprocessors/index.js +29 -0
- package/dist/src/tools/api/preprocessors/index.js.map +1 -0
- package/dist/src/tools/api/preprocessors/kingdee.d.ts +24 -0
- package/dist/src/tools/api/preprocessors/kingdee.d.ts.map +1 -0
- package/dist/src/tools/api/preprocessors/kingdee.js +149 -0
- package/dist/src/tools/api/preprocessors/kingdee.js.map +1 -0
- package/dist/src/tools/api/types.d.ts +174 -0
- package/dist/src/tools/api/types.d.ts.map +1 -0
- package/dist/src/tools/api/types.js +5 -0
- package/dist/src/tools/api/types.js.map +1 -0
- package/dist/src/tools/examples/echo.d.ts +6 -0
- package/dist/src/tools/examples/echo.d.ts.map +1 -0
- package/dist/src/tools/examples/echo.js +61 -0
- package/dist/src/tools/examples/echo.js.map +1 -0
- package/dist/src/tools/types.d.ts +104 -0
- package/dist/src/tools/types.d.ts.map +1 -0
- package/dist/src/tools/types.js +15 -0
- package/dist/src/tools/types.js.map +1 -0
- package/dist/src/tools/validator.d.ts +27 -0
- package/dist/src/tools/validator.d.ts.map +1 -0
- package/dist/src/tools/validator.js +133 -0
- package/dist/src/tools/validator.js.map +1 -0
- package/dist/src/utils/cache.d.ts +14 -0
- package/dist/src/utils/cache.d.ts.map +1 -0
- package/dist/src/utils/cache.js +42 -0
- package/dist/src/utils/cache.js.map +1 -0
- package/dist/src/utils/env-replacer.d.ts +86 -0
- package/dist/src/utils/env-replacer.d.ts.map +1 -0
- package/dist/src/utils/env-replacer.js +196 -0
- package/dist/src/utils/env-replacer.js.map +1 -0
- package/dist/src/utils/errors.d.ts +102 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +164 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/logger.d.ts +77 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +155 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话管理器
|
|
3
|
+
*/
|
|
4
|
+
import { SessionStatus } from '../tools/types.js';
|
|
5
|
+
import { SessionNotFoundError, SessionTimeoutError } from '../utils/errors.js';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* 会话管理器类
|
|
9
|
+
*/
|
|
10
|
+
export class SessionManager {
|
|
11
|
+
sessions = new Map();
|
|
12
|
+
cleanupInterval = null;
|
|
13
|
+
sessionTimeout;
|
|
14
|
+
constructor(sessionTimeout = 3600000) {
|
|
15
|
+
// 默认1小时超时
|
|
16
|
+
this.sessionTimeout = sessionTimeout;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 启动会话清理定时器
|
|
20
|
+
*/
|
|
21
|
+
startCleanup(interval = 60000) {
|
|
22
|
+
// 默认每分钟检查一次
|
|
23
|
+
if (this.cleanupInterval) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.cleanupInterval = setInterval(() => {
|
|
27
|
+
this.cleanupExpiredSessions();
|
|
28
|
+
}, interval);
|
|
29
|
+
logger.info('Session cleanup started', {
|
|
30
|
+
interval,
|
|
31
|
+
timeout: this.sessionTimeout,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 停止会话清理定时器
|
|
36
|
+
*/
|
|
37
|
+
stopCleanup() {
|
|
38
|
+
if (this.cleanupInterval) {
|
|
39
|
+
clearInterval(this.cleanupInterval);
|
|
40
|
+
this.cleanupInterval = null;
|
|
41
|
+
logger.info('Session cleanup stopped');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 创建新会话
|
|
46
|
+
*/
|
|
47
|
+
create(sessionId, context = {}) {
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
const session = {
|
|
50
|
+
id: sessionId,
|
|
51
|
+
status: SessionStatus.INITIALIZED,
|
|
52
|
+
createdAt: now,
|
|
53
|
+
lastActiveAt: now,
|
|
54
|
+
context,
|
|
55
|
+
};
|
|
56
|
+
this.sessions.set(sessionId, session);
|
|
57
|
+
logger.info(`Session created: ${sessionId}`, {
|
|
58
|
+
context: Object.keys(context),
|
|
59
|
+
});
|
|
60
|
+
return session;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 获取会话
|
|
64
|
+
*/
|
|
65
|
+
get(sessionId) {
|
|
66
|
+
const session = this.sessions.get(sessionId);
|
|
67
|
+
if (!session) {
|
|
68
|
+
throw new SessionNotFoundError(sessionId);
|
|
69
|
+
}
|
|
70
|
+
// 检查会话是否超时
|
|
71
|
+
if (this.isExpired(session)) {
|
|
72
|
+
this.close(sessionId);
|
|
73
|
+
throw new SessionTimeoutError(sessionId);
|
|
74
|
+
}
|
|
75
|
+
return session;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 更新会话活跃时间
|
|
79
|
+
*/
|
|
80
|
+
touch(sessionId) {
|
|
81
|
+
const session = this.sessions.get(sessionId);
|
|
82
|
+
if (session) {
|
|
83
|
+
session.lastActiveAt = Date.now();
|
|
84
|
+
session.status = SessionStatus.ACTIVE;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 更新会话上下文
|
|
89
|
+
*/
|
|
90
|
+
updateContext(sessionId, context) {
|
|
91
|
+
const session = this.get(sessionId);
|
|
92
|
+
session.context = { ...session.context, ...context };
|
|
93
|
+
this.touch(sessionId);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 检查会话是否存在
|
|
97
|
+
*/
|
|
98
|
+
has(sessionId) {
|
|
99
|
+
return this.sessions.has(sessionId);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 检查会话是否过期
|
|
103
|
+
*/
|
|
104
|
+
isExpired(session) {
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
return now - session.lastActiveAt > this.sessionTimeout;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 关闭会话
|
|
110
|
+
*/
|
|
111
|
+
close(sessionId) {
|
|
112
|
+
const session = this.sessions.get(sessionId);
|
|
113
|
+
if (session) {
|
|
114
|
+
session.status = SessionStatus.CLOSED;
|
|
115
|
+
this.sessions.delete(sessionId);
|
|
116
|
+
logger.info(`Session closed: ${sessionId}`, {
|
|
117
|
+
duration: Date.now() - session.createdAt,
|
|
118
|
+
});
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 清理过期会话
|
|
125
|
+
*/
|
|
126
|
+
cleanupExpiredSessions() {
|
|
127
|
+
const now = Date.now();
|
|
128
|
+
let cleanedCount = 0;
|
|
129
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
130
|
+
if (this.isExpired(session)) {
|
|
131
|
+
session.status = SessionStatus.TIMEOUT;
|
|
132
|
+
this.sessions.delete(sessionId);
|
|
133
|
+
cleanedCount++;
|
|
134
|
+
logger.debug(`Session expired: ${sessionId}`, {
|
|
135
|
+
inactive: now - session.lastActiveAt,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (cleanedCount > 0) {
|
|
140
|
+
logger.info(`Cleaned up ${cleanedCount} expired sessions`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 获取所有活跃会话
|
|
145
|
+
*/
|
|
146
|
+
getActiveSessions() {
|
|
147
|
+
return Array.from(this.sessions.values()).filter(session => session.status !== SessionStatus.CLOSED);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 获取会话数量
|
|
151
|
+
*/
|
|
152
|
+
count() {
|
|
153
|
+
return this.sessions.size;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 清空所有会话
|
|
157
|
+
*/
|
|
158
|
+
clear() {
|
|
159
|
+
const count = this.sessions.size;
|
|
160
|
+
this.sessions.clear();
|
|
161
|
+
logger.info(`All sessions cleared (${count} sessions)`);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 销毁会话管理器
|
|
165
|
+
*/
|
|
166
|
+
destroy() {
|
|
167
|
+
this.stopCleanup();
|
|
168
|
+
this.clear();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP 传输层
|
|
3
|
+
*/
|
|
4
|
+
import { type McpServer } from '../server.js';
|
|
5
|
+
/**
|
|
6
|
+
* HTTP 服务器配置
|
|
7
|
+
*/
|
|
8
|
+
export interface HttpServerConfig {
|
|
9
|
+
port: number;
|
|
10
|
+
path?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 启动 Streamable HTTP 传输模式的 MCP 服务
|
|
14
|
+
*/
|
|
15
|
+
export declare function startHttpServer(mcpServer: McpServer, config: HttpServerConfig): void;
|
|
16
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/core/transports/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAmLN"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP 传输层
|
|
3
|
+
*/
|
|
4
|
+
import express from 'express';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
7
|
+
import { logger } from '../../utils/logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* 启动 Streamable HTTP 传输模式的 MCP 服务
|
|
10
|
+
*/
|
|
11
|
+
export function startHttpServer(mcpServer, config) {
|
|
12
|
+
const { port, path = '/mcp' } = config;
|
|
13
|
+
logger.info('Starting MCP Server with Streamable HTTP transport', {
|
|
14
|
+
port,
|
|
15
|
+
path,
|
|
16
|
+
});
|
|
17
|
+
const app = express();
|
|
18
|
+
app.use(express.json());
|
|
19
|
+
// 存储传输实例
|
|
20
|
+
const transports = {};
|
|
21
|
+
// 处理 POST 请求(客户端发送消息)
|
|
22
|
+
app.post(path, async (req, res) => {
|
|
23
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
24
|
+
let transport;
|
|
25
|
+
try {
|
|
26
|
+
if (sessionId && transports[sessionId]) {
|
|
27
|
+
// 复用现有会话
|
|
28
|
+
transport = transports[sessionId];
|
|
29
|
+
logger.debug(`Reusing session: ${sessionId}`);
|
|
30
|
+
}
|
|
31
|
+
else if (!sessionId && req.body.method === 'initialize') {
|
|
32
|
+
// 创建新会话
|
|
33
|
+
transport = new StreamableHTTPServerTransport({
|
|
34
|
+
sessionIdGenerator: () => randomUUID(),
|
|
35
|
+
onsessioninitialized: (id) => {
|
|
36
|
+
transports[id] = transport;
|
|
37
|
+
mcpServer.getSessionManager().create(id);
|
|
38
|
+
logger.info(`Session initialized: ${id}`);
|
|
39
|
+
},
|
|
40
|
+
onsessionclosed: (id) => {
|
|
41
|
+
delete transports[id];
|
|
42
|
+
mcpServer.getSessionManager().close(id);
|
|
43
|
+
logger.info(`Session closed: ${id}`);
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
transport.onclose = () => {
|
|
47
|
+
if (transport.sessionId) {
|
|
48
|
+
delete transports[transport.sessionId];
|
|
49
|
+
mcpServer.getSessionManager().close(transport.sessionId);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
// 连接 MCP Server
|
|
53
|
+
await mcpServer.getServer().connect(transport);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
res.status(400).json({
|
|
57
|
+
jsonrpc: '2.0',
|
|
58
|
+
error: {
|
|
59
|
+
code: -32000,
|
|
60
|
+
message: 'Invalid session or request',
|
|
61
|
+
},
|
|
62
|
+
id: null,
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// 更新会话活跃时间
|
|
67
|
+
if (transport.sessionId) {
|
|
68
|
+
mcpServer.getSessionManager().touch(transport.sessionId);
|
|
69
|
+
}
|
|
70
|
+
// 处理请求
|
|
71
|
+
await transport.handleRequest(req, res, req.body);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logger.error('Error handling POST request', {
|
|
75
|
+
error: error instanceof Error ? error.message : String(error),
|
|
76
|
+
});
|
|
77
|
+
if (!res.headersSent) {
|
|
78
|
+
res.status(500).json({
|
|
79
|
+
jsonrpc: '2.0',
|
|
80
|
+
error: {
|
|
81
|
+
code: -32603,
|
|
82
|
+
message: 'Internal error',
|
|
83
|
+
},
|
|
84
|
+
id: null,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
// 处理 GET 请求(SSE 流,用于服务端推送)
|
|
90
|
+
app.get(path, async (req, res) => {
|
|
91
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
92
|
+
const transport = transports[sessionId];
|
|
93
|
+
if (!transport) {
|
|
94
|
+
res.status(400).send('Invalid session');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
// 更新会话活跃时间
|
|
99
|
+
mcpServer.getSessionManager().touch(sessionId);
|
|
100
|
+
await transport.handleRequest(req, res);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
logger.error('Error handling GET request', {
|
|
104
|
+
error: error instanceof Error ? error.message : String(error),
|
|
105
|
+
sessionId,
|
|
106
|
+
});
|
|
107
|
+
if (!res.headersSent) {
|
|
108
|
+
res.status(500).send('Internal error');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
// 处理 DELETE 请求(关闭会话)
|
|
113
|
+
app.delete(path, async (req, res) => {
|
|
114
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
115
|
+
const transport = transports[sessionId];
|
|
116
|
+
if (!transport) {
|
|
117
|
+
res.status(400).send('Invalid session');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
await transport.handleRequest(req, res);
|
|
122
|
+
// 清理会话
|
|
123
|
+
delete transports[sessionId];
|
|
124
|
+
mcpServer.getSessionManager().close(sessionId);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
logger.error('Error handling DELETE request', {
|
|
128
|
+
error: error instanceof Error ? error.message : String(error),
|
|
129
|
+
sessionId,
|
|
130
|
+
});
|
|
131
|
+
if (!res.headersSent) {
|
|
132
|
+
res.status(500).send('Internal error');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
// 健康检查端点
|
|
137
|
+
app.get('/health', (_req, res) => {
|
|
138
|
+
res.json({
|
|
139
|
+
status: 'healthy',
|
|
140
|
+
sessions: mcpServer.getSessionManager().count(),
|
|
141
|
+
tools: mcpServer.getRegistry().count(),
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
// 启动 HTTP 服务器
|
|
145
|
+
const server = app.listen(port, () => {
|
|
146
|
+
logger.info(`HTTP server listening on port ${port}`, {
|
|
147
|
+
endpoint: `http://localhost:${port}${path}`,
|
|
148
|
+
health: `http://localhost:${port}/health`,
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
// 启动会话清理
|
|
152
|
+
mcpServer.startSessionCleanup();
|
|
153
|
+
// 处理进程退出
|
|
154
|
+
const shutdown = async () => {
|
|
155
|
+
logger.info('Shutting down HTTP server...');
|
|
156
|
+
server.close(() => {
|
|
157
|
+
logger.info('HTTP server closed');
|
|
158
|
+
});
|
|
159
|
+
await mcpServer.close();
|
|
160
|
+
process.exit(0);
|
|
161
|
+
};
|
|
162
|
+
process.on('SIGINT', () => {
|
|
163
|
+
void shutdown();
|
|
164
|
+
});
|
|
165
|
+
process.on('SIGTERM', () => {
|
|
166
|
+
void shutdown();
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../src/core/transports/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../../src/core/transports/stdio.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BvE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stdio 传输层
|
|
3
|
+
*/
|
|
4
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
+
import { logger } from '../../utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* 启动 Stdio 传输模式的 MCP 服务
|
|
8
|
+
*/
|
|
9
|
+
export async function startStdioServer(server) {
|
|
10
|
+
logger.info('Starting MCP Server with Stdio transport');
|
|
11
|
+
// 创建 Stdio 传输
|
|
12
|
+
const transport = new StdioServerTransport();
|
|
13
|
+
// 连接 MCP Server
|
|
14
|
+
await server.getServer().connect(transport);
|
|
15
|
+
logger.info('Stdio transport connected, server is ready');
|
|
16
|
+
// 处理进程退出
|
|
17
|
+
process.on('SIGINT', () => {
|
|
18
|
+
void (async () => {
|
|
19
|
+
logger.info('Received SIGINT, closing server...');
|
|
20
|
+
await server.close();
|
|
21
|
+
process.exit(0);
|
|
22
|
+
})();
|
|
23
|
+
});
|
|
24
|
+
process.on('SIGTERM', () => {
|
|
25
|
+
void (async () => {
|
|
26
|
+
logger.info('Received SIGTERM, closing server...');
|
|
27
|
+
await server.close();
|
|
28
|
+
process.exit(0);
|
|
29
|
+
})();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../../src/core/transports/stdio.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAExD,cAAc;IACd,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,gBAAgB;IAChB,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE5C,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAE1D,SAAS;IACT,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAClD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACnD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 框架入口 - 导出所有公共 API
|
|
3
|
+
*/
|
|
4
|
+
export { McpServer } from './core/server.js';
|
|
5
|
+
export { ToolRegistry } from './core/registry.js';
|
|
6
|
+
export { ToolRouter } from './core/router.js';
|
|
7
|
+
export { SessionManager } from './core/session.js';
|
|
8
|
+
export { startStdioServer } from './core/transports/stdio.js';
|
|
9
|
+
export { startHttpServer } from './core/transports/http.js';
|
|
10
|
+
export type { HttpServerConfig } from './core/transports/http.js';
|
|
11
|
+
export { SchemaValidator } from './tools/validator.js';
|
|
12
|
+
export { env } from './config/env.js';
|
|
13
|
+
export type { EnvSchema } from './config/env.js';
|
|
14
|
+
export type { ToolConfig, ToolContext, ToolResult, ToolHandler, ServerConfig, TransportMode, Middleware, Session, } from './tools/types.js';
|
|
15
|
+
export { SessionStatus } from './tools/types.js';
|
|
16
|
+
export { McpError, ParseError, InvalidRequestError, MethodNotFoundError, InvalidParamsError, InternalError, ToolNotFoundError, ToolExecutionError, SchemaValidationError, SessionNotFoundError, SessionTimeoutError, ToolRegistrationError, ConfigurationError, RateLimitError, toMcpError, } from './utils/errors.js';
|
|
17
|
+
export { Logger, logger, createLogger } from './utils/logger.js';
|
|
18
|
+
export type { LogLevel, LogEntry } from './utils/logger.js';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,YAAY,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,OAAO,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EACL,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 框架入口 - 导出所有公共 API
|
|
3
|
+
*/
|
|
4
|
+
// 核心类
|
|
5
|
+
export { McpServer } from './core/server.js';
|
|
6
|
+
export { ToolRegistry } from './core/registry.js';
|
|
7
|
+
export { ToolRouter } from './core/router.js';
|
|
8
|
+
export { SessionManager } from './core/session.js';
|
|
9
|
+
// 传输层
|
|
10
|
+
export { startStdioServer } from './core/transports/stdio.js';
|
|
11
|
+
export { startHttpServer } from './core/transports/http.js';
|
|
12
|
+
// 工具相关
|
|
13
|
+
export { SchemaValidator } from './tools/validator.js';
|
|
14
|
+
// export { echoTool } from './tools/examples/echo.js';
|
|
15
|
+
// 环境变量管理
|
|
16
|
+
export { env } from './config/env.js';
|
|
17
|
+
export { SessionStatus } from './tools/types.js';
|
|
18
|
+
// 错误类
|
|
19
|
+
export { McpError, ParseError, InvalidRequestError, MethodNotFoundError, InvalidParamsError, InternalError, ToolNotFoundError, ToolExecutionError, SchemaValidationError, SessionNotFoundError, SessionTimeoutError, ToolRegistrationError, ConfigurationError, RateLimitError, toMcpError, } from './utils/errors.js';
|
|
20
|
+
// 日志工具
|
|
21
|
+
export { Logger, logger, createLogger } from './utils/logger.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM;AACN,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM;AACN,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO;AACP,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,uDAAuD;AAEvD,SAAS;AACT,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AActC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM;AACN,OAAO,EACL,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO;AACP,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server 启动入口
|
|
4
|
+
*/
|
|
5
|
+
import 'dotenv/config';
|
|
6
|
+
import { McpServer } from './core/server.js';
|
|
7
|
+
import { startStdioServer } from './core/transports/stdio.js';
|
|
8
|
+
import { startHttpServer } from './core/transports/http.js';
|
|
9
|
+
// import { echoTool } from './tools/examples/echo.js';
|
|
10
|
+
import { ApiToolLoader, JsonConfigLoader } from './tools/api/index.js';
|
|
11
|
+
import { logger } from './utils/logger.js';
|
|
12
|
+
import { env } from './config/env.js';
|
|
13
|
+
/**
|
|
14
|
+
* 从环境变量读取配置
|
|
15
|
+
*/
|
|
16
|
+
function getConfig() {
|
|
17
|
+
return {
|
|
18
|
+
name: 'proxy-api-mcp',
|
|
19
|
+
version: '1.0.0',
|
|
20
|
+
transport: env.get('MCP_TRANSPORT'),
|
|
21
|
+
port: env.get('MCP_PORT'),
|
|
22
|
+
sessionTimeout: env.get('MCP_SESSION_TIMEOUT'),
|
|
23
|
+
logLevel: env.get('MCP_LOG_LEVEL'),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 主函数
|
|
28
|
+
*/
|
|
29
|
+
async function main() {
|
|
30
|
+
// 验证环境变量
|
|
31
|
+
try {
|
|
32
|
+
env.validate();
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
logger.error('Environment validation failed', {
|
|
36
|
+
error: error instanceof Error ? error.message : String(error),
|
|
37
|
+
});
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const config = getConfig();
|
|
41
|
+
// 设置日志级别
|
|
42
|
+
logger.setLevel(config.logLevel);
|
|
43
|
+
// 开发环境下打印配置
|
|
44
|
+
if (env.isDevelopment()) {
|
|
45
|
+
env.print();
|
|
46
|
+
}
|
|
47
|
+
// 创建 MCP Server
|
|
48
|
+
const server = new McpServer(config);
|
|
49
|
+
// 注册示例工具
|
|
50
|
+
// server.registerTool(echoTool);
|
|
51
|
+
// 加载 JSON 配置映射工具(优先级高)
|
|
52
|
+
const jsonConfigKeys = env.get('MCP_JSON_CONFIG');
|
|
53
|
+
if (jsonConfigKeys && jsonConfigKeys.trim() !== '') {
|
|
54
|
+
try {
|
|
55
|
+
logger.info(`Loading JSON config mappings: ${jsonConfigKeys}`);
|
|
56
|
+
const jsonTools = await JsonConfigLoader.loadFromConfigKeys(jsonConfigKeys);
|
|
57
|
+
if (jsonTools.length > 0) {
|
|
58
|
+
server.registerTools(jsonTools);
|
|
59
|
+
logger.info(`Loaded ${jsonTools.length} tools from JSON config mappings`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
logger.warn('No tools loaded from JSON config mappings');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
logger.error('Failed to load JSON config mappings', {
|
|
67
|
+
error: error instanceof Error ? error.message : String(error),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
logger.info('No JSON config mappings specified (MCP_JSON_CONFIG not set)');
|
|
73
|
+
}
|
|
74
|
+
// 加载 API 工具配置(仅在配置环境变量时)
|
|
75
|
+
const apiToolsConfigPath = env.get('MCP_API_TOOLS_CONFIG');
|
|
76
|
+
if (apiToolsConfigPath && apiToolsConfigPath.trim() !== '') {
|
|
77
|
+
try {
|
|
78
|
+
logger.info(`Loading API tools from: ${apiToolsConfigPath}`);
|
|
79
|
+
const apiTools = await ApiToolLoader.loadFromFile(apiToolsConfigPath);
|
|
80
|
+
if (apiTools.length > 0) {
|
|
81
|
+
server.registerTools(apiTools);
|
|
82
|
+
logger.info(`Loaded ${apiTools.length} API tools`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
logger.warn('No API tools loaded');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
logger.warn('Failed to load API tools, continuing without them', {
|
|
90
|
+
error: error instanceof Error ? error.message : String(error),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
logger.info('No API tools config specified (MCP_API_TOOLS_CONFIG not set)');
|
|
96
|
+
}
|
|
97
|
+
logger.info('Registered tools:', {
|
|
98
|
+
tools: server.getRegistry().getToolNames(),
|
|
99
|
+
});
|
|
100
|
+
// 根据传输模式启动服务器
|
|
101
|
+
switch (config.transport) {
|
|
102
|
+
case 'stdio':
|
|
103
|
+
await startStdioServer(server);
|
|
104
|
+
break;
|
|
105
|
+
case 'http':
|
|
106
|
+
startHttpServer(server, { port: config.port });
|
|
107
|
+
break;
|
|
108
|
+
default:
|
|
109
|
+
logger.error(`Unsupported transport mode: ${config.transport}`);
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// 运行主函数
|
|
114
|
+
main().catch((error) => {
|
|
115
|
+
logger.error('Failed to start server', {
|
|
116
|
+
error: error instanceof Error ? error.message : String(error),
|
|
117
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
118
|
+
});
|
|
119
|
+
process.exit(1);
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 工具构建器 - 从 API 配置生成 MCP 工具
|
|
3
|
+
*/
|
|
4
|
+
import { type ToolConfig } from '../types.js';
|
|
5
|
+
import { type ApiToolConfig } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* API 工具构建器类
|
|
8
|
+
*/
|
|
9
|
+
export declare class ApiToolBuilder {
|
|
10
|
+
/**
|
|
11
|
+
* 从 API 配置构建 MCP 工具配置
|
|
12
|
+
*/
|
|
13
|
+
static build(apiConfig: ApiToolConfig): ToolConfig;
|
|
14
|
+
/**
|
|
15
|
+
* 构建输入 Schema
|
|
16
|
+
*/
|
|
17
|
+
private static buildInputSchema;
|
|
18
|
+
/**
|
|
19
|
+
* 将参数定义转换为 JSON Schema
|
|
20
|
+
*/
|
|
21
|
+
private static parameterToJsonSchema;
|
|
22
|
+
/**
|
|
23
|
+
* 批量构建工具
|
|
24
|
+
*/
|
|
25
|
+
static buildBatch(apiConfigs: ApiToolConfig[]): ToolConfig[];
|
|
26
|
+
/**
|
|
27
|
+
* 验证 API 配置
|
|
28
|
+
*/
|
|
29
|
+
static validate(apiConfig: ApiToolConfig): {
|
|
30
|
+
valid: boolean;
|
|
31
|
+
errors: string[];
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=builder.d.ts.map
|