apifox-workspace-mcp 1.1.6 → 1.2.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 (53) 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/intent.d.ts +2 -1
  16. package/dist/core/intent.d.ts.map +1 -1
  17. package/dist/core/intent.js +114 -21
  18. package/dist/core/intent.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/assistant.d.ts.map +1 -1
  25. package/dist/server/handlers/assistant.js +220 -10
  26. package/dist/server/handlers/assistant.js.map +1 -1
  27. package/dist/server/handlers/error-handler.d.ts +26 -0
  28. package/dist/server/handlers/error-handler.d.ts.map +1 -0
  29. package/dist/server/handlers/error-handler.js +78 -0
  30. package/dist/server/handlers/error-handler.js.map +1 -0
  31. package/dist/server/handlers/generate-artifacts.d.ts.map +1 -1
  32. package/dist/server/handlers/generate-artifacts.js +31 -5
  33. package/dist/server/handlers/generate-artifacts.js.map +1 -1
  34. package/dist/server/handlers/get-interface-detail.d.ts.map +1 -1
  35. package/dist/server/handlers/get-interface-detail.js +6 -2
  36. package/dist/server/handlers/get-interface-detail.js.map +1 -1
  37. package/dist/server/handlers/list-project-interfaces.d.ts.map +1 -1
  38. package/dist/server/handlers/list-project-interfaces.js +67 -6
  39. package/dist/server/handlers/list-project-interfaces.js.map +1 -1
  40. package/dist/server/handlers/parse-and-add-project.js +2 -2
  41. package/dist/server/handlers/parse-and-add-project.js.map +1 -1
  42. package/dist/server/handlers/query-interfaces.js +3 -3
  43. package/dist/server/handlers/query-interfaces.js.map +1 -1
  44. package/dist/server/handlers/utils.d.ts.map +1 -1
  45. package/dist/server/handlers/utils.js +10 -2
  46. package/dist/server/handlers/utils.js.map +1 -1
  47. package/dist/server/index.js +1 -1
  48. package/dist/server/index.js.map +1 -1
  49. package/package.json +7 -5
  50. package/dist/core/cache/interface-cache-manager.d.ts +0 -118
  51. package/dist/core/cache/interface-cache-manager.d.ts.map +0 -1
  52. package/dist/core/cache/interface-cache-manager.js +0 -236
  53. package/dist/core/cache/interface-cache-manager.js.map +0 -1
@@ -32,15 +32,14 @@ export async function extractRealProjectIdFromApiDoc(apiDocUrl) {
32
32
  // 格式: x-run-in-apifox: https://apifox.advai.net/web/project/{realProjectId}/apis/api-{interfaceId}-run
33
33
  const runInApifoxMatch = apiDocContent.match(/x-run-in-apifox:\s*https:\/\/[^\/]+\/web\/project\/(\d+)\//);
34
34
  if (!runInApifoxMatch) {
35
- console.error('无法从 API 文档中找到 x-run-in-apifox 字段');
35
+ // 使用 logger 替代 console.error
36
36
  return null;
37
37
  }
38
38
  const realProjectId = runInApifoxMatch[1];
39
- console.error(`✅ 从 API 文档中提取到真正的 projectId: ${realProjectId}`);
40
39
  return realProjectId;
41
40
  }
42
- catch (error) {
43
- console.error('从 API 文档提取 projectId 失败:', error instanceof Error ? error.message : String(error));
41
+ catch {
42
+ // 使用 logger 替代 console.error
44
43
  return null;
45
44
  }
46
45
  }
@@ -61,14 +60,14 @@ export async function extractRealProjectIdFromLlms(llmsUrl) {
61
60
  // 格式: https://apifox.advai.net/apidoc/shared/{shareId}/api-{interfaceId}.md
62
61
  const apiDocMatch = llmsContent.match(/https:\/\/[^\s]+\/api-(\d+)\.md/);
63
62
  if (!apiDocMatch) {
64
- console.error('无法从 LLM 文档中找到 API 文档链接');
63
+ // 无法从 LLM 文档中找到 API 文档链接,静默处理
65
64
  return null;
66
65
  }
67
66
  // 3. 构建 API 文档 URL
68
67
  const urlObj = new URL(llmsUrl);
69
68
  const shareId = urlObj.pathname.match(/\/apidoc\/shared\/([^\/]+)/)?.[1];
70
69
  if (!shareId) {
71
- console.error('无法从 LLM URL 中提取分享 ID');
70
+ // 无法从 LLM URL 中提取分享 ID,静默处理
72
71
  return null;
73
72
  }
74
73
  const apiDocUrl = `${urlObj.protocol}//${urlObj.host}/apidoc/shared/${shareId}/api-${apiDocMatch[1]}.md`;
@@ -82,8 +81,8 @@ export async function extractRealProjectIdFromLlms(llmsUrl) {
82
81
  firstApiDocUrl: apiDocUrl,
83
82
  };
84
83
  }
85
- catch (error) {
86
- console.error('从 LLM 文档提取 projectId 失败:', error instanceof Error ? error.message : String(error));
84
+ catch {
85
+ // 从 LLM 文档提取 projectId 失败,静默处理
87
86
  return null;
88
87
  }
89
88
  }
@@ -94,26 +93,84 @@ export async function extractRealProjectIdFromLlms(llmsUrl) {
94
93
  */
95
94
  async function extractProjectNameFromHtml(pageUrl) {
96
95
  try {
97
- const response = await axios.get(pageUrl, { timeout: 10000 });
98
- const html = response.data;
99
- const titleMatch = html.match(/<title>([\s\S]*?)<\/title>/i);
96
+ // 添加 Accept 头,确保获取 HTML 内容而不是 Markdown
97
+ const response = await axios.get(pageUrl, {
98
+ timeout: 10000,
99
+ headers: {
100
+ Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
101
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
102
+ },
103
+ });
104
+ const html = typeof response.data === 'string' ? response.data : String(response.data);
105
+ // 改进的正则表达式:支持 title 标签可能有属性,处理换行和空格
106
+ // 尝试多种匹配模式
107
+ let titleMatch = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
108
+ // 如果第一种模式失败,尝试更宽松的匹配(处理可能的 HTML 转义或格式问题)
109
+ if (!titleMatch) {
110
+ titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
111
+ }
112
+ // 如果还是失败,尝试查找 title 标签(可能跨多行)
100
113
  if (!titleMatch) {
114
+ // 使用更宽松的匹配,允许 title 标签内有任意内容
115
+ const titleStart = html.indexOf('<title');
116
+ if (titleStart !== -1) {
117
+ const titleEnd = html.indexOf('</title>', titleStart);
118
+ if (titleEnd !== -1) {
119
+ const titleTag = html.substring(titleStart, titleEnd);
120
+ const contentMatch = titleTag.match(/>([\s\S]+)$/);
121
+ if (contentMatch) {
122
+ titleMatch = [titleTag, contentMatch[1]];
123
+ }
124
+ }
125
+ }
126
+ }
127
+ if (!titleMatch || !titleMatch[1]) {
128
+ // 无法从 HTML 中提取 title 标签内容,静默处理
129
+ return { projectName: null, pageTitle: null };
130
+ }
131
+ // 清理提取的标题内容:去除 HTML 实体、多余空白
132
+ const title = titleMatch[1]
133
+ .replace(/&nbsp;/g, ' ')
134
+ .replace(/&amp;/g, '&')
135
+ .replace(/&lt;/g, '<')
136
+ .replace(/&gt;/g, '>')
137
+ .replace(/&quot;/g, '"')
138
+ .replace(/&#39;/g, "'")
139
+ .replace(/\s+/g, ' ') // 将多个空白字符替换为单个空格
140
+ .trim();
141
+ if (!title) {
101
142
  return { projectName: null, pageTitle: null };
102
143
  }
103
- const title = titleMatch[1].trim();
144
+ // 提取项目名称:查找最后一个 " - " 分隔符
104
145
  const delimiterIndex = title.lastIndexOf(' - ');
105
146
  let projectName = null;
106
147
  if (delimiterIndex !== -1) {
148
+ // 找到分隔符,提取后面的部分作为项目名称
107
149
  projectName = title.substring(delimiterIndex + 3).trim();
108
150
  }
109
151
  else {
110
- // 如果没有分隔符,尝试使用整个标题
111
- projectName = title || null;
152
+ // 如果没有分隔符,尝试其他常见的分隔符
153
+ const altDelimiters = [' | ', ' |', '| ', ' – ', ' — '];
154
+ for (const delimiter of altDelimiters) {
155
+ const altIndex = title.lastIndexOf(delimiter);
156
+ if (altIndex !== -1) {
157
+ projectName = title.substring(altIndex + delimiter.length).trim();
158
+ break;
159
+ }
160
+ }
161
+ // 如果仍然没有找到分隔符,使用整个标题作为项目名称
162
+ if (!projectName) {
163
+ projectName = title;
164
+ }
165
+ }
166
+ // 如果项目名称为空,使用整个标题
167
+ if (!projectName || projectName.length === 0) {
168
+ projectName = title;
112
169
  }
113
170
  return { projectName, pageTitle: title };
114
171
  }
115
- catch (error) {
116
- console.error('从分享页面解析项目名称失败:', error instanceof Error ? error.message : String(error));
172
+ catch {
173
+ // 从分享页面解析项目名称失败,静默处理
117
174
  return { projectName: null, pageTitle: null };
118
175
  }
119
176
  }
@@ -128,6 +185,10 @@ async function extractProjectNameFromHtml(pageUrl) {
128
185
  */
129
186
  export async function parseApifoxUrl(url) {
130
187
  try {
188
+ // 首先验证是否是 Apifox 链接
189
+ if (!isValidApifoxUrl(url)) {
190
+ throw new Error('不是有效的 Apifox 分享链接');
191
+ }
131
192
  const urlObj = new URL(url);
132
193
  const pathname = urlObj.pathname;
133
194
  const baseUrl = `${urlObj.protocol}//${urlObj.host}`;
@@ -141,7 +202,7 @@ export async function parseApifoxUrl(url) {
141
202
  // 从 LLM 文档中提取真正的 projectId
142
203
  const result = await extractRealProjectIdFromLlms(url);
143
204
  if (!result) {
144
- console.error('⚠️ 无法从 LLM 文档中提取真正的 projectId,使用分享 ID 作为后备');
205
+ // 无法从 LLM 文档中提取真正的 projectId,使用分享 ID 作为后备
145
206
  return {
146
207
  projectId: shareId,
147
208
  shareId,
@@ -192,7 +253,7 @@ export async function parseApifoxUrl(url) {
192
253
  }
193
254
  }
194
255
  if (!projectId) {
195
- console.error('⚠️ 无法从分享链接解析到真实 projectId,使用分享 ID 作为后备');
256
+ // 无法从分享链接解析到真实 projectId,使用分享 ID 作为后备
196
257
  projectId = shareId;
197
258
  }
198
259
  return {
@@ -208,8 +269,8 @@ export async function parseApifoxUrl(url) {
208
269
  firstApiDocUrl,
209
270
  };
210
271
  }
211
- catch (error) {
212
- console.error('解析 URL 失败:', error);
272
+ catch {
273
+ // 解析 URL 失败,错误已在上层处理
213
274
  return null;
214
275
  }
215
276
  }
@@ -221,9 +282,16 @@ export async function parseApifoxUrl(url) {
221
282
  export function isValidApifoxUrl(url) {
222
283
  try {
223
284
  const urlObj = new URL(url);
285
+ const hostname = urlObj.hostname.toLowerCase();
224
286
  const pathname = urlObj.pathname;
225
- // 检查是否是 /apidoc/shared/ 格式
226
- return /\/apidoc\/shared\//.test(pathname);
287
+ // 检查域名是否以 apifox 开头(支持 apifox.com, apifox.advai.net 等)
288
+ // 或者包含 .apifox. 或 .apifox(支持 example.apifox.com 等)
289
+ const isApifoxDomain = hostname.startsWith('apifox') ||
290
+ hostname.includes('.apifox.') ||
291
+ hostname.endsWith('.apifox');
292
+ // 检查路径是否是 /apidoc/shared/ 格式
293
+ const isValidPath = /\/apidoc\/shared\//.test(pathname);
294
+ return isApifoxDomain && isValidPath;
227
295
  }
228
296
  catch {
229
297
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/core/parser/url.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/core/parser/url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,uCAAuC;IACvC,oCAAmB,CAAA;IACnB,yDAAyD;IACzD,wCAAuB,CAAA;AACzB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AA4BD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,SAAiB;IACpE,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC;QAEhF,cAAc;QACd,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC;QAE1C,iCAAiC;QACjC,uGAAuG;QACvG,MAAM,gBAAgB,GAAG,aAAa,CAAC,KAAK,CAC1C,4DAA4D,CAC7D,CAAC;QACF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,6BAA6B;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC1C,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,OAAe;IAEf,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;QAEtC,6BAA6B;QAC7B,4EAA4E;QAC5E,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACzE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,8BAA8B;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,4BAA4B;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,kBAAkB,OAAO,QAAQ,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QAEzG,2BAA2B;QAC3B,MAAM,SAAS,GAAG,MAAM,8BAA8B,CAAC,SAAS,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,SAAS;YACT,cAAc,EAAE,SAAS;SAC1B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,0BAA0B,CACvC,OAAe;IAEf,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE;YACxC,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,iEAAiE;gBACzE,YAAY,EACV,uHAAuH;aAC1H;SACF,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEvF,oCAAoC;QACpC,WAAW;QACX,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAEhE,yCAAyC;QACzC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC3D,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,6BAA6B;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBACtD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;oBACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBACtD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBACnD,IAAI,YAAY,EAAE,CAAC;wBACjB,UAAU,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,+BAA+B;YAC/B,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChD,CAAC;QAED,4BAA4B;QAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;aACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,iBAAiB;aACtC,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChD,CAAC;QAED,0BAA0B;QAC1B,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,WAAW,GAAkB,IAAI,CAAC;QAEtC,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1B,sBAAsB;YACtB,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACxD,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBAC9C,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;oBACpB,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;oBAClE,MAAM;gBACR,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,WAAW,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;QACrB,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,oBAAoB;QACpB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAErD,0BAA0B;QAC1B,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAE9B,2BAA2B;YAC3B,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,0CAA0C;gBAC1C,OAAO;oBACL,SAAS,EAAE,OAAO;oBAClB,OAAO;oBACP,OAAO;oBACP,QAAQ,EAAE,aAAa,CAAC,OAAO;oBAC/B,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,GAAG;iBACb,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO;gBACP,OAAO;gBACP,QAAQ,EAAE,aAAa,CAAC,OAAO;gBAC/B,OAAO,EAAE,GAAG;gBACZ,OAAO,EAAE,GAAG;gBACZ,cAAc,EAAE,MAAM,CAAC,cAAc;aACtC,CAAC;QACJ,CAAC;QAED,mDAAmD;QACnD,8BAA8B;QAC9B,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAEpF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,GAAG,CAAC;QACpB,MAAM,OAAO,GAAG,GAAG,OAAO,kBAAkB,OAAO,WAAW,CAAC;QAE/D,SAAS;QACT,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC;QAE/E,cAAc;QACd,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAE7E,6BAA6B;QAC7B,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,cAAc,GAAuB,SAAS,CAAC;QAEnD,MAAM,UAAU,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,UAAU,EAAE,CAAC;YACf,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;YACjC,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC;QAC7C,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,SAAS,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,GAAG,OAAO,kBAAkB,OAAO,QAAQ,WAAW,EAAE,CAAC;YAC3E,SAAS,GAAG,MAAM,8BAA8B,CAAC,SAAS,CAAC,CAAC;YAC5D,IAAI,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;gBACjC,cAAc,GAAG,GAAG,SAAS,KAAK,CAAC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,sCAAsC;YACtC,SAAS,GAAG,OAAO,CAAC;QACtB,CAAC;QAED,OAAO;YACL,SAAS;YACT,OAAO;YACP,WAAW;YACX,OAAO;YACP,WAAW,EAAE,WAAW,IAAI,SAAS;YACrC,QAAQ;YACR,OAAO;YACP,OAAO;YACP,SAAS,EAAE,SAAS,IAAI,SAAS;YACjC,cAAc;SACf,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,uDAAuD;QACvD,mDAAmD;QACnD,MAAM,cAAc,GAClB,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC7B,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7B,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAE/B,6BAA6B;QAC7B,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExD,OAAO,cAAc,IAAI,WAAW,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -1 +1 @@
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
+ {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/assistant.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,YAAY,EAIb,MAAM,qBAAqB,CAAC;AAsD7B,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;;;;;GAuV/E"}
@@ -1,4 +1,4 @@
1
- import { parseIntent, } from '../../core/index.js';
1
+ import { parseIntent, UnifiedCacheManager, } from '../../core/index.js';
2
2
  import { readFileSync } from 'fs';
3
3
  import { join } from 'path';
4
4
  import { fileURLToPath } from 'url';
@@ -9,11 +9,40 @@ import { handleQueryInterfaces } from './query-interfaces.js';
9
9
  import { handleGetInterfaceDetail } from './get-interface-detail.js';
10
10
  import { handleGenerateArtifacts } from './generate-artifacts.js';
11
11
  import { handleSelectInterfaces } from './select-interfaces.js';
12
- import { buildTextResponse } from './utils.js';
12
+ import { buildTextResponse, resolveProjectInfo } from './utils.js';
13
+ import { findProjectRoot } from '../../lib/project-root.js';
14
+ // 用于智能推断的关键词常量
15
+ const GENERATE_KEYWORDS = ['生成', '导出', '输出', 'mock', '类型', '封装', '代码'];
16
+ /**
17
+ * 检测产物类型
18
+ */
19
+ function detectArtifactType(prompt) {
20
+ if (prompt.includes('mock')) {
21
+ return 'mock_data';
22
+ }
23
+ if (prompt.includes('封装') || prompt.toLowerCase().includes('request')) {
24
+ return 'request_wrappers';
25
+ }
26
+ if (prompt.includes('测试')) {
27
+ return 'test_scripts';
28
+ }
29
+ return 'ts_types';
30
+ }
31
+ /**
32
+ * 从 prompt 中提取搜索关键词
33
+ */
34
+ function extractSearchKeyword(prompt) {
35
+ // 移除常见的查询关键词
36
+ const cleaned = prompt.replace(/查询|搜索|找|帮我|一下|接口/g, '').trim();
37
+ return cleaned || undefined || '';
38
+ }
39
+ import { handleMissingProjectError, handleMissingInterfaceError, handleCacheNotFoundError, } from './error-handler.js';
13
40
  // 获取项目根目录(MCP Server 的根目录)
41
+ // 从当前文件位置向上查找,直到找到包含 package.json 的目录
14
42
  const __filename = fileURLToPath(import.meta.url);
15
43
  const __dirname = dirname(__filename);
16
- const serverRoot = join(__dirname, '../..');
44
+ // dist/server/handlers 向上查找项目根目录
45
+ const serverRoot = findProjectRoot(__dirname);
17
46
  /**
18
47
  * 处理自然语言助手请求
19
48
  */
@@ -28,12 +57,57 @@ export async function handleAssistant(args, ctx) {
28
57
  switch (intent.action) {
29
58
  case 'listProjects':
30
59
  return handleListProjects(projectRoot);
60
+ case 'countInterfaces': {
61
+ // 查询接口数量
62
+ let targetProjectName = intent.projectName || lastProject?.projectName;
63
+ let targetProjectId = intent.projectId || lastProject?.projectId;
64
+ // 如果还没有项目信息,尝试从缓存中查找
65
+ if (!targetProjectId && !targetProjectName) {
66
+ const cacheManager = new UnifiedCacheManager(projectRoot);
67
+ const projects = cacheManager.listProjects();
68
+ if (projects.length === 1) {
69
+ // 如果只有一个项目,使用它
70
+ targetProjectName = projects[0].name;
71
+ targetProjectId = projects[0].id;
72
+ }
73
+ else if (projects.length > 1 && lastProject) {
74
+ // 如果有多个项目,但上下文中有项目信息,使用上下文的
75
+ targetProjectName = lastProject.projectName;
76
+ targetProjectId = lastProject.projectId;
77
+ }
78
+ }
79
+ if (!targetProjectId && !targetProjectName) {
80
+ return buildTextResponse('无法确定项目信息。\n\n你可以:\n1. 提供项目 URL:直接粘贴项目的分享链接\n2. 或者先查询接口列表:说"列出所有接口"');
81
+ }
82
+ const cacheManager = new UnifiedCacheManager(projectRoot);
83
+ const projectInfo = resolveProjectInfo(projectRoot, contextStore, targetProjectName, targetProjectId);
84
+ if (!projectInfo || !projectInfo.projectId) {
85
+ return handleMissingProjectError({
86
+ lastProject,
87
+ projectRoot,
88
+ contextStore,
89
+ });
90
+ }
91
+ const cachedProject = cacheManager.findProjectById(projectInfo.projectId);
92
+ if (!cachedProject) {
93
+ return handleCacheNotFoundError(projectInfo.projectName || projectInfo.projectId, {
94
+ lastProject,
95
+ projectRoot,
96
+ contextStore,
97
+ });
98
+ }
99
+ const interfaceCount = cachedProject.interfaces.length;
100
+ return buildTextResponse(`**项目名称**: ${cachedProject.projectName}\n**项目 ID**: ${projectInfo.projectId}\n**接口数量**: ${interfaceCount} 个`);
101
+ }
31
102
  case 'listProjectInterfaces':
103
+ // 如果 intent 中没有指定项目,但上下文中有,使用上下文中的项目
104
+ const targetProjectName = intent.projectName || lastProject?.projectName;
105
+ const targetProjectId = intent.projectId || lastProject?.projectId;
32
106
  return handleListProjectInterfaces({
33
107
  shareId: intent.shareId,
34
108
  url: intent.url,
35
- projectName: intent.projectName,
36
- projectId: intent.projectId,
109
+ projectName: targetProjectName,
110
+ projectId: targetProjectId,
37
111
  }, { projectRoot, configManager, mcpBridge, contextStore });
38
112
  case 'searchInterfaces':
39
113
  return handleQueryInterfaces({
@@ -47,7 +121,11 @@ export async function handleAssistant(args, ctx) {
47
121
  targetId = match?.id;
48
122
  }
49
123
  if (!targetId) {
50
- return buildTextResponse('告诉我接口名称或 ID,我就能把它的详情展示出来。');
124
+ return handleMissingInterfaceError({
125
+ lastProject,
126
+ projectRoot,
127
+ contextStore,
128
+ }, intent.targetName);
51
129
  }
52
130
  return handleGetInterfaceDetail({
53
131
  projectName: intent.projectName ?? lastProject?.projectName,
@@ -59,7 +137,12 @@ export async function handleAssistant(args, ctx) {
59
137
  }
60
138
  case 'generateArtifacts': {
61
139
  const preselected = [];
62
- if (intent.targetName && lastList) {
140
+ // 优先使用从 prompt 中提取的接口 ID
141
+ if (intent.interfaceIds && intent.interfaceIds.length > 0) {
142
+ preselected.push(...intent.interfaceIds);
143
+ }
144
+ // 如果没有提取到 ID,尝试从接口名称匹配
145
+ if (preselected.length === 0 && intent.targetName && lastList) {
63
146
  const match = lastList.list.find((item) => item.name.toLowerCase().includes(intent.targetName.toLowerCase()));
64
147
  if (match) {
65
148
  preselected.push(match.id);
@@ -67,7 +150,7 @@ export async function handleAssistant(args, ctx) {
67
150
  }
68
151
  return handleGenerateArtifacts({
69
152
  projectName: intent.projectName ?? lastProject?.projectName,
70
- interfaceIds: preselected.length ? preselected : undefined,
153
+ interfaceIds: preselected.length > 0 ? preselected : undefined,
71
154
  artifactType: intent.artifactType ?? 'ts_types',
72
155
  }, { projectRoot, configManager, mcpBridge, contextStore });
73
156
  }
@@ -90,9 +173,136 @@ export async function handleAssistant(args, ctx) {
90
173
  }
91
174
  }
92
175
  case 'help':
176
+ return buildTextResponse('我可以帮你:\n\n' +
177
+ '1. 搜索接口:说"查询支付接口"或"搜索退款"(支持关键词搜索)\n' +
178
+ '2. 查看接口详情:提供接口的分享链接,或从查询结果中选择接口\n' +
179
+ '3. 生成接口类型:查询接口后选择,然后说"生成这些接口的类型"\n' +
180
+ '4. 列出所有接口:说"列出所有接口"或"显示接口列表"');
93
181
  case 'unknown':
94
- default:
95
- return buildTextResponse('我可以帮你搜索接口、查看详情、生成类型或 Mock 数据。比如说"/apifox 搜索支付接口"或"帮我生成退款接口的类型"。');
182
+ default: {
183
+ // 检查是否是无效的 URL
184
+ if (intent.url && !intent.url.includes('/apidoc/shared/')) {
185
+ return buildTextResponse(`❌ 检测到非 Apifox 链接: ${intent.url}\n\n请提供有效的 Apifox 分享链接。`);
186
+ }
187
+ // 智能推断用户意图并尝试处理
188
+ const prompt = args.prompt.trim();
189
+ // 1. 检查是否包含生成关键词 + 路径模式(如"生成/api/xxx的类型")
190
+ const hasGenerateKeyword = GENERATE_KEYWORDS.some((kw) => prompt.includes(kw));
191
+ const hasTypeKeyword = prompt.includes('类型') ||
192
+ prompt.toLowerCase().includes('type') ||
193
+ prompt.includes('mock') ||
194
+ prompt.includes('封装') ||
195
+ prompt.includes('测试');
196
+ // 检测路径模式(如 /api/xxx 或 api/xxx)
197
+ const pathPattern = /\/?api\/[^\s"']+/i;
198
+ const pathMatch = prompt.match(pathPattern);
199
+ if (hasGenerateKeyword && hasTypeKeyword && pathMatch) {
200
+ // 用户想要生成某个路径的接口类型
201
+ const path = pathMatch[0].replace(/^\/?/, '/'); // 确保以 / 开头
202
+ if (lastProject?.projectName || lastProject?.projectId) {
203
+ // 先搜索该路径的接口
204
+ const searchResult = await handleQueryInterfaces({
205
+ projectName: lastProject.projectName,
206
+ projectId: lastProject.projectId,
207
+ keyword: path,
208
+ }, { projectRoot, configManager, mcpBridge, contextStore });
209
+ // 如果搜索到接口,尝试自动生成
210
+ if (searchResult.content && Array.isArray(searchResult.content)) {
211
+ const textContent = searchResult.content[0];
212
+ if (textContent.type === 'text' && textContent.text.includes('找到')) {
213
+ // 提取第一个接口 ID(从搜索结果中)
214
+ const lastList = contextStore.getLastInterfaceList();
215
+ if (lastList && lastList.list.length > 0) {
216
+ const firstInterface = lastList.list[0];
217
+ // 自动生成第一个匹配接口的类型
218
+ return handleGenerateArtifacts({
219
+ projectName: lastProject.projectName,
220
+ projectId: lastProject.projectId,
221
+ interfaceIds: [firstInterface.id],
222
+ artifactType: detectArtifactType(prompt),
223
+ }, { projectRoot, configManager, mcpBridge, contextStore });
224
+ }
225
+ }
226
+ }
227
+ // 如果搜索失败,返回搜索结果让用户选择
228
+ return searchResult;
229
+ }
230
+ }
231
+ // 2. 如果上下文中有项目信息,尝试推断用户意图并处理
232
+ if (lastProject?.projectName || lastProject?.projectId) {
233
+ // 先检查是否是"查看所有接口"的变体表达
234
+ const listAllPatterns = [
235
+ /(?:我想|我要|帮我).*查看.*所有接口/i,
236
+ /(?:我想|我要|帮我).*列出.*所有接口/i,
237
+ /(?:我想|我要|帮我).*显示.*所有接口/i,
238
+ /(?:我想|我要|帮我).*所有接口.*信息/i,
239
+ ];
240
+ if (listAllPatterns.some((pattern) => pattern.test(prompt))) {
241
+ // 识别为列出所有接口
242
+ return handleListProjectInterfaces({
243
+ projectName: lastProject.projectName,
244
+ projectId: lastProject.projectId,
245
+ }, { projectRoot, configManager, mcpBridge, contextStore });
246
+ }
247
+ // 尝试作为接口查询处理
248
+ return handleQueryInterfaces({
249
+ projectName: lastProject.projectName,
250
+ projectId: lastProject.projectId,
251
+ keyword: prompt,
252
+ }, { projectRoot, configManager, mcpBridge, contextStore });
253
+ }
254
+ // 3. 没有匹配到预置意图,返回结构化提示让 agent 自行调用工具
255
+ // 分析用户请求,提供针对性的工具调用建议
256
+ const promptLower = prompt.toLowerCase();
257
+ let toolSuggestions = '';
258
+ // 分析用户意图,提供针对性的建议
259
+ if (promptLower.includes('生成') ||
260
+ promptLower.includes('类型') ||
261
+ promptLower.includes('mock')) {
262
+ // 用户想要生成代码
263
+ toolSuggestions =
264
+ `**检测到您想要生成代码,建议操作流程:**\n` +
265
+ `1. 如果请求中包含接口路径(如 /api/xxx),请先调用 \`query_interfaces\` 工具搜索接口\n` +
266
+ ` - 参数:keyword: "${prompt.match(/\/?api\/[^\s"']+/i)?.[0] || '从请求中提取的路径'}"\n` +
267
+ `2. 从搜索结果中获取 interfaceId,然后调用 \`generate_artifacts\` 工具生成类型\n` +
268
+ ` - 参数:interfaceIds: ["从查询结果中获取"], artifactType: "ts_types"\n` +
269
+ `3. 或者,如果用户提供了完整的 Apifox 接口 URL,可以直接调用 \`parse_and_add_project\` 然后 \`get_interface_detail\`\n\n`;
270
+ }
271
+ else if (promptLower.includes('查询') ||
272
+ promptLower.includes('搜索') ||
273
+ promptLower.includes('找')) {
274
+ // 用户想要查询接口
275
+ toolSuggestions =
276
+ `**检测到您想要查询接口,建议操作:**\n` +
277
+ `1. 调用 \`query_interfaces\` 工具搜索接口\n` +
278
+ ` - 参数:keyword: "${extractSearchKeyword(prompt)}"\n` +
279
+ `2. 如果找到接口,可以进一步调用 \`get_interface_detail\` 查看详情\n\n`;
280
+ }
281
+ else if (promptLower.includes('详情') || promptLower.includes('具体')) {
282
+ // 用户想要查看详情
283
+ toolSuggestions =
284
+ `**检测到您想要查看接口详情,建议操作:**\n` +
285
+ `1. 如果知道接口 ID,直接调用 \`get_interface_detail\`\n` +
286
+ `2. 如果不知道接口 ID,先调用 \`query_interfaces\` 搜索,然后调用 \`get_interface_detail\`\n\n`;
287
+ }
288
+ else {
289
+ // 通用建议
290
+ toolSuggestions =
291
+ `**可用工具:**\n` +
292
+ `- \`query_interfaces\` - 查询接口(支持关键词、路径搜索)\n` +
293
+ `- \`get_interface_detail\` - 获取接口详情(需要 projectName 和 interfaceId)\n` +
294
+ `- \`generate_artifacts\` - 生成接口类型/Mock/封装(需要 interfaceIds)\n` +
295
+ `- \`list_projects\` - 列出所有项目\n` +
296
+ `- \`parse_and_add_project\` - 添加项目(需要 Apifox 分享链接)\n\n`;
297
+ }
298
+ return buildTextResponse(`**用户请求:** ${args.prompt}\n\n` +
299
+ toolSuggestions +
300
+ `**上下文信息:**\n` +
301
+ (lastProject
302
+ ? `- 当前项目:${lastProject.projectName || lastProject.projectId}\n`
303
+ : `- 无项目上下文,建议先调用 \`list_projects\` 或 \`parse_and_add_project\`\n`) +
304
+ `\n请根据用户意图和上下文,选择合适的工具进行处理。如果无法确定,可以尝试先调用 \`query_interfaces\` 搜索相关接口。`);
305
+ }
96
306
  }
97
307
  }
98
308
  //# sourceMappingURL=assistant.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../../../src/server/handlers/assistant.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../../../src/server/handlers/assistant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 统一的错误处理工具
3
+ */
4
+ import { ContextStore } from '../../core/index.js';
5
+ import { buildTextResponse } from './utils.js';
6
+ export interface ErrorContext {
7
+ lastProject?: {
8
+ projectName?: string;
9
+ projectId?: string;
10
+ } | null;
11
+ projectRoot: string;
12
+ contextStore: ContextStore;
13
+ }
14
+ /**
15
+ * 处理项目信息缺失的错误,尝试从上下文推断
16
+ */
17
+ export declare function handleMissingProjectError(context: ErrorContext): ReturnType<typeof buildTextResponse>;
18
+ /**
19
+ * 处理接口信息缺失的错误
20
+ */
21
+ export declare function handleMissingInterfaceError(context: ErrorContext, interfaceNameOrId?: string): ReturnType<typeof buildTextResponse>;
22
+ /**
23
+ * 处理缓存未找到的错误
24
+ */
25
+ export declare function handleCacheNotFoundError(projectNameOrId: string, context: ErrorContext): ReturnType<typeof buildTextResponse>;
26
+ //# sourceMappingURL=error-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,YAAY,GACpB,UAAU,CAAC,OAAO,iBAAiB,CAAC,CA4CtC;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,YAAY,EACrB,iBAAiB,CAAC,EAAE,MAAM,GACzB,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAqBtC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,YAAY,GACpB,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAkBtC"}