apifox-workspace-mcp 1.1.6 → 2.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.
Files changed (75) hide show
  1. package/dist/__tests__/url-parser.test.js +3 -1
  2. package/dist/__tests__/url-parser.test.js.map +1 -1
  3. package/dist/core/cache/index.d.ts +2 -2
  4. package/dist/core/cache/index.d.ts.map +1 -1
  5. package/dist/core/cache/index.js +2 -2
  6. package/dist/core/cache/index.js.map +1 -1
  7. package/dist/core/cache/unified-cache-manager.d.ts +2 -1
  8. package/dist/core/cache/unified-cache-manager.d.ts.map +1 -1
  9. package/dist/core/cache/unified-cache-manager.js +36 -9
  10. package/dist/core/cache/unified-cache-manager.js.map +1 -1
  11. package/dist/core/client/mcp-bridge.d.ts +1 -1
  12. package/dist/core/client/mcp-bridge.d.ts.map +1 -1
  13. package/dist/core/client/mcp-bridge.js +10 -6
  14. package/dist/core/client/mcp-bridge.js.map +1 -1
  15. package/dist/core/index.d.ts +0 -2
  16. package/dist/core/index.d.ts.map +1 -1
  17. package/dist/core/index.js +0 -2
  18. package/dist/core/index.js.map +1 -1
  19. package/dist/core/parser/md-parser.js +294 -85
  20. package/dist/core/parser/md-parser.js.map +1 -1
  21. package/dist/core/parser/url.d.ts.map +1 -1
  22. package/dist/core/parser/url.js +90 -22
  23. package/dist/core/parser/url.js.map +1 -1
  24. package/dist/server/handlers/error-handler.d.ts +26 -0
  25. package/dist/server/handlers/error-handler.d.ts.map +1 -0
  26. package/dist/server/handlers/error-handler.js +87 -0
  27. package/dist/server/handlers/error-handler.js.map +1 -0
  28. package/dist/server/handlers/generate-artifacts.d.ts.map +1 -1
  29. package/dist/server/handlers/generate-artifacts.js +40 -6
  30. package/dist/server/handlers/generate-artifacts.js.map +1 -1
  31. package/dist/server/handlers/get-interface-detail.d.ts.map +1 -1
  32. package/dist/server/handlers/get-interface-detail.js +11 -3
  33. package/dist/server/handlers/get-interface-detail.js.map +1 -1
  34. package/dist/server/handlers/index.d.ts +0 -1
  35. package/dist/server/handlers/index.d.ts.map +1 -1
  36. package/dist/server/handlers/index.js +0 -1
  37. package/dist/server/handlers/index.js.map +1 -1
  38. package/dist/server/handlers/list-project-interfaces.d.ts.map +1 -1
  39. package/dist/server/handlers/list-project-interfaces.js +74 -7
  40. package/dist/server/handlers/list-project-interfaces.js.map +1 -1
  41. package/dist/server/handlers/list-projects.d.ts.map +1 -1
  42. package/dist/server/handlers/list-projects.js +9 -2
  43. package/dist/server/handlers/list-projects.js.map +1 -1
  44. package/dist/server/handlers/parse-and-add-project.d.ts.map +1 -1
  45. package/dist/server/handlers/parse-and-add-project.js +13 -5
  46. package/dist/server/handlers/parse-and-add-project.js.map +1 -1
  47. package/dist/server/handlers/query-interfaces.d.ts.map +1 -1
  48. package/dist/server/handlers/query-interfaces.js +15 -13
  49. package/dist/server/handlers/query-interfaces.js.map +1 -1
  50. package/dist/server/handlers/select-interfaces.d.ts +13 -1
  51. package/dist/server/handlers/select-interfaces.d.ts.map +1 -1
  52. package/dist/server/handlers/select-interfaces.js +13 -4
  53. package/dist/server/handlers/select-interfaces.js.map +1 -1
  54. package/dist/server/handlers/utils.d.ts.map +1 -1
  55. package/dist/server/handlers/utils.js +10 -2
  56. package/dist/server/handlers/utils.js.map +1 -1
  57. package/dist/server/index.js +29 -43
  58. package/dist/server/index.js.map +1 -1
  59. package/package.json +7 -5
  60. package/dist/__tests__/intent.test.d.ts +0 -2
  61. package/dist/__tests__/intent.test.d.ts.map +0 -1
  62. package/dist/__tests__/intent.test.js +0 -58
  63. package/dist/__tests__/intent.test.js.map +0 -1
  64. package/dist/core/cache/interface-cache-manager.d.ts +0 -118
  65. package/dist/core/cache/interface-cache-manager.d.ts.map +0 -1
  66. package/dist/core/cache/interface-cache-manager.js +0 -236
  67. package/dist/core/cache/interface-cache-manager.js.map +0 -1
  68. package/dist/core/intent.d.ts +0 -27
  69. package/dist/core/intent.d.ts.map +0 -1
  70. package/dist/core/intent.js +0 -214
  71. package/dist/core/intent.js.map +0 -1
  72. package/dist/server/handlers/assistant.d.ts +0 -20
  73. package/dist/server/handlers/assistant.d.ts.map +0 -1
  74. package/dist/server/handlers/assistant.js +0 -98
  75. package/dist/server/handlers/assistant.js.map +0 -1
@@ -1,236 +0,0 @@
1
- /**
2
- * 接口基础信息缓存管理器
3
- *
4
- * 按目录层级组织接口缓存,只缓存基础信息(id, name, method, path, description)
5
- * 不缓存接口详情,确保详情始终是最新的
6
- */
7
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
8
- import { dirname, join } from 'path';
9
- /**
10
- * 接口缓存管理器
11
- */
12
- export class InterfaceCacheManager {
13
- cachePath;
14
- cache;
15
- constructor(projectRoot) {
16
- const cacheDir = join(projectRoot, '.cursor', 'tmp');
17
- this.cachePath = join(cacheDir, 'apifox-interfaces-cache.json');
18
- this.cache = this.loadCache();
19
- }
20
- /**
21
- * 加载缓存文件
22
- */
23
- loadCache() {
24
- if (!existsSync(this.cachePath)) {
25
- return {};
26
- }
27
- try {
28
- const content = readFileSync(this.cachePath, 'utf-8');
29
- return JSON.parse(content);
30
- }
31
- catch (error) {
32
- console.error('加载接口缓存失败:', error);
33
- return {};
34
- }
35
- }
36
- /**
37
- * 保存缓存到文件
38
- */
39
- saveCache() {
40
- try {
41
- const dir = dirname(this.cachePath);
42
- if (!existsSync(dir)) {
43
- mkdirSync(dir, { recursive: true });
44
- }
45
- writeFileSync(this.cachePath, JSON.stringify(this.cache, null, 2), 'utf-8');
46
- }
47
- catch (error) {
48
- console.error('保存接口缓存失败:', error);
49
- }
50
- }
51
- /**
52
- * 解析目录路径为层级数组
53
- *
54
- * 例如:
55
- * - "Invoice > Info" -> ["Invoice", "Info"]
56
- * - "APP API company subscribe" -> ["APP API company subscribe"]
57
- * - "" -> [""] (根目录)
58
- *
59
- * @param folderPath 目录路径,使用 " > " 分隔多级目录
60
- * @returns 目录层级数组
61
- */
62
- parseFolderPath(folderPath) {
63
- if (!folderPath || folderPath.trim() === '') {
64
- return ['']; // 根目录
65
- }
66
- // 使用 " > " 分隔多级目录
67
- return folderPath
68
- .split(' > ')
69
- .map((s) => s.trim())
70
- .filter((s) => s !== '');
71
- }
72
- /**
73
- * 将接口添加到缓存
74
- *
75
- * @param projectId 项目 ID
76
- * @param folderPath 目录路径(如 "Invoice > Info")
77
- * @param interfaceInfo 接口基础信息
78
- */
79
- addInterface(projectId, folderPath, interfaceInfo) {
80
- if (!this.cache[projectId]) {
81
- this.cache[projectId] = {};
82
- }
83
- const folders = this.parseFolderPath(folderPath);
84
- let current = this.cache[projectId];
85
- // 构建嵌套结构
86
- for (let i = 0; i < folders.length; i++) {
87
- const folder = folders[i];
88
- if (i === folders.length - 1) {
89
- // 最后一层,存储接口数组
90
- if (!current[folder] || !Array.isArray(current[folder])) {
91
- current[folder] = [];
92
- }
93
- const interfaces = current[folder];
94
- // 检查是否已存在(避免重复)
95
- const existingIndex = interfaces.findIndex((i) => i.id === interfaceInfo.id);
96
- if (existingIndex >= 0) {
97
- // 更新现有接口信息
98
- interfaces[existingIndex] = interfaceInfo;
99
- }
100
- else {
101
- // 添加新接口
102
- interfaces.push(interfaceInfo);
103
- }
104
- }
105
- else {
106
- // 中间层,创建嵌套对象
107
- if (!current[folder] ||
108
- typeof current[folder] !== 'object' ||
109
- Array.isArray(current[folder])) {
110
- current[folder] = {};
111
- }
112
- current = current[folder];
113
- }
114
- }
115
- this.saveCache();
116
- }
117
- /**
118
- * 批量添加接口到缓存
119
- *
120
- * @param projectId 项目 ID
121
- * @param interfaces 接口列表(包含 folderPath)
122
- */
123
- addInterfaces(projectId, interfaces) {
124
- for (const iface of interfaces) {
125
- const folderPath = iface.folderPath || '';
126
- this.addInterface(projectId, folderPath, {
127
- id: iface.id,
128
- name: iface.name,
129
- method: iface.method,
130
- path: iface.path,
131
- description: iface.description,
132
- });
133
- }
134
- }
135
- /**
136
- * 获取项目下所有缓存的接口(按目录层级组织)
137
- *
138
- * @param projectId 项目 ID
139
- * @returns 按目录层级组织的接口结构,如果项目不存在则返回 undefined
140
- */
141
- getInterfacesByProject(projectId) {
142
- return this.cache[projectId];
143
- }
144
- /**
145
- * 将嵌套的接口结构扁平化为数组
146
- *
147
- * @param nested 嵌套的接口结构
148
- * @returns 扁平化的接口数组(包含 folderPath)
149
- */
150
- flattenInterfaces(nested) {
151
- const result = [];
152
- const traverse = (obj, currentPath = []) => {
153
- if (Array.isArray(obj)) {
154
- // 找到接口数组
155
- const folderPath = currentPath.join(' > ');
156
- for (const iface of obj) {
157
- if (this.isInterfaceBasicInfo(iface)) {
158
- result.push({
159
- ...iface,
160
- folderPath,
161
- });
162
- }
163
- }
164
- }
165
- else if (typeof obj === 'object' && obj !== null) {
166
- // 继续遍历嵌套对象
167
- for (const [key, value] of Object.entries(obj)) {
168
- traverse(value, [...currentPath, key]);
169
- }
170
- }
171
- };
172
- traverse(nested);
173
- return result;
174
- }
175
- /**
176
- * 检查对象是否为接口基础信息
177
- */
178
- isInterfaceBasicInfo(obj) {
179
- return (typeof obj === 'object' &&
180
- obj !== null &&
181
- 'id' in obj &&
182
- 'name' in obj &&
183
- 'method' in obj &&
184
- 'path' in obj &&
185
- typeof obj.id === 'string' &&
186
- typeof obj.name === 'string' &&
187
- typeof obj.method === 'string' &&
188
- typeof obj.path === 'string');
189
- }
190
- /**
191
- * 根据接口 ID 查找接口基础信息
192
- *
193
- * @param projectId 项目 ID
194
- * @param interfaceId 接口 ID
195
- * @returns 接口基础信息,如果未找到则返回 null
196
- */
197
- findInterfaceById(projectId, interfaceId) {
198
- const projectCache = this.cache[projectId];
199
- if (!projectCache) {
200
- return null;
201
- }
202
- // 递归查找
203
- const search = (obj) => {
204
- if (Array.isArray(obj)) {
205
- const found = obj.find((i) => this.isInterfaceBasicInfo(i) && i.id === interfaceId);
206
- return found || null;
207
- }
208
- if (typeof obj === 'object' && obj !== null) {
209
- for (const value of Object.values(obj)) {
210
- const result = search(value);
211
- if (result) {
212
- return result;
213
- }
214
- }
215
- }
216
- return null;
217
- };
218
- return search(projectCache);
219
- }
220
- /**
221
- * 清空项目的缓存
222
- *
223
- * @param projectId 项目 ID
224
- */
225
- clearProject(projectId) {
226
- delete this.cache[projectId];
227
- this.saveCache();
228
- }
229
- /**
230
- * 获取缓存文件路径
231
- */
232
- getCachePath() {
233
- return this.cachePath;
234
- }
235
- }
236
- //# sourceMappingURL=interface-cache-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interface-cache-manager.js","sourceRoot":"","sources":["../../../src/core/cache/interface-cache-manager.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- export type IntentAction = 'listProjects' | 'listProjectInterfaces' | 'searchInterfaces' | 'getInterfaceDetail' | 'generateArtifacts' | 'selectInterfaces' | 'getVersion' | 'help' | 'unknown';
2
- export interface IntentResult {
3
- action: IntentAction;
4
- keyword?: string;
5
- projectName?: string;
6
- projectId?: string;
7
- shareId?: string;
8
- interfaceId?: string;
9
- artifactType?: 'ts_types' | 'mock_data' | 'request_wrappers' | 'test_scripts';
10
- targetName?: string;
11
- selectionCriteria?: SelectionCriteria;
12
- url?: string;
13
- }
14
- export interface SelectionCriteria {
15
- indices?: number[];
16
- ranges?: Array<{
17
- start: number;
18
- end: number;
19
- }>;
20
- keywords?: string[];
21
- names?: string[];
22
- }
23
- export declare function parseIntent(promptRaw: string, context?: {
24
- lastProjectName?: string;
25
- lastInterfaceListNames?: string[];
26
- }): IntentResult;
27
- //# sourceMappingURL=intent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/core/intent.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,uBAAuB,GACvB,kBAAkB,GAClB,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,YAAY,GACZ,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,kBAAkB,GAAG,cAAc,CAAC;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAOD,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACxE,YAAY,CA2Gd"}
@@ -1,214 +0,0 @@
1
- const GENERATE_KEYWORDS = ['生成', '导出', '输出', 'mock', '类型', '封装', '代码'];
2
- const DETAIL_KEYWORDS = ['详情', '具体', '字段', '参数', '文档'];
3
- const SEARCH_KEYWORDS = ['查询', '搜索', '找', '接口列表', '有哪些', '列出'];
4
- const SELECT_KEYWORDS = ['选择', '勾选', '要这些', '要这些接口', '选中', '标记'];
5
- export function parseIntent(promptRaw, context) {
6
- const prompt = promptRaw.trim();
7
- if (!prompt) {
8
- return { action: 'help' };
9
- }
10
- // 优先检测 URL(如果 prompt 中包含 Apifox URL)
11
- const urlMatch = prompt.match(/https?:\/\/[^\s]+/);
12
- if (urlMatch) {
13
- const url = urlMatch[0];
14
- // 检查是否是 Apifox 分享链接格式
15
- if (/\/apidoc\/shared\//.test(url)) {
16
- // 提取 shareId 和 interfaceId
17
- const shareMatch = url.match(/\/apidoc\/shared\/([^\/]+)(?:\/api-([^\/]+))?/);
18
- if (shareMatch) {
19
- const shareId = shareMatch[1];
20
- const interfaceId = shareMatch[2];
21
- // 如果包含接口ID,识别为获取接口详情
22
- if (interfaceId) {
23
- return {
24
- action: 'getInterfaceDetail',
25
- interfaceId,
26
- shareId,
27
- url,
28
- };
29
- }
30
- // 否则是项目整体链接,列出所有接口
31
- return {
32
- action: 'listProjectInterfaces',
33
- shareId,
34
- url,
35
- };
36
- }
37
- }
38
- }
39
- // Detect select interfaces (natural language selection)
40
- if (SELECT_KEYWORDS.some((kw) => prompt.includes(kw))) {
41
- const criteria = parseSelectionCriteria(prompt, context?.lastInterfaceListNames);
42
- if (criteria) {
43
- return { action: 'selectInterfaces', selectionCriteria: criteria };
44
- }
45
- }
46
- // Detect generate artifacts
47
- // 检查是否包含生成关键词
48
- const hasGenerateKeyword = GENERATE_KEYWORDS.some((kw) => prompt.includes(kw));
49
- // 检查是否包含类型相关关键词
50
- const hasTypeKeyword = prompt.includes('类型') ||
51
- prompt.toLowerCase().includes('type') ||
52
- prompt.includes('mock') ||
53
- prompt.toLowerCase().includes('mock') ||
54
- prompt.includes('封装') ||
55
- prompt.toLowerCase().includes('request') ||
56
- prompt.includes('测试') ||
57
- prompt.toLowerCase().includes('test');
58
- if (hasGenerateKeyword && hasTypeKeyword) {
59
- const type = detectArtifactType(prompt);
60
- return {
61
- action: 'generateArtifacts',
62
- artifactType: type,
63
- targetName: extractInterfaceName(prompt, context?.lastInterfaceListNames),
64
- };
65
- }
66
- // Detect get detail by ID or name
67
- // 先检查是否有接口ID(api-xxx格式),优先级更高
68
- const interfaceId = extractInterfaceId(prompt);
69
- if (interfaceId) {
70
- return {
71
- action: 'getInterfaceDetail',
72
- interfaceId,
73
- targetName: undefined,
74
- };
75
- }
76
- if (DETAIL_KEYWORDS.some((kw) => prompt.includes(kw))) {
77
- return {
78
- action: 'getInterfaceDetail',
79
- interfaceId: undefined,
80
- targetName: extractInterfaceName(prompt, context?.lastInterfaceListNames),
81
- };
82
- }
83
- // Default search/list
84
- if (SEARCH_KEYWORDS.some((kw) => prompt.includes(kw)) || prompt.startsWith('接口')) {
85
- return {
86
- action: 'searchInterfaces',
87
- keyword: extractKeyword(prompt),
88
- };
89
- }
90
- if (prompt.includes('项目')) {
91
- return { action: 'listProjects' };
92
- }
93
- // 检测版本查询
94
- const versionKeywords = ['版本', 'version', '版本号', '当前版本', '什么版本'];
95
- if (versionKeywords.some((kw) => prompt.toLowerCase().includes(kw.toLowerCase()))) {
96
- return { action: 'getVersion' };
97
- }
98
- return { action: 'unknown' };
99
- }
100
- function detectArtifactType(prompt) {
101
- if (prompt.includes('mock')) {
102
- return 'mock_data';
103
- }
104
- if (prompt.includes('封装') || prompt.toLowerCase().includes('request')) {
105
- return 'request_wrappers';
106
- }
107
- if (prompt.includes('测试')) {
108
- return 'test_scripts';
109
- }
110
- return 'ts_types';
111
- }
112
- function extractInterfaceId(prompt) {
113
- // 匹配 api-12345 或 接口12345 或 12345 格式
114
- const match = prompt.match(/(?:api-|接口)?(\d{4,})/);
115
- return match ? match[1] : undefined;
116
- }
117
- function extractKeyword(prompt) {
118
- const trimmed = prompt
119
- .replace(/\/?apifox/gi, '')
120
- .replace(/接口列表|有哪些|搜索|查询|找|帮我|一下/g, '')
121
- .trim();
122
- return trimmed || undefined;
123
- }
124
- function extractInterfaceName(prompt, candidates) {
125
- if (!candidates || candidates.length === 0) {
126
- return undefined;
127
- }
128
- return (candidates.find((name) => prompt.includes(name)) ||
129
- candidates.find((name) => prompt.toLowerCase().includes(name.toLowerCase())));
130
- }
131
- /**
132
- * 解析选择条件
133
- * 支持多种表达方式:
134
- * - 编号:1, 3, 5 或 1-5 或 1,3,5-10
135
- * - 关键词:包含"支付"和"退款"的接口
136
- * - 名称:选择"退款接口"和"支付接口"
137
- */
138
- function parseSelectionCriteria(prompt, candidates) {
139
- const criteria = {};
140
- // 1. 解析编号选择(如:1, 3, 5 或 1-5 或 1,3,5-10)
141
- const numberPattern = /(\d+)(?:-(\d+))?/g;
142
- const numberMatches = Array.from(prompt.matchAll(numberPattern));
143
- if (numberMatches.length > 0) {
144
- const indices = [];
145
- const ranges = [];
146
- for (const match of numberMatches) {
147
- const start = parseInt(match[1], 10);
148
- const end = match[2] ? parseInt(match[2], 10) : null;
149
- if (end !== null) {
150
- // 范围选择
151
- ranges.push({ start, end: Math.max(start, end) });
152
- }
153
- else {
154
- // 单个编号
155
- indices.push(start);
156
- }
157
- }
158
- if (indices.length > 0) {
159
- criteria.indices = indices;
160
- }
161
- if (ranges.length > 0) {
162
- criteria.ranges = ranges;
163
- }
164
- }
165
- // 2. 解析关键词选择(如:包含"支付"和"退款")
166
- const keywordPatterns = [
167
- /包含["']?([^"']+)["']?/g,
168
- /["']([^"']+)["']/g,
169
- /(?:包含|选择|要)(?:.*?)(?:和|与|、)(.*?)(?:的|接口)/g,
170
- ];
171
- const keywords = [];
172
- for (const pattern of keywordPatterns) {
173
- const matches = Array.from(prompt.matchAll(pattern));
174
- for (const match of matches) {
175
- const keyword = match[1]?.trim();
176
- if (keyword && keyword.length > 1 && !keyword.match(/^\d+$/)) {
177
- keywords.push(keyword);
178
- }
179
- }
180
- }
181
- // 如果没有通过模式匹配到,尝试提取引号内的内容
182
- if (keywords.length === 0) {
183
- const quotedMatches = prompt.match(/["']([^"']+)["']/g);
184
- if (quotedMatches) {
185
- for (const quoted of quotedMatches) {
186
- const keyword = quoted.replace(/["']/g, '').trim();
187
- if (keyword.length > 1) {
188
- keywords.push(keyword);
189
- }
190
- }
191
- }
192
- }
193
- if (keywords.length > 0) {
194
- criteria.keywords = keywords;
195
- }
196
- // 3. 解析接口名称选择(从候选列表中匹配)
197
- if (candidates && candidates.length > 0) {
198
- const names = [];
199
- for (const candidate of candidates) {
200
- if (prompt.includes(candidate) || prompt.toLowerCase().includes(candidate.toLowerCase())) {
201
- names.push(candidate);
202
- }
203
- }
204
- if (names.length > 0) {
205
- criteria.names = names;
206
- }
207
- }
208
- // 如果没有任何选择条件,返回 null
209
- if (Object.keys(criteria).length === 0) {
210
- return null;
211
- }
212
- return criteria;
213
- }
214
- //# sourceMappingURL=intent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intent.js","sourceRoot":"","sources":["../../src/core/intent.ts"],"names":[],"mappings":"AA+BA,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvE,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvD,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAC/D,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEjE,MAAM,UAAU,WAAW,CACzB,SAAiB,EACjB,OAAyE;IAEzE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,qCAAqC;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,sBAAsB;QACtB,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,2BAA2B;YAC3B,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC9E,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAElC,qBAAqB;gBACrB,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO;wBACL,MAAM,EAAE,oBAAoB;wBAC5B,WAAW;wBACX,OAAO;wBACP,GAAG;qBACJ,CAAC;gBACJ,CAAC;gBACD,mBAAmB;gBACnB,OAAO;oBACL,MAAM,EAAE,uBAAuB;oBAC/B,OAAO;oBACP,GAAG;iBACJ,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC;QACjF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;QACrE,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,cAAc;IACd,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,gBAAgB;IAChB,MAAM,cAAc,GAClB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QACvB,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,kBAAkB,IAAI,cAAc,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO;YACL,MAAM,EAAE,mBAAmB;YAC3B,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,CAAC;SAC1E,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,8BAA8B;IAC9B,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,MAAM,EAAE,oBAAoB;YAC5B,WAAW;YACX,UAAU,EAAE,SAAS;SACtB,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO;YACL,MAAM,EAAE,oBAAoB;YAC5B,WAAW,EAAE,SAAS;YACtB,UAAU,EAAE,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,CAAC;SAC1E,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACjF,OAAO;YACL,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACpC,CAAC;IAED,SAAS;IACT,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjE,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACxC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACtE,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACxC,oCAAoC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,MAAM,OAAO,GAAG,MAAM;SACnB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;SACtC,IAAI,EAAE,CAAC;IACV,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc,EAAE,UAAqB;IACjE,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,CACL,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,sBAAsB,CAAC,MAAc,EAAE,UAAqB;IACnE,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,wCAAwC;IACxC,MAAM,aAAa,GAAG,mBAAmB,CAAC;IAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IAEjE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,MAAM,GAA0C,EAAE,CAAC;QAEzD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAErD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,OAAO;gBACP,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,OAAO;gBACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,eAAe,GAAG;QACtB,uBAAuB;QACvB,mBAAmB;QACnB,2CAA2C;KAC5C,CAAC;IAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACjC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7D,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACxD,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACnD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC/B,CAAC;IAED,wBAAwB;IACxB,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACzF,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,20 +0,0 @@
1
- import { ConfigManager, McpBridge, ContextStore } from '../../core/index.js';
2
- export interface AssistantArgs {
3
- prompt: string;
4
- }
5
- export interface AssistantContext {
6
- projectRoot: string;
7
- configManager: ConfigManager;
8
- mcpBridge: McpBridge;
9
- contextStore: ContextStore;
10
- }
11
- /**
12
- * 处理自然语言助手请求
13
- */
14
- export declare function handleAssistant(args: AssistantArgs, ctx: AssistantContext): Promise<{
15
- content: {
16
- type: string;
17
- text: string;
18
- }[];
19
- }>;
20
- //# sourceMappingURL=assistant.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/assistant.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,YAAY,EAGb,MAAM,qBAAqB,CAAC;AAkB7B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,gBAAgB;;;;;GA6G/E"}
@@ -1,98 +0,0 @@
1
- import { parseIntent, } from '../../core/index.js';
2
- import { readFileSync } from 'fs';
3
- import { join } from 'path';
4
- import { fileURLToPath } from 'url';
5
- import { dirname } from 'path';
6
- import { handleListProjects } from './list-projects.js';
7
- import { handleListProjectInterfaces } from './list-project-interfaces.js';
8
- import { handleQueryInterfaces } from './query-interfaces.js';
9
- import { handleGetInterfaceDetail } from './get-interface-detail.js';
10
- import { handleGenerateArtifacts } from './generate-artifacts.js';
11
- import { handleSelectInterfaces } from './select-interfaces.js';
12
- import { buildTextResponse } from './utils.js';
13
- // 获取项目根目录(MCP Server 的根目录)
14
- const __filename = fileURLToPath(import.meta.url);
15
- const __dirname = dirname(__filename);
16
- const serverRoot = join(__dirname, '../..');
17
- /**
18
- * 处理自然语言助手请求
19
- */
20
- export async function handleAssistant(args, ctx) {
21
- const { projectRoot, configManager, mcpBridge, contextStore } = ctx;
22
- const lastProject = contextStore.getLastProject();
23
- const lastList = contextStore.getLastInterfaceList();
24
- const intent = parseIntent(args.prompt, {
25
- lastProjectName: lastProject?.projectName,
26
- lastInterfaceListNames: lastList?.list.map((item) => item.name),
27
- });
28
- switch (intent.action) {
29
- case 'listProjects':
30
- return handleListProjects(projectRoot);
31
- case 'listProjectInterfaces':
32
- return handleListProjectInterfaces({
33
- shareId: intent.shareId,
34
- url: intent.url,
35
- projectName: intent.projectName,
36
- projectId: intent.projectId,
37
- }, { projectRoot, configManager, mcpBridge, contextStore });
38
- case 'searchInterfaces':
39
- return handleQueryInterfaces({
40
- projectName: intent.projectName ?? lastProject?.projectName,
41
- keyword: intent.keyword,
42
- }, { projectRoot, configManager, mcpBridge, contextStore });
43
- case 'getInterfaceDetail': {
44
- let targetId = intent.interfaceId;
45
- if (!targetId && intent.targetName && lastList) {
46
- const match = lastList.list.find((item) => item.name.toLowerCase().includes(intent.targetName.toLowerCase()));
47
- targetId = match?.id;
48
- }
49
- if (!targetId) {
50
- return buildTextResponse('告诉我接口名称或 ID,我就能把它的详情展示出来。');
51
- }
52
- return handleGetInterfaceDetail({
53
- projectName: intent.projectName ?? lastProject?.projectName,
54
- projectId: intent.projectId,
55
- shareId: intent.shareId,
56
- interfaceId: targetId,
57
- url: intent.url,
58
- }, { projectRoot, configManager, mcpBridge, contextStore });
59
- }
60
- case 'generateArtifacts': {
61
- const preselected = [];
62
- if (intent.targetName && lastList) {
63
- const match = lastList.list.find((item) => item.name.toLowerCase().includes(intent.targetName.toLowerCase()));
64
- if (match) {
65
- preselected.push(match.id);
66
- }
67
- }
68
- return handleGenerateArtifacts({
69
- projectName: intent.projectName ?? lastProject?.projectName,
70
- interfaceIds: preselected.length ? preselected : undefined,
71
- artifactType: intent.artifactType ?? 'ts_types',
72
- }, { projectRoot, configManager, mcpBridge, contextStore });
73
- }
74
- case 'selectInterfaces':
75
- return handleSelectInterfaces({
76
- projectName: intent.projectName ?? lastProject?.projectName,
77
- selectionCriteria: intent.selectionCriteria,
78
- }, { projectRoot, configManager, contextStore });
79
- case 'getVersion': {
80
- // 读取 package.json 中的版本信息
81
- try {
82
- const packageJsonPath = join(serverRoot, 'package.json');
83
- const packageJsonContent = readFileSync(packageJsonPath, 'utf-8');
84
- const packageJson = JSON.parse(packageJsonContent);
85
- const version = packageJson.version || 'unknown';
86
- return buildTextResponse(`当前 Apifox Workspace MCP Server 版本: **${version}**`);
87
- }
88
- catch (error) {
89
- return buildTextResponse(`无法获取版本信息: ${error instanceof Error ? error.message : String(error)}`);
90
- }
91
- }
92
- case 'help':
93
- case 'unknown':
94
- default:
95
- return buildTextResponse('我可以帮你搜索接口、查看详情、生成类型或 Mock 数据。比如说"/apifox 搜索支付接口"或"帮我生成退款接口的类型"。');
96
- }
97
- }
98
- //# sourceMappingURL=assistant.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../../../src/server/handlers/assistant.ts"],"names":[],"mappings":"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"}