@cicctencent/agent-midway 0.1.1

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 (160) hide show
  1. package/README.md +280 -0
  2. package/dist/adapters/express.d.ts +8 -0
  3. package/dist/adapters/express.js +91 -0
  4. package/dist/adapters/index.d.ts +5 -0
  5. package/dist/adapters/index.js +21 -0
  6. package/dist/adapters/koa.d.ts +3 -0
  7. package/dist/adapters/koa.js +75 -0
  8. package/dist/adapters/midway.d.ts +5 -0
  9. package/dist/adapters/midway.js +11 -0
  10. package/dist/adapters/next.d.ts +12 -0
  11. package/dist/adapters/next.js +89 -0
  12. package/dist/adapters/shared.d.ts +4 -0
  13. package/dist/adapters/shared.js +31 -0
  14. package/dist/channel/dingtalk.d.ts +18 -0
  15. package/dist/channel/dingtalk.js +68 -0
  16. package/dist/channel/feishu.d.ts +20 -0
  17. package/dist/channel/feishu.js +96 -0
  18. package/dist/channel/index.d.ts +46 -0
  19. package/dist/channel/index.js +311 -0
  20. package/dist/channel/types.d.ts +77 -0
  21. package/dist/channel/types.js +7 -0
  22. package/dist/channel/wecom.d.ts +22 -0
  23. package/dist/channel/wecom.js +106 -0
  24. package/dist/component.d.ts +49 -0
  25. package/dist/component.js +129 -0
  26. package/dist/connector/calendar-adapter.d.ts +19 -0
  27. package/dist/connector/calendar-adapter.js +236 -0
  28. package/dist/connector/db-adapter.d.ts +28 -0
  29. package/dist/connector/db-adapter.js +193 -0
  30. package/dist/connector/email-adapter.d.ts +23 -0
  31. package/dist/connector/email-adapter.js +192 -0
  32. package/dist/connector/fs-adapter.d.ts +15 -0
  33. package/dist/connector/fs-adapter.js +199 -0
  34. package/dist/connector/http-adapter.d.ts +29 -0
  35. package/dist/connector/http-adapter.js +181 -0
  36. package/dist/connector/index.d.ts +24 -0
  37. package/dist/connector/index.js +454 -0
  38. package/dist/connector/mcp-adapter.d.ts +27 -0
  39. package/dist/connector/mcp-adapter.js +156 -0
  40. package/dist/connector/mq-adapter.d.ts +25 -0
  41. package/dist/connector/mq-adapter.js +181 -0
  42. package/dist/connector/types.d.ts +205 -0
  43. package/dist/connector/types.js +9 -0
  44. package/dist/controller/a2a.controller.d.ts +41 -0
  45. package/dist/controller/a2a.controller.js +150 -0
  46. package/dist/controller/agent-profile.controller.d.ts +97 -0
  47. package/dist/controller/agent-profile.controller.js +200 -0
  48. package/dist/controller/agent.controller.d.ts +199 -0
  49. package/dist/controller/agent.controller.js +414 -0
  50. package/dist/controller/application.controller.d.ts +113 -0
  51. package/dist/controller/application.controller.js +217 -0
  52. package/dist/controller/automation.controller.d.ts +113 -0
  53. package/dist/controller/automation.controller.js +246 -0
  54. package/dist/controller/channel.controller.d.ts +73 -0
  55. package/dist/controller/channel.controller.js +183 -0
  56. package/dist/controller/chat.controller.d.ts +188 -0
  57. package/dist/controller/chat.controller.js +375 -0
  58. package/dist/controller/connector.controller.d.ts +134 -0
  59. package/dist/controller/connector.controller.js +257 -0
  60. package/dist/controller/knowledge-base.controller.d.ts +157 -0
  61. package/dist/controller/knowledge-base.controller.js +278 -0
  62. package/dist/controller/mcp-server.controller.d.ts +115 -0
  63. package/dist/controller/mcp-server.controller.js +236 -0
  64. package/dist/controller/model-config.controller.d.ts +139 -0
  65. package/dist/controller/model-config.controller.js +274 -0
  66. package/dist/controller/observability.controller.d.ts +124 -0
  67. package/dist/controller/observability.controller.js +142 -0
  68. package/dist/controller/security.controller.d.ts +91 -0
  69. package/dist/controller/security.controller.js +172 -0
  70. package/dist/controller/settings.controller.d.ts +83 -0
  71. package/dist/controller/settings.controller.js +280 -0
  72. package/dist/core/ai-workstation.d.ts +17 -0
  73. package/dist/core/ai-workstation.js +129 -0
  74. package/dist/core/index.d.ts +4 -0
  75. package/dist/core/index.js +20 -0
  76. package/dist/core/service-container.d.ts +12 -0
  77. package/dist/core/service-container.js +54 -0
  78. package/dist/core/sse.d.ts +6 -0
  79. package/dist/core/sse.js +56 -0
  80. package/dist/core/types.d.ts +72 -0
  81. package/dist/core/types.js +2 -0
  82. package/dist/dto/agent.dto.d.ts +21 -0
  83. package/dist/dto/agent.dto.js +79 -0
  84. package/dist/dto/ai-config.dto.d.ts +67 -0
  85. package/dist/dto/ai-config.dto.js +249 -0
  86. package/dist/dto/chat.dto.d.ts +40 -0
  87. package/dist/dto/chat.dto.js +122 -0
  88. package/dist/index.d.ts +101 -0
  89. package/dist/index.js +195 -0
  90. package/dist/memory/db-store.d.ts +33 -0
  91. package/dist/memory/db-store.js +143 -0
  92. package/dist/memory/index.d.ts +187 -0
  93. package/dist/memory/index.js +443 -0
  94. package/dist/model/ai-agent-profile.entity.d.ts +32 -0
  95. package/dist/model/ai-agent-profile.entity.js +289 -0
  96. package/dist/model/ai-application.entity.d.ts +20 -0
  97. package/dist/model/ai-application.entity.js +166 -0
  98. package/dist/model/ai-chat-memory.entity.d.ts +16 -0
  99. package/dist/model/ai-chat-memory.entity.js +123 -0
  100. package/dist/model/ai-chat-message.entity.d.ts +16 -0
  101. package/dist/model/ai-chat-message.entity.js +122 -0
  102. package/dist/model/ai-chat-skill.entity.d.ts +19 -0
  103. package/dist/model/ai-chat-skill.entity.js +155 -0
  104. package/dist/model/ai-chat-thread.entity.d.ts +15 -0
  105. package/dist/model/ai-chat-thread.entity.js +113 -0
  106. package/dist/model/ai-chat-workspace.entity.d.ts +17 -0
  107. package/dist/model/ai-chat-workspace.entity.js +136 -0
  108. package/dist/model/ai-kb-document.entity.d.ts +16 -0
  109. package/dist/model/ai-kb-document.entity.js +122 -0
  110. package/dist/model/ai-knowledge-base.entity.d.ts +22 -0
  111. package/dist/model/ai-knowledge-base.entity.js +185 -0
  112. package/dist/model/ai-mcp-server.entity.d.ts +23 -0
  113. package/dist/model/ai-mcp-server.entity.js +198 -0
  114. package/dist/model/ai-model-config.entity.d.ts +24 -0
  115. package/dist/model/ai-model-config.entity.js +200 -0
  116. package/dist/service/a2a.service.d.ts +142 -0
  117. package/dist/service/a2a.service.js +537 -0
  118. package/dist/service/agent-profile.service.d.ts +34 -0
  119. package/dist/service/agent-profile.service.js +110 -0
  120. package/dist/service/agent-server.service.d.ts +91 -0
  121. package/dist/service/agent-server.service.js +634 -0
  122. package/dist/service/agent-task-queue.service.d.ts +98 -0
  123. package/dist/service/agent-task-queue.service.js +283 -0
  124. package/dist/service/ai-chat.service.d.ts +103 -0
  125. package/dist/service/ai-chat.service.js +431 -0
  126. package/dist/service/ai-skill.service.d.ts +116 -0
  127. package/dist/service/ai-skill.service.js +457 -0
  128. package/dist/service/application.service.d.ts +42 -0
  129. package/dist/service/application.service.js +139 -0
  130. package/dist/service/automation.service.d.ts +37 -0
  131. package/dist/service/automation.service.js +196 -0
  132. package/dist/service/connector.service.d.ts +136 -0
  133. package/dist/service/connector.service.js +524 -0
  134. package/dist/service/knowledge-base.service.d.ts +138 -0
  135. package/dist/service/knowledge-base.service.js +528 -0
  136. package/dist/service/mcp-server.service.d.ts +39 -0
  137. package/dist/service/mcp-server.service.js +143 -0
  138. package/dist/service/model-config.service.d.ts +57 -0
  139. package/dist/service/model-config.service.js +168 -0
  140. package/dist/service/observability.service.d.ts +145 -0
  141. package/dist/service/observability.service.js +281 -0
  142. package/dist/service/openai.service.d.ts +88 -0
  143. package/dist/service/openai.service.js +406 -0
  144. package/dist/service/prompt-builder.service.d.ts +50 -0
  145. package/dist/service/prompt-builder.service.js +246 -0
  146. package/dist/tools/code-exec.tool.d.ts +37 -0
  147. package/dist/tools/code-exec.tool.js +162 -0
  148. package/dist/tools/datetime.tool.d.ts +21 -0
  149. package/dist/tools/datetime.tool.js +379 -0
  150. package/dist/tools/http-request.tool.d.ts +43 -0
  151. package/dist/tools/http-request.tool.js +455 -0
  152. package/dist/tools/registry.d.ts +71 -0
  153. package/dist/tools/registry.js +77 -0
  154. package/dist/tools/text-process.tool.d.ts +7 -0
  155. package/dist/tools/text-process.tool.js +366 -0
  156. package/dist/tools/web-search.tool.d.ts +28 -0
  157. package/dist/tools/web-search.tool.js +304 -0
  158. package/dist/types.d.ts +70 -0
  159. package/dist/types.js +7 -0
  160. package/package.json +69 -0
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HTTPAPIAdapter = void 0;
4
+ class HTTPAPIAdapter {
5
+ constructor() {
6
+ this.type = 'http-api';
7
+ }
8
+ async testConnection(config) {
9
+ const services = config.services || [];
10
+ if (services.length === 0) {
11
+ return {
12
+ success: false,
13
+ message: '未配置任何服务',
14
+ };
15
+ }
16
+ const results = [];
17
+ for (const svc of services) {
18
+ try {
19
+ const resp = await fetch(svc.baseUrl, {
20
+ method: 'GET',
21
+ headers: this.buildHeaders(config, svc),
22
+ signal: AbortSignal.timeout(10000),
23
+ });
24
+ if (resp.ok) {
25
+ results.push(`${svc.name}: OK (${resp.status})`);
26
+ }
27
+ else {
28
+ results.push(`${svc.name}: HTTP ${resp.status}`);
29
+ }
30
+ }
31
+ catch (err) {
32
+ return {
33
+ success: false,
34
+ message: `服务 ${svc.name} 连接失败`,
35
+ error: err.message,
36
+ };
37
+ }
38
+ }
39
+ return {
40
+ success: true,
41
+ message: `连接成功,${results.length} 个服务可达`,
42
+ resources: results,
43
+ };
44
+ }
45
+ async discoverTools(config) {
46
+ const endpoints = await this.collectEndpoints(config);
47
+ const tools = [];
48
+ for (const ep of endpoints) {
49
+ const toolName = this.sanitizeToolName(ep.name);
50
+ const properties = {};
51
+ if (ep.querySchema?.properties) {
52
+ for (const [key, val] of Object.entries(ep.querySchema.properties)) {
53
+ properties[key] = {
54
+ ...val,
55
+ description: val.description || `Query param: ${key}`,
56
+ };
57
+ }
58
+ }
59
+ if (ep.bodySchema?.properties) {
60
+ for (const [key, val] of Object.entries(ep.bodySchema.properties)) {
61
+ properties[key] = {
62
+ ...val,
63
+ description: val.description || `Body param: ${key}`,
64
+ };
65
+ }
66
+ }
67
+ tools.push({
68
+ name: toolName,
69
+ description: ep.description || `${ep.method} ${ep.path}`,
70
+ inputSchema: {
71
+ type: 'object',
72
+ properties,
73
+ required: [
74
+ ...(ep.querySchema?.required || []),
75
+ ...(ep.bodySchema?.required || []),
76
+ ],
77
+ },
78
+ });
79
+ }
80
+ return tools;
81
+ }
82
+ async generateManifest(config) {
83
+ const tools = await this.discoverTools(config);
84
+ return {
85
+ tools,
86
+ metadata: {
87
+ apiMode: config.apiMode,
88
+ serviceCount: config.services?.length || 0,
89
+ endpointCount: tools.length,
90
+ },
91
+ };
92
+ }
93
+ async generateMCPServerConfigs(config) {
94
+ const tools = await this.discoverTools(config);
95
+ const services = config.services || [];
96
+ return services.map(svc => ({
97
+ name: `http-${svc.name}`,
98
+ transport: 'streamable-http',
99
+ url: svc.baseUrl,
100
+ tools: tools.filter(t => svc.endpoints?.some(ep => this.sanitizeToolName(ep.name) === t.name)),
101
+ }));
102
+ }
103
+ /** 收集所有端点 */
104
+ async collectEndpoints(config) {
105
+ if (config.apiMode === 'openapi' && config.openapiSpec) {
106
+ return this.parseOpenAPI(config);
107
+ }
108
+ const endpoints = [];
109
+ for (const svc of config.services || []) {
110
+ for (const ep of svc.endpoints || []) {
111
+ endpoints.push({ ...ep, service: svc.name });
112
+ }
113
+ }
114
+ return endpoints;
115
+ }
116
+ /** 解析 OpenAPI spec */
117
+ async parseOpenAPI(config) {
118
+ let spec;
119
+ if (config.openapiSpec.startsWith('http://') ||
120
+ config.openapiSpec.startsWith('https://')) {
121
+ const resp = await fetch(config.openapiSpec);
122
+ spec = await resp.json();
123
+ }
124
+ else {
125
+ spec = JSON.parse(config.openapiSpec);
126
+ }
127
+ const endpoints = [];
128
+ const basePath = spec.basePath || '';
129
+ const title = spec.info?.title || 'openapi-service';
130
+ for (const [routePath, methods] of Object.entries(spec.paths || {})) {
131
+ for (const [method, detail] of Object.entries(methods)) {
132
+ const upperMethod = method.toUpperCase();
133
+ if (!['GET', 'POST', 'PUT', 'DELETE', 'PATCH'].includes(upperMethod)) {
134
+ continue;
135
+ }
136
+ const d = detail;
137
+ endpoints.push({
138
+ name: d.operationId ||
139
+ `${upperMethod.toLowerCase()}_${routePath.replace(/[^a-zA-Z0-9]/g, '_')}`,
140
+ method: upperMethod,
141
+ path: basePath + routePath,
142
+ description: d.summary || d.description || '',
143
+ service: title,
144
+ });
145
+ }
146
+ }
147
+ return endpoints;
148
+ }
149
+ /** 构建请求头 */
150
+ buildHeaders(config, svc) {
151
+ const headers = {
152
+ 'Content-Type': 'application/json',
153
+ ...(config.globalHeaders || {}),
154
+ ...(svc?.headers || {}),
155
+ };
156
+ const token = svc?.authToken || config.authToken;
157
+ if (token) {
158
+ switch (config.authType) {
159
+ case 'bearer':
160
+ headers['Authorization'] = `Bearer ${token}`;
161
+ break;
162
+ case 'basic':
163
+ headers['Authorization'] = `Basic ${Buffer.from(token).toString('base64')}`;
164
+ break;
165
+ case 'apikey':
166
+ headers['X-API-Key'] = token;
167
+ break;
168
+ }
169
+ }
170
+ return headers;
171
+ }
172
+ /** 将端点名转为合法工具名 */
173
+ sanitizeToolName(name) {
174
+ return name
175
+ .replace(/[^a-zA-Z0-9_]/g, '_')
176
+ .replace(/_+/g, '_')
177
+ .replace(/^_|_$/g, '')
178
+ .toLowerCase();
179
+ }
180
+ }
181
+ exports.HTTPAPIAdapter = HTTPAPIAdapter;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 连接器适配器注册表
3
+ *
4
+ * 注册所有 7 种数据源适配器,提供统一的查询接口。
5
+ */
6
+ import type { DataSourceType, DataSourceAdapter, DataSourceTypeInfo } from './types';
7
+ import { DatabaseAdapter } from './db-adapter';
8
+ import { HTTPAPIAdapter } from './http-adapter';
9
+ import { FileSystemAdapter } from './fs-adapter';
10
+ import { EmailAdapter } from './email-adapter';
11
+ import { CalendarAdapter } from './calendar-adapter';
12
+ import { MCPAdapter } from './mcp-adapter';
13
+ import { MessageQueueAdapter } from './mq-adapter';
14
+ /** 获取指定类型的适配器 */
15
+ export declare function getAdapter(type: DataSourceType): DataSourceAdapter;
16
+ /** 列出所有适配器类型 */
17
+ export declare function listAdapterTypes(): DataSourceType[];
18
+ /** 列出所有数据源类型(同 listAdapterTypes) */
19
+ export declare function listDataSourceTypes(): DataSourceType[];
20
+ /** 获取所有数据源类型信息(前端向导展示用) */
21
+ export declare function getDataSourceTypeInfos(): DataSourceTypeInfo[];
22
+ /** 获取指定类型的信息 */
23
+ export declare function getDataSourceTypeInfo(type: DataSourceType): DataSourceTypeInfo;
24
+ export { DatabaseAdapter, HTTPAPIAdapter, FileSystemAdapter, EmailAdapter, CalendarAdapter, MCPAdapter, MessageQueueAdapter, };
@@ -0,0 +1,454 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageQueueAdapter = exports.MCPAdapter = exports.CalendarAdapter = exports.EmailAdapter = exports.FileSystemAdapter = exports.HTTPAPIAdapter = exports.DatabaseAdapter = void 0;
4
+ exports.getAdapter = getAdapter;
5
+ exports.listAdapterTypes = listAdapterTypes;
6
+ exports.listDataSourceTypes = listDataSourceTypes;
7
+ exports.getDataSourceTypeInfos = getDataSourceTypeInfos;
8
+ exports.getDataSourceTypeInfo = getDataSourceTypeInfo;
9
+ const db_adapter_1 = require("./db-adapter");
10
+ Object.defineProperty(exports, "DatabaseAdapter", { enumerable: true, get: function () { return db_adapter_1.DatabaseAdapter; } });
11
+ const http_adapter_1 = require("./http-adapter");
12
+ Object.defineProperty(exports, "HTTPAPIAdapter", { enumerable: true, get: function () { return http_adapter_1.HTTPAPIAdapter; } });
13
+ const fs_adapter_1 = require("./fs-adapter");
14
+ Object.defineProperty(exports, "FileSystemAdapter", { enumerable: true, get: function () { return fs_adapter_1.FileSystemAdapter; } });
15
+ const email_adapter_1 = require("./email-adapter");
16
+ Object.defineProperty(exports, "EmailAdapter", { enumerable: true, get: function () { return email_adapter_1.EmailAdapter; } });
17
+ const calendar_adapter_1 = require("./calendar-adapter");
18
+ Object.defineProperty(exports, "CalendarAdapter", { enumerable: true, get: function () { return calendar_adapter_1.CalendarAdapter; } });
19
+ const mcp_adapter_1 = require("./mcp-adapter");
20
+ Object.defineProperty(exports, "MCPAdapter", { enumerable: true, get: function () { return mcp_adapter_1.MCPAdapter; } });
21
+ const mq_adapter_1 = require("./mq-adapter");
22
+ Object.defineProperty(exports, "MessageQueueAdapter", { enumerable: true, get: function () { return mq_adapter_1.MessageQueueAdapter; } });
23
+ // ===================== 适配器注册表 =====================
24
+ const adapters = new Map();
25
+ /** 注册所有内置适配器 */
26
+ function registerAdapters() {
27
+ adapters.set('database', new db_adapter_1.DatabaseAdapter());
28
+ adapters.set('http-api', new http_adapter_1.HTTPAPIAdapter());
29
+ adapters.set('filesystem', new fs_adapter_1.FileSystemAdapter());
30
+ adapters.set('email', new email_adapter_1.EmailAdapter());
31
+ adapters.set('calendar', new calendar_adapter_1.CalendarAdapter());
32
+ adapters.set('mcp', new mcp_adapter_1.MCPAdapter());
33
+ adapters.set('message-queue', new mq_adapter_1.MessageQueueAdapter());
34
+ }
35
+ // 初始化注册
36
+ registerAdapters();
37
+ /** 获取指定类型的适配器 */
38
+ function getAdapter(type) {
39
+ const adapter = adapters.get(type);
40
+ if (!adapter) {
41
+ throw new Error(`不支持的数据源类型: ${type}`);
42
+ }
43
+ return adapter;
44
+ }
45
+ /** 列出所有适配器类型 */
46
+ function listAdapterTypes() {
47
+ return Array.from(adapters.keys());
48
+ }
49
+ /** 列出所有数据源类型(同 listAdapterTypes) */
50
+ function listDataSourceTypes() {
51
+ return listAdapterTypes();
52
+ }
53
+ // ===================== 前端向导展示信息 =====================
54
+ /** 数据源类型信息(前端向导展示用) */
55
+ const typeInfos = {
56
+ database: {
57
+ type: 'database',
58
+ label: '数据库',
59
+ icon: 'database',
60
+ description: '连接 MySQL / PostgreSQL / MongoDB 数据库,自动发现表并生成查询工具',
61
+ fields: [
62
+ {
63
+ name: 'name',
64
+ label: '数据源名称',
65
+ fieldType: 'text',
66
+ required: true,
67
+ placeholder: 'my-database',
68
+ },
69
+ {
70
+ name: 'dbType',
71
+ label: '数据库类型',
72
+ fieldType: 'select',
73
+ required: true,
74
+ defaultValue: 'mysql',
75
+ options: [
76
+ { label: 'MySQL', value: 'mysql' },
77
+ { label: 'PostgreSQL', value: 'postgres' },
78
+ { label: 'MongoDB', value: 'mongodb' },
79
+ ],
80
+ },
81
+ {
82
+ name: 'host',
83
+ label: '主机地址',
84
+ fieldType: 'text',
85
+ required: true,
86
+ defaultValue: 'localhost',
87
+ placeholder: '127.0.0.1',
88
+ },
89
+ {
90
+ name: 'port',
91
+ label: '端口',
92
+ fieldType: 'number',
93
+ required: true,
94
+ defaultValue: 3306,
95
+ visibleWhen: { field: 'dbType', equals: 'mysql' },
96
+ },
97
+ {
98
+ name: 'database',
99
+ label: '数据库名',
100
+ fieldType: 'text',
101
+ required: true,
102
+ },
103
+ {
104
+ name: 'username',
105
+ label: '用户名',
106
+ fieldType: 'text',
107
+ required: true,
108
+ },
109
+ {
110
+ name: 'password',
111
+ label: '密码',
112
+ fieldType: 'password',
113
+ required: true,
114
+ },
115
+ ],
116
+ },
117
+ filesystem: {
118
+ type: 'filesystem',
119
+ label: '文件系统',
120
+ icon: 'folder',
121
+ description: '连接本地文件系统,生成文件读写、搜索等工具',
122
+ fields: [
123
+ {
124
+ name: 'name',
125
+ label: '数据源名称',
126
+ fieldType: 'text',
127
+ required: true,
128
+ placeholder: 'my-files',
129
+ },
130
+ {
131
+ name: 'rootPath',
132
+ label: '根目录路径',
133
+ fieldType: 'text',
134
+ required: true,
135
+ placeholder: '/data/files',
136
+ },
137
+ {
138
+ name: 'readOnly',
139
+ label: '只读模式',
140
+ fieldType: 'boolean',
141
+ required: false,
142
+ defaultValue: true,
143
+ },
144
+ {
145
+ name: 'allowedExtensions',
146
+ label: '允许的扩展名',
147
+ fieldType: 'textarea',
148
+ required: false,
149
+ placeholder: '.txt,.json,.csv',
150
+ },
151
+ ],
152
+ },
153
+ 'http-api': {
154
+ type: 'http-api',
155
+ label: 'HTTP API',
156
+ icon: 'api',
157
+ description: '连接 HTTP REST API,支持手动定义端点或从 OpenAPI spec 自动发现',
158
+ fields: [
159
+ {
160
+ name: 'name',
161
+ label: '数据源名称',
162
+ fieldType: 'text',
163
+ required: true,
164
+ placeholder: 'my-api',
165
+ },
166
+ {
167
+ name: 'apiMode',
168
+ label: 'API 模式',
169
+ fieldType: 'select',
170
+ required: true,
171
+ defaultValue: 'manual',
172
+ options: [
173
+ { label: '手动定义', value: 'manual' },
174
+ { label: 'OpenAPI Spec', value: 'openapi' },
175
+ ],
176
+ },
177
+ {
178
+ name: 'openapiSpec',
179
+ label: 'OpenAPI Spec URL',
180
+ fieldType: 'text',
181
+ required: false,
182
+ placeholder: 'https://api.example.com/openapi.json',
183
+ visibleWhen: { field: 'apiMode', equals: 'openapi' },
184
+ },
185
+ {
186
+ name: 'authType',
187
+ label: '认证类型',
188
+ fieldType: 'select',
189
+ required: false,
190
+ defaultValue: 'none',
191
+ options: [
192
+ { label: '无', value: 'none' },
193
+ { label: 'Bearer Token', value: 'bearer' },
194
+ { label: 'Basic Auth', value: 'basic' },
195
+ { label: 'API Key', value: 'apikey' },
196
+ ],
197
+ },
198
+ {
199
+ name: 'authToken',
200
+ label: '认证 Token',
201
+ fieldType: 'password',
202
+ required: false,
203
+ },
204
+ ],
205
+ },
206
+ mcp: {
207
+ type: 'mcp',
208
+ label: 'MCP 服务器',
209
+ icon: 'server',
210
+ description: '连接 MCP (Model Context Protocol) 服务器,发现并代理其工具',
211
+ fields: [
212
+ {
213
+ name: 'name',
214
+ label: '数据源名称',
215
+ fieldType: 'text',
216
+ required: true,
217
+ placeholder: 'my-mcp',
218
+ },
219
+ {
220
+ name: 'mcpTransport',
221
+ label: '传输方式',
222
+ fieldType: 'select',
223
+ required: true,
224
+ defaultValue: 'stdio',
225
+ options: [
226
+ { label: 'Stdio', value: 'stdio' },
227
+ { label: 'SSE', value: 'sse' },
228
+ { label: 'Streamable HTTP', value: 'streamable-http' },
229
+ ],
230
+ },
231
+ {
232
+ name: 'command',
233
+ label: '命令',
234
+ fieldType: 'text',
235
+ required: true,
236
+ placeholder: 'node',
237
+ visibleWhen: { field: 'mcpTransport', equals: 'stdio' },
238
+ },
239
+ {
240
+ name: 'args',
241
+ label: '参数',
242
+ fieldType: 'textarea',
243
+ required: false,
244
+ placeholder: '["server.js"]',
245
+ visibleWhen: { field: 'mcpTransport', equals: 'stdio' },
246
+ },
247
+ {
248
+ name: 'url',
249
+ label: 'URL',
250
+ fieldType: 'text',
251
+ required: true,
252
+ placeholder: 'http://localhost:3001',
253
+ visibleWhen: { field: 'mcpTransport', equals: 'sse' },
254
+ },
255
+ ],
256
+ },
257
+ email: {
258
+ type: 'email',
259
+ label: '邮箱',
260
+ icon: 'mail',
261
+ description: '连接 IMAP + SMTP 邮箱,生成邮件收发和搜索工具',
262
+ fields: [
263
+ {
264
+ name: 'name',
265
+ label: '数据源名称',
266
+ fieldType: 'text',
267
+ required: true,
268
+ placeholder: 'my-email',
269
+ },
270
+ {
271
+ name: 'emailAddress',
272
+ label: '邮箱地址',
273
+ fieldType: 'text',
274
+ required: true,
275
+ placeholder: 'user@example.com',
276
+ },
277
+ {
278
+ name: 'password',
279
+ label: '密码 / 应用专用密码',
280
+ fieldType: 'password',
281
+ required: true,
282
+ },
283
+ {
284
+ name: 'imapHost',
285
+ label: 'IMAP 主机',
286
+ fieldType: 'text',
287
+ required: true,
288
+ placeholder: 'imap.example.com',
289
+ },
290
+ {
291
+ name: 'imapPort',
292
+ label: 'IMAP 端口',
293
+ fieldType: 'number',
294
+ required: true,
295
+ defaultValue: 993,
296
+ },
297
+ {
298
+ name: 'smtpHost',
299
+ label: 'SMTP 主机',
300
+ fieldType: 'text',
301
+ required: true,
302
+ placeholder: 'smtp.example.com',
303
+ },
304
+ {
305
+ name: 'smtpPort',
306
+ label: 'SMTP 端口',
307
+ fieldType: 'number',
308
+ required: true,
309
+ defaultValue: 465,
310
+ },
311
+ {
312
+ name: 'useTLS',
313
+ label: '使用 TLS',
314
+ fieldType: 'boolean',
315
+ required: false,
316
+ defaultValue: true,
317
+ },
318
+ ],
319
+ },
320
+ calendar: {
321
+ type: 'calendar',
322
+ label: '日历',
323
+ icon: 'calendar',
324
+ description: '连接本地或 CalDAV 日历,生成事件管理工具',
325
+ fields: [
326
+ {
327
+ name: 'name',
328
+ label: '数据源名称',
329
+ fieldType: 'text',
330
+ required: true,
331
+ placeholder: 'my-calendar',
332
+ },
333
+ {
334
+ name: 'calendarType',
335
+ label: '日历类型',
336
+ fieldType: 'select',
337
+ required: true,
338
+ defaultValue: 'local',
339
+ options: [
340
+ { label: '本地', value: 'local' },
341
+ { label: 'CalDAV', value: 'caldav' },
342
+ ],
343
+ },
344
+ {
345
+ name: 'calendarName',
346
+ label: '日历名称',
347
+ fieldType: 'text',
348
+ required: false,
349
+ defaultValue: 'default',
350
+ },
351
+ {
352
+ name: 'caldavUrl',
353
+ label: 'CalDAV URL',
354
+ fieldType: 'text',
355
+ required: true,
356
+ placeholder: 'https://caldav.example.com',
357
+ visibleWhen: { field: 'calendarType', equals: 'caldav' },
358
+ },
359
+ {
360
+ name: 'emailAddress',
361
+ label: '用户名',
362
+ fieldType: 'text',
363
+ required: false,
364
+ visibleWhen: { field: 'calendarType', equals: 'caldav' },
365
+ },
366
+ {
367
+ name: 'password',
368
+ label: '密码',
369
+ fieldType: 'password',
370
+ required: false,
371
+ visibleWhen: { field: 'calendarType', equals: 'caldav' },
372
+ },
373
+ ],
374
+ },
375
+ 'message-queue': {
376
+ type: 'message-queue',
377
+ label: '消息队列',
378
+ icon: 'message',
379
+ description: '连接 RabbitMQ 或 Kafka 消息队列,生成消息生产/消费工具',
380
+ fields: [
381
+ {
382
+ name: 'name',
383
+ label: '数据源名称',
384
+ fieldType: 'text',
385
+ required: true,
386
+ placeholder: 'my-mq',
387
+ },
388
+ {
389
+ name: 'mqType',
390
+ label: 'MQ 类型',
391
+ fieldType: 'select',
392
+ required: true,
393
+ defaultValue: 'rabbitmq',
394
+ options: [
395
+ { label: 'RabbitMQ', value: 'rabbitmq' },
396
+ { label: 'Kafka', value: 'kafka' },
397
+ ],
398
+ },
399
+ {
400
+ name: 'host',
401
+ label: '主机地址',
402
+ fieldType: 'text',
403
+ required: true,
404
+ defaultValue: 'localhost',
405
+ },
406
+ {
407
+ name: 'port',
408
+ label: '端口',
409
+ fieldType: 'number',
410
+ required: true,
411
+ defaultValue: 5672,
412
+ visibleWhen: { field: 'mqType', equals: 'rabbitmq' },
413
+ },
414
+ {
415
+ name: 'username',
416
+ label: '用户名',
417
+ fieldType: 'text',
418
+ required: false,
419
+ },
420
+ {
421
+ name: 'password',
422
+ label: '密码',
423
+ fieldType: 'password',
424
+ required: false,
425
+ },
426
+ {
427
+ name: 'topics',
428
+ label: 'Topic / Queue 列表',
429
+ fieldType: 'textarea',
430
+ required: false,
431
+ placeholder: '["queue1", "queue2"]',
432
+ },
433
+ {
434
+ name: 'groupId',
435
+ label: '消费组 ID',
436
+ fieldType: 'text',
437
+ required: false,
438
+ visibleWhen: { field: 'mqType', equals: 'kafka' },
439
+ },
440
+ ],
441
+ },
442
+ };
443
+ /** 获取所有数据源类型信息(前端向导展示用) */
444
+ function getDataSourceTypeInfos() {
445
+ return Object.values(typeInfos);
446
+ }
447
+ /** 获取指定类型的信息 */
448
+ function getDataSourceTypeInfo(type) {
449
+ const info = typeInfos[type];
450
+ if (!info) {
451
+ throw new Error(`不支持的数据源类型: ${type}`);
452
+ }
453
+ return info;
454
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * MCP 服务器适配器
3
+ *
4
+ * 连接外部 MCP 服务器,发现其暴露的工具。
5
+ * testConnection 尝试连接 MCP 服务器,discoverTools 获取工具列表。
6
+ */
7
+ import type { DataSourceConfig, DiscoveredTool, ConnectionTestResult, DataSourceAdapter, MCPServerConfig } from './types';
8
+ export declare class MCPAdapter implements DataSourceAdapter {
9
+ readonly type: "mcp";
10
+ testConnection(config: DataSourceConfig): Promise<ConnectionTestResult>;
11
+ discoverTools(config: DataSourceConfig): Promise<DiscoveredTool[]>;
12
+ generateManifest(config: DataSourceConfig): Promise<{
13
+ tools: DiscoveredTool[];
14
+ metadata: {
15
+ transport: "stdio" | "sse" | "streamable-http";
16
+ command: string;
17
+ url: string;
18
+ };
19
+ }>;
20
+ generateMCPServerConfigs(config: DataSourceConfig): Promise<MCPServerConfig[]>;
21
+ /** 从 MCP 服务器获取工具列表 */
22
+ private fetchTools;
23
+ /** 通过 stdio 连接 MCP 服务器 */
24
+ private fetchToolsStdio;
25
+ /** 通过 HTTP/SSE 连接 MCP 服务器 */
26
+ private fetchToolsHTTP;
27
+ }