@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,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WeComAdapter = void 0;
4
+ class WeComAdapter {
5
+ constructor() {
6
+ this.type = 'wecom';
7
+ this.config = {
8
+ type: 'wecom',
9
+ name: '企业微信',
10
+ enabled: false,
11
+ };
12
+ }
13
+ async init(config) {
14
+ this.config = { ...config };
15
+ }
16
+ /** 获取企业微信 access_token */
17
+ async getAccessToken(config) {
18
+ const response = await fetch(`https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${config.appId}&corpsecret=${config.appSecret}`);
19
+ const data = (await response.json());
20
+ if (data.errcode !== 0) {
21
+ throw new Error(`Failed to get wecom token: ${data.errmsg || 'unknown error'}`);
22
+ }
23
+ return data.access_token;
24
+ }
25
+ async sendMessage(config, receiveId, message) {
26
+ const token = await this.getAccessToken(config);
27
+ const agentId = config.wecomAgentId || config.agentId || '';
28
+ const response = await fetch(`https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}`, {
29
+ method: 'POST',
30
+ headers: { 'Content-Type': 'application/json' },
31
+ body: JSON.stringify({
32
+ touser: receiveId,
33
+ msgtype: 'text',
34
+ agentid: agentId,
35
+ text: { content: message },
36
+ }),
37
+ });
38
+ const data = (await response.json());
39
+ return data.errcode === 0;
40
+ }
41
+ async receiveMessage(body, headers) {
42
+ const contentType = headers?.['content-type'] || '';
43
+ // XML 格式处理
44
+ if (typeof body === 'string' &&
45
+ (contentType.includes('xml') || body.startsWith('<xml'))) {
46
+ return this.parseXml(body);
47
+ }
48
+ // JSON 格式处理
49
+ if (body?.MsgType === 'text' || body?.msgtype === 'text') {
50
+ const text = body?.Content || body?.content || '';
51
+ return {
52
+ sessionId: body?.FromUserName
53
+ ? `wecom_${body.FromUserName}`
54
+ : '',
55
+ message: text.trim(),
56
+ senderId: body?.FromUserName || '',
57
+ senderName: body?.FromUserName || '',
58
+ raw: body,
59
+ };
60
+ }
61
+ return null;
62
+ }
63
+ getConfig() {
64
+ return { ...this.config };
65
+ }
66
+ verifySignature(body, headers, config) {
67
+ // 企业微信签名验证
68
+ const signature = headers?.['msg_signature'];
69
+ if (!signature || !config.token)
70
+ return true;
71
+ // TODO: 实现完整的签名验证逻辑
72
+ return true;
73
+ }
74
+ /** URL 验证挑战 */
75
+ verifyChallenge(body, _config) {
76
+ // 企业微信 URL 验证
77
+ if (body?.msg_signature !== undefined && body?.echostr) {
78
+ return body.echostr;
79
+ }
80
+ return null;
81
+ }
82
+ /** 简单 XML 解析(企业微信回调) */
83
+ parseXml(xml) {
84
+ try {
85
+ const getText = (tag) => {
86
+ const match = xml.match(new RegExp(`<${tag}><!\\[CDATA\\[(.*?)\\]\\]></${tag}>`));
87
+ return match ? match[1] : '';
88
+ };
89
+ const content = getText('Content');
90
+ const fromUser = getText('FromUserName');
91
+ if (!content)
92
+ return null;
93
+ return {
94
+ sessionId: fromUser ? `wecom_${fromUser}` : '',
95
+ message: content.trim(),
96
+ senderId: fromUser,
97
+ senderName: fromUser,
98
+ raw: xml,
99
+ };
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ }
106
+ exports.WeComAdapter = WeComAdapter;
@@ -0,0 +1,49 @@
1
+ import AIAgentProfileEntity from './model/ai-agent-profile.entity';
2
+ import AIApplicationEntity from './model/ai-application.entity';
3
+ import AIChatWorkspaceEntity from './model/ai-chat-workspace.entity';
4
+ import AIChatThreadEntity from './model/ai-chat-thread.entity';
5
+ import AIChatMessageEntity from './model/ai-chat-message.entity';
6
+ import AIMCPServerEntity from './model/ai-mcp-server.entity';
7
+ import AIModelConfigEntity from './model/ai-model-config.entity';
8
+ import AIKnowledgeBaseEntity from './model/ai-knowledge-base.entity';
9
+ import AIKBDocumentEntity from './model/ai-kb-document.entity';
10
+ /** 组件配置接口 */
11
+ export interface AIWorkstationConfig {
12
+ /** 是否启用,默认 true */
13
+ enabled?: boolean;
14
+ /** API 路由前缀,默认 '/api' */
15
+ prefix?: string;
16
+ /** 数据目录,默认 'data' */
17
+ dataDir?: string;
18
+ /** 按需开关各功能模块 */
19
+ features?: {
20
+ agent?: boolean;
21
+ chat?: boolean;
22
+ agentProfile?: boolean;
23
+ application?: boolean;
24
+ mcpServer?: boolean;
25
+ modelConfig?: boolean;
26
+ settings?: boolean;
27
+ security?: boolean;
28
+ automation?: boolean;
29
+ connectors?: boolean;
30
+ a2a?: boolean;
31
+ channels?: boolean;
32
+ observability?: boolean;
33
+ knowledgeBase?: boolean;
34
+ };
35
+ }
36
+ /** 所有 AI 实体列表(用于 TypeORM 自动注册) */
37
+ export declare const AI_ENTITIES: (typeof AIAgentProfileEntity | typeof AIApplicationEntity | typeof AIChatWorkspaceEntity | typeof AIChatThreadEntity | typeof AIChatMessageEntity | typeof AIMCPServerEntity | typeof AIModelConfigEntity | typeof AIKnowledgeBaseEntity | typeof AIKBDocumentEntity)[];
38
+ /**
39
+ * AI Workstation MidwayJS 组件
40
+ *
41
+ * 使用 @Configuration 装饰器声明为 MidwayJS 组件,
42
+ * 框架会自动扫描并注册所有标注了 @Provide / @Controller 的类。
43
+ */
44
+ export declare class AIWorkstationComponent {
45
+ config: AIWorkstationConfig;
46
+ onInit(): Promise<void>;
47
+ /** 根据功能开关返回需要注册的实体 */
48
+ private getEnabledEntities;
49
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AIWorkstationComponent = exports.AI_ENTITIES = void 0;
16
+ /**
17
+ * AI Workstation Component — MidwayJS 组件入口
18
+ *
19
+ * 作为 MidwayJS Component 加载时:
20
+ * 1. 自动注册所有 AI 实体到 TypeORM
21
+ * 2. 自动注册所有 AI 服务到 IoC 容器
22
+ * 3. 自动注册所有 AI 控制器(路由自动挂载)
23
+ * 4. 支持按 features 配置开关各功能模块
24
+ *
25
+ * 新项目只需在 configuration.ts 中:
26
+ * imports: [baseMidwayjs, orm, aiMidway]
27
+ * 即可获得全部 AI 能力。
28
+ */
29
+ const core_1 = require("@midwayjs/core");
30
+ // 实体
31
+ const ai_agent_profile_entity_1 = __importDefault(require("./model/ai-agent-profile.entity"));
32
+ const ai_application_entity_1 = __importDefault(require("./model/ai-application.entity"));
33
+ const ai_chat_workspace_entity_1 = __importDefault(require("./model/ai-chat-workspace.entity"));
34
+ const ai_chat_thread_entity_1 = __importDefault(require("./model/ai-chat-thread.entity"));
35
+ const ai_chat_message_entity_1 = __importDefault(require("./model/ai-chat-message.entity"));
36
+ const ai_mcp_server_entity_1 = __importDefault(require("./model/ai-mcp-server.entity"));
37
+ const ai_model_config_entity_1 = __importDefault(require("./model/ai-model-config.entity"));
38
+ const ai_knowledge_base_entity_1 = __importDefault(require("./model/ai-knowledge-base.entity"));
39
+ const ai_kb_document_entity_1 = __importDefault(require("./model/ai-kb-document.entity"));
40
+ /** 所有 AI 实体列表(用于 TypeORM 自动注册) */
41
+ exports.AI_ENTITIES = [
42
+ ai_agent_profile_entity_1.default,
43
+ ai_application_entity_1.default,
44
+ ai_chat_workspace_entity_1.default,
45
+ ai_chat_thread_entity_1.default,
46
+ ai_chat_message_entity_1.default,
47
+ ai_mcp_server_entity_1.default,
48
+ ai_model_config_entity_1.default,
49
+ ai_knowledge_base_entity_1.default,
50
+ ai_kb_document_entity_1.default,
51
+ ];
52
+ /**
53
+ * AI Workstation MidwayJS 组件
54
+ *
55
+ * 使用 @Configuration 装饰器声明为 MidwayJS 组件,
56
+ * 框架会自动扫描并注册所有标注了 @Provide / @Controller 的类。
57
+ */
58
+ let AIWorkstationComponent = class AIWorkstationComponent {
59
+ async onInit() {
60
+ if (this.config?.enabled === false) {
61
+ return;
62
+ }
63
+ // 将 AI 实体注册到 TypeORM 组件
64
+ // MidwayJS TypeORM 组件支持通过 orm.entities 配置注册实体
65
+ const entities = this.getEnabledEntities();
66
+ // 通过全局配置注入实体
67
+ global.__AI_MIDWAY_ENTITIES__ = entities;
68
+ }
69
+ /** 根据功能开关返回需要注册的实体 */
70
+ getEnabledEntities() {
71
+ const features = this.config?.features || {};
72
+ const entities = [];
73
+ if (features.application !== false)
74
+ entities.push(ai_application_entity_1.default);
75
+ if (features.agentProfile !== false)
76
+ entities.push(ai_agent_profile_entity_1.default);
77
+ if (features.chat !== false) {
78
+ entities.push(ai_chat_workspace_entity_1.default);
79
+ entities.push(ai_chat_thread_entity_1.default);
80
+ entities.push(ai_chat_message_entity_1.default);
81
+ }
82
+ if (features.mcpServer !== false)
83
+ entities.push(ai_mcp_server_entity_1.default);
84
+ if (features.modelConfig !== false)
85
+ entities.push(ai_model_config_entity_1.default);
86
+ if (features.knowledgeBase !== false) {
87
+ entities.push(ai_knowledge_base_entity_1.default);
88
+ entities.push(ai_kb_document_entity_1.default);
89
+ }
90
+ return entities;
91
+ }
92
+ };
93
+ exports.AIWorkstationComponent = AIWorkstationComponent;
94
+ __decorate([
95
+ (0, core_1.Config)('aiMidway'),
96
+ __metadata("design:type", Object)
97
+ ], AIWorkstationComponent.prototype, "config", void 0);
98
+ exports.AIWorkstationComponent = AIWorkstationComponent = __decorate([
99
+ (0, core_1.Configuration)({
100
+ namespace: 'aiMidway',
101
+ importConfigs: [
102
+ {
103
+ default: {
104
+ aiMidway: {
105
+ enabled: true,
106
+ prefix: '/api',
107
+ dataDir: 'data',
108
+ features: {
109
+ agent: true,
110
+ chat: true,
111
+ agentProfile: true,
112
+ application: true,
113
+ mcpServer: true,
114
+ modelConfig: true,
115
+ settings: true,
116
+ security: true,
117
+ automation: true,
118
+ connectors: true,
119
+ a2a: true,
120
+ channels: true,
121
+ observability: true,
122
+ knowledgeBase: true,
123
+ },
124
+ },
125
+ },
126
+ },
127
+ ],
128
+ })
129
+ ], AIWorkstationComponent);
@@ -0,0 +1,19 @@
1
+ import type { DataSourceConfig, DiscoveredTool, ConnectionTestResult, DataSourceAdapter, MCPServerConfig } from './types';
2
+ export declare class CalendarAdapter implements DataSourceAdapter {
3
+ readonly type: "calendar";
4
+ testConnection(config: DataSourceConfig): Promise<ConnectionTestResult>;
5
+ discoverTools(config: DataSourceConfig): Promise<DiscoveredTool[]>;
6
+ generateManifest(config: DataSourceConfig): Promise<{
7
+ tools: DiscoveredTool[];
8
+ metadata: {
9
+ calendarType: "local" | "caldav";
10
+ calendarName: string;
11
+ caldavUrl: string;
12
+ };
13
+ }>;
14
+ generateMCPServerConfigs(config: DataSourceConfig): Promise<MCPServerConfig[]>;
15
+ /** 测试本地日历 */
16
+ private testLocal;
17
+ /** 测试 CalDAV 连接 */
18
+ private testCalDAV;
19
+ }
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CalendarAdapter = void 0;
37
+ /**
38
+ * 日历适配器
39
+ *
40
+ * 支持 local(本地文件存储)和 caldav(CalDAV 服务器)两种模式。
41
+ * testConnection 检查日历可访问性,discoverTools 生成日历管理工具。
42
+ */
43
+ const fs = __importStar(require("fs/promises"));
44
+ const path = __importStar(require("path"));
45
+ class CalendarAdapter {
46
+ constructor() {
47
+ this.type = 'calendar';
48
+ }
49
+ async testConnection(config) {
50
+ if (config.calendarType === 'caldav') {
51
+ return this.testCalDAV(config);
52
+ }
53
+ return this.testLocal(config);
54
+ }
55
+ async discoverTools(config) {
56
+ return [
57
+ {
58
+ name: 'calendar_list_events',
59
+ description: `列出日历事件(${config.calendarName || 'default'})`,
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: {
63
+ startDate: {
64
+ type: 'string',
65
+ description: '开始日期 (ISO 8601)',
66
+ },
67
+ endDate: {
68
+ type: 'string',
69
+ description: '结束日期 (ISO 8601)',
70
+ },
71
+ limit: {
72
+ type: 'number',
73
+ description: '返回事件数',
74
+ default: 50,
75
+ },
76
+ },
77
+ },
78
+ },
79
+ {
80
+ name: 'calendar_create_event',
81
+ description: '创建日历事件',
82
+ inputSchema: {
83
+ type: 'object',
84
+ properties: {
85
+ title: {
86
+ type: 'string',
87
+ description: '事件标题',
88
+ },
89
+ start: {
90
+ type: 'string',
91
+ description: '开始时间 (ISO 8601)',
92
+ },
93
+ end: {
94
+ type: 'string',
95
+ description: '结束时间 (ISO 8601)',
96
+ },
97
+ description: {
98
+ type: 'string',
99
+ description: '事件描述',
100
+ },
101
+ location: {
102
+ type: 'string',
103
+ description: '事件地点',
104
+ },
105
+ attendees: {
106
+ type: 'array',
107
+ items: { type: 'string' },
108
+ description: '参与者邮箱列表',
109
+ },
110
+ },
111
+ required: ['title', 'start', 'end'],
112
+ },
113
+ },
114
+ {
115
+ name: 'calendar_delete_event',
116
+ description: '删除日历事件',
117
+ inputSchema: {
118
+ type: 'object',
119
+ properties: {
120
+ eventId: {
121
+ type: 'string',
122
+ description: '事件 ID',
123
+ },
124
+ },
125
+ required: ['eventId'],
126
+ },
127
+ },
128
+ {
129
+ name: 'calendar_update_event',
130
+ description: '更新日历事件',
131
+ inputSchema: {
132
+ type: 'object',
133
+ properties: {
134
+ eventId: {
135
+ type: 'string',
136
+ description: '事件 ID',
137
+ },
138
+ title: { type: 'string' },
139
+ start: { type: 'string' },
140
+ end: { type: 'string' },
141
+ description: { type: 'string' },
142
+ location: { type: 'string' },
143
+ },
144
+ required: ['eventId'],
145
+ },
146
+ },
147
+ ];
148
+ }
149
+ async generateManifest(config) {
150
+ const tools = await this.discoverTools(config);
151
+ return {
152
+ tools,
153
+ metadata: {
154
+ calendarType: config.calendarType,
155
+ calendarName: config.calendarName,
156
+ caldavUrl: config.caldavUrl,
157
+ },
158
+ };
159
+ }
160
+ async generateMCPServerConfigs(config) {
161
+ const tools = await this.discoverTools(config);
162
+ return [
163
+ {
164
+ name: `calendar-${config.name || 'default'}`,
165
+ transport: 'stdio',
166
+ command: 'node',
167
+ args: ['-e', '/* MCP server for calendar */'],
168
+ env: {
169
+ CALENDAR_TYPE: config.calendarType || 'local',
170
+ CALDAV_URL: config.caldavUrl || '',
171
+ CALENDAR_NAME: config.calendarName || '',
172
+ CAL_USER: config.emailAddress || '',
173
+ CAL_PASS: config.password || '',
174
+ },
175
+ tools,
176
+ },
177
+ ];
178
+ }
179
+ /** 测试本地日历 */
180
+ async testLocal(config) {
181
+ const dataDir = path.resolve(process.cwd(), 'data', 'calendars', config.name || 'default');
182
+ try {
183
+ await fs.mkdir(dataDir, { recursive: true });
184
+ return {
185
+ success: true,
186
+ message: `本地日历目录就绪: ${dataDir}`,
187
+ resources: [],
188
+ };
189
+ }
190
+ catch (err) {
191
+ return {
192
+ success: false,
193
+ message: '无法创建日历目录',
194
+ error: err.message,
195
+ };
196
+ }
197
+ }
198
+ /** 测试 CalDAV 连接 */
199
+ async testCalDAV(config) {
200
+ try {
201
+ const resp = await fetch(config.caldavUrl, {
202
+ method: 'PROPFIND',
203
+ headers: {
204
+ 'Content-Type': 'application/xml',
205
+ Depth: '1',
206
+ ...(config.username && config.password
207
+ ? {
208
+ Authorization: `Basic ${Buffer.from(`${config.username}:${config.password}`).toString('base64')}`,
209
+ }
210
+ : {}),
211
+ },
212
+ body: '<?xml version="1.0"?><d:propfind xmlns:d="DAV:"><d:prop><d:displayname/></d:prop></d:propfind>',
213
+ signal: AbortSignal.timeout(10000),
214
+ });
215
+ if (resp.ok || resp.status === 207) {
216
+ return {
217
+ success: true,
218
+ message: 'CalDAV 服务器连接成功',
219
+ resources: [config.calendarName || 'default'],
220
+ };
221
+ }
222
+ return {
223
+ success: false,
224
+ message: `CalDAV 返回 HTTP ${resp.status}`,
225
+ };
226
+ }
227
+ catch (err) {
228
+ return {
229
+ success: false,
230
+ message: 'CalDAV 连接失败',
231
+ error: err.message,
232
+ };
233
+ }
234
+ }
235
+ }
236
+ exports.CalendarAdapter = CalendarAdapter;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 数据库适配器
3
+ *
4
+ * 支持 MySQL / PostgreSQL(通过 TypeORM DataSource)和 MongoDB(动态 require)。
5
+ * testConnection 连接并列出表,discoverTools 为每张表生成 query / describe 工具。
6
+ */
7
+ import type { DataSourceConfig, DiscoveredTool, ConnectionTestResult, DataSourceAdapter, MCPServerConfig } from './types';
8
+ export declare class DatabaseAdapter implements DataSourceAdapter {
9
+ readonly type: "database";
10
+ testConnection(config: DataSourceConfig): Promise<ConnectionTestResult>;
11
+ discoverTools(config: DataSourceConfig): Promise<DiscoveredTool[]>;
12
+ generateManifest(config: DataSourceConfig): Promise<{
13
+ tools: DiscoveredTool[];
14
+ metadata: {
15
+ dbType: "mysql" | "postgres" | "mongodb";
16
+ database: string;
17
+ host: string;
18
+ tableCount: number;
19
+ };
20
+ }>;
21
+ generateMCPServerConfigs(config: DataSourceConfig): Promise<MCPServerConfig[]>;
22
+ /** 列出所有表 */
23
+ private listTables;
24
+ /** 列出 SQL 表(MySQL / PostgreSQL) */
25
+ private listSQLTables;
26
+ /** 列出 MongoDB 集合 */
27
+ private listMongoCollections;
28
+ }