apifox-workspace-mcp 1.1.2 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/__tests__/intent.test.js.map +1 -1
- package/dist/__tests__/llms-parser.test.js.map +1 -1
- package/dist/__tests__/select-interfaces.test.js +2 -0
- package/dist/__tests__/select-interfaces.test.js.map +1 -1
- package/dist/__tests__/unified-cache-manager.test.js +2 -2
- package/dist/__tests__/unified-cache-manager.test.js.map +1 -1
- package/dist/core/cache/unified-cache-manager.d.ts +12 -3
- package/dist/core/cache/unified-cache-manager.d.ts.map +1 -1
- package/dist/core/cache/unified-cache-manager.js +97 -24
- package/dist/core/cache/unified-cache-manager.js.map +1 -1
- package/dist/core/client/apifox.js.map +1 -1
- package/dist/core/client/mcp-bridge.d.ts.map +1 -1
- package/dist/core/client/mcp-bridge.js.map +1 -1
- package/dist/core/config/manager.d.ts +6 -124
- package/dist/core/config/manager.d.ts.map +1 -1
- package/dist/core/config/manager.js +11 -288
- package/dist/core/config/manager.js.map +1 -1
- package/dist/core/generator/artifact.js +0 -1
- package/dist/core/generator/artifact.js.map +1 -1
- package/dist/core/intent.d.ts +4 -1
- package/dist/core/intent.d.ts.map +1 -1
- package/dist/core/intent.js +29 -1
- package/dist/core/intent.js.map +1 -1
- package/dist/core/parser/index.d.ts +1 -0
- package/dist/core/parser/index.d.ts.map +1 -1
- package/dist/core/parser/index.js +1 -0
- package/dist/core/parser/index.js.map +1 -1
- package/dist/core/parser/md-parser.d.ts +12 -0
- package/dist/core/parser/md-parser.d.ts.map +1 -0
- package/dist/core/parser/md-parser.js +205 -0
- package/dist/core/parser/md-parser.js.map +1 -0
- package/dist/server/handlers/assistant.d.ts.map +1 -1
- package/dist/server/handlers/assistant.js +11 -0
- package/dist/server/handlers/assistant.js.map +1 -1
- package/dist/server/handlers/get-interface-detail.d.ts +2 -0
- package/dist/server/handlers/get-interface-detail.d.ts.map +1 -1
- package/dist/server/handlers/get-interface-detail.js +141 -10
- package/dist/server/handlers/get-interface-detail.js.map +1 -1
- package/dist/server/handlers/index.d.ts +1 -0
- package/dist/server/handlers/index.d.ts.map +1 -1
- package/dist/server/handlers/index.js +1 -0
- package/dist/server/handlers/index.js.map +1 -1
- package/dist/server/handlers/list-project-interfaces.d.ts +29 -0
- package/dist/server/handlers/list-project-interfaces.d.ts.map +1 -0
- package/dist/server/handlers/list-project-interfaces.js +195 -0
- package/dist/server/handlers/list-project-interfaces.js.map +1 -0
- package/dist/server/handlers/list-projects.d.ts.map +1 -1
- package/dist/server/handlers/list-projects.js.map +1 -1
- package/dist/server/handlers/parse-and-add-project.d.ts +0 -1
- package/dist/server/handlers/parse-and-add-project.d.ts.map +1 -1
- package/dist/server/handlers/parse-and-add-project.js +104 -132
- package/dist/server/handlers/parse-and-add-project.js.map +1 -1
- package/dist/server/handlers/utils.d.ts +3 -2
- package/dist/server/handlers/utils.d.ts.map +1 -1
- package/dist/server/handlers/utils.js +10 -3
- package/dist/server/handlers/utils.js.map +1 -1
- package/dist/server/index.js +13 -33
- package/dist/server/index.js.map +1 -1
- package/dist/types/index.d.ts +7 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { UnifiedCacheManager, parseApifoxUrl, fetchAndParseLlms, parseInterfaceFromMd, } from '../../core/index.js';
|
|
2
|
+
import { buildTextResponse } from './utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* 按层级结构列出项目的所有接口
|
|
5
|
+
*/
|
|
6
|
+
export async function handleListProjectInterfaces(args, ctx) {
|
|
7
|
+
const { projectRoot, contextStore } = ctx;
|
|
8
|
+
const cacheManager = new UnifiedCacheManager(projectRoot);
|
|
9
|
+
let projectInfo = null;
|
|
10
|
+
let shareId = args.shareId;
|
|
11
|
+
// 如果提供了 URL,尝试从 URL 解析项目信息
|
|
12
|
+
if (args.url) {
|
|
13
|
+
const parsed = await parseApifoxUrl(args.url);
|
|
14
|
+
if (parsed) {
|
|
15
|
+
shareId = parsed.shareId;
|
|
16
|
+
// 检查缓存中是否有该 shareId 对应的项目
|
|
17
|
+
let cachedProject = shareId ? cacheManager.findProjectByShareId(shareId) : null;
|
|
18
|
+
if (!cachedProject && parsed.llmsUrl) {
|
|
19
|
+
// 如果缓存中没有,从 llms.txt 解析并缓存
|
|
20
|
+
try {
|
|
21
|
+
const interfaces = await fetchAndParseLlms(parsed.llmsUrl);
|
|
22
|
+
const projectName = parsed.projectName ||
|
|
23
|
+
(parsed.shareId ? `${parsed.shareId}-${parsed.projectId}` : parsed.projectId);
|
|
24
|
+
cacheManager.upsertProjectMetadata(projectName, parsed.projectId, parsed.llmsUrl, parsed.shareId);
|
|
25
|
+
cacheManager.updateInterfacesFromLlms(projectName, interfaces);
|
|
26
|
+
cachedProject = cacheManager.findProjectByShareId(shareId) || null;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return buildTextResponse(`解析项目信息失败: ${error instanceof Error ? error.message : String(error)}`, true);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (cachedProject) {
|
|
33
|
+
projectInfo = {
|
|
34
|
+
projectId: cachedProject.projectId,
|
|
35
|
+
projectName: cachedProject.projectName,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
else if (parsed.projectId) {
|
|
39
|
+
const projectName = parsed.projectName ||
|
|
40
|
+
(parsed.shareId ? `${parsed.shareId}-${parsed.projectId}` : parsed.projectId);
|
|
41
|
+
projectInfo = {
|
|
42
|
+
projectId: parsed.projectId,
|
|
43
|
+
projectName,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// 如果没有项目信息,尝试从参数或上下文获取
|
|
49
|
+
if (!projectInfo) {
|
|
50
|
+
const lastProject = contextStore.getLastProject();
|
|
51
|
+
projectInfo = {
|
|
52
|
+
projectId: args.projectId || lastProject?.projectId || '',
|
|
53
|
+
projectName: args.projectName || lastProject?.projectName || '',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (!projectInfo.projectId) {
|
|
57
|
+
return buildTextResponse('无法确定项目信息,请提供项目 URL 或项目名称。', true);
|
|
58
|
+
}
|
|
59
|
+
// 从缓存获取所有接口
|
|
60
|
+
const cachedProject = cacheManager.findProjectById(projectInfo.projectId);
|
|
61
|
+
if (!cachedProject) {
|
|
62
|
+
return buildTextResponse(`项目 ${projectInfo.projectName} 不在缓存中,请先使用 parse_and_add_project 添加项目。`, true);
|
|
63
|
+
}
|
|
64
|
+
const interfaces = cachedProject.interfaces;
|
|
65
|
+
if (interfaces.length === 0) {
|
|
66
|
+
return buildTextResponse(`项目 ${projectInfo.projectName} 中暂无接口。`);
|
|
67
|
+
}
|
|
68
|
+
// 按层级组织接口
|
|
69
|
+
const folderTree = buildFolderTree(interfaces);
|
|
70
|
+
// 异步获取接口的 method 和 path(从 md 文件)
|
|
71
|
+
await enrichInterfacesWithDetails(folderTree);
|
|
72
|
+
// 生成层级展示
|
|
73
|
+
const output = formatFolderTree(folderTree, projectInfo.projectName);
|
|
74
|
+
return {
|
|
75
|
+
content: [
|
|
76
|
+
{
|
|
77
|
+
type: 'text',
|
|
78
|
+
text: output,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function buildFolderTree(interfaces) {
|
|
84
|
+
const root = {
|
|
85
|
+
name: '根目录',
|
|
86
|
+
interfaces: [],
|
|
87
|
+
children: new Map(),
|
|
88
|
+
};
|
|
89
|
+
for (const iface of interfaces) {
|
|
90
|
+
const folderPath = iface.folderPath || '';
|
|
91
|
+
const parts = folderPath.split(' > ').filter((p) => p.trim());
|
|
92
|
+
let current = root;
|
|
93
|
+
// 遍历路径,创建或找到对应的节点
|
|
94
|
+
for (const part of parts) {
|
|
95
|
+
if (!current.children.has(part)) {
|
|
96
|
+
current.children.set(part, {
|
|
97
|
+
name: part,
|
|
98
|
+
interfaces: [],
|
|
99
|
+
children: new Map(),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
current = current.children.get(part);
|
|
103
|
+
}
|
|
104
|
+
// 接口信息将在后续异步获取
|
|
105
|
+
current.interfaces.push({
|
|
106
|
+
id: iface.id,
|
|
107
|
+
name: iface.name,
|
|
108
|
+
path: '', // 将从 md 文件读取
|
|
109
|
+
method: '', // 将从 md 文件读取
|
|
110
|
+
docUrl: iface.docUrl, // 保存 docUrl 用于后续读取
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return root;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 从 md 文件异步获取接口的 method 和 path
|
|
117
|
+
*/
|
|
118
|
+
async function enrichInterfacesWithDetails(node) {
|
|
119
|
+
// 并行获取所有接口的详情(限制并发数)
|
|
120
|
+
const enrichPromises = [];
|
|
121
|
+
const maxConcurrent = 10;
|
|
122
|
+
let currentConcurrent = 0;
|
|
123
|
+
const enrichNode = async (n) => {
|
|
124
|
+
for (const iface of n.interfaces) {
|
|
125
|
+
if (iface.docUrl && (!iface.method || !iface.path)) {
|
|
126
|
+
while (currentConcurrent >= maxConcurrent) {
|
|
127
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
128
|
+
}
|
|
129
|
+
currentConcurrent++;
|
|
130
|
+
enrichPromises.push((async () => {
|
|
131
|
+
try {
|
|
132
|
+
const detail = await parseInterfaceFromMd(iface.docUrl);
|
|
133
|
+
if (detail) {
|
|
134
|
+
iface.method = detail.method || '';
|
|
135
|
+
iface.path = detail.path || '';
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// 忽略错误,保持默认值
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
currentConcurrent--;
|
|
143
|
+
}
|
|
144
|
+
})());
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
for (const child of n.children.values()) {
|
|
148
|
+
await enrichNode(child);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
await enrichNode(node);
|
|
152
|
+
await Promise.all(enrichPromises);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 格式化文件夹树为文本输出
|
|
156
|
+
*/
|
|
157
|
+
function formatFolderTree(node, projectName, indent = 0) {
|
|
158
|
+
const prefix = ' '.repeat(indent);
|
|
159
|
+
const lines = [];
|
|
160
|
+
if (indent === 0) {
|
|
161
|
+
lines.push(`# 📁 项目: ${projectName}`);
|
|
162
|
+
lines.push(`\n共 ${countInterfaces(node)} 个接口\n`);
|
|
163
|
+
}
|
|
164
|
+
// 显示当前文件夹的接口
|
|
165
|
+
if (node.interfaces.length > 0) {
|
|
166
|
+
if (indent > 0) {
|
|
167
|
+
lines.push(`${prefix}📁 ${node.name}`);
|
|
168
|
+
}
|
|
169
|
+
for (const iface of node.interfaces) {
|
|
170
|
+
const methodDisplay = iface.method || '待获取';
|
|
171
|
+
const pathDisplay = iface.path || '待获取';
|
|
172
|
+
lines.push(`${prefix} └─ [${iface.id}] **${iface.name}**\n${prefix} 方法: ${methodDisplay}\n${prefix} 路径: ${pathDisplay}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else if (indent > 0) {
|
|
176
|
+
lines.push(`${prefix}📁 ${node.name}`);
|
|
177
|
+
}
|
|
178
|
+
// 递归显示子文件夹
|
|
179
|
+
const sortedChildren = Array.from(node.children.entries()).sort(([a], [b]) => a.localeCompare(b));
|
|
180
|
+
for (const [, child] of sortedChildren) {
|
|
181
|
+
lines.push(formatFolderTree(child, projectName, indent + 1));
|
|
182
|
+
}
|
|
183
|
+
return lines.join('\n');
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 统计接口总数
|
|
187
|
+
*/
|
|
188
|
+
function countInterfaces(node) {
|
|
189
|
+
let count = node.interfaces.length;
|
|
190
|
+
for (const child of node.children.values()) {
|
|
191
|
+
count += countInterfaces(child);
|
|
192
|
+
}
|
|
193
|
+
return count;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=list-project-interfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-project-interfaces.js","sourceRoot":"","sources":["../../../src/server/handlers/list-project-interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/list-projects.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/list-projects.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM;;;;;;GAY3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../../src/server/handlers/list-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../../src/server/handlers/list-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,MAAM,YAAY,GAAG,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,CAAC;IAE7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,kBAAkB,CACvB,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,OAAO,kBAAkB,CAAC,WAAW,QAAQ,CAAC,MAAM,oBAAoB,WAAW,EAAE,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-and-add-project.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/parse-and-add-project.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EAKT,YAAY,EAGb,MAAM,qBAAqB,CAAC;AAG7B,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-and-add-project.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/parse-and-add-project.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EAKT,YAAY,EAGb,MAAM,qBAAqB,CAAC;AAG7B,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,sBAAsB,EAC5B,GAAG,EAAE,yBAAyB;;;;;;;;;;;;GAmP/B"}
|
|
@@ -4,38 +4,32 @@ import { ApifoxClient, isValidApifoxUrl, parseApifoxUrl, ShareLinkType, UnifiedC
|
|
|
4
4
|
*/
|
|
5
5
|
export async function handleParseAndAddProject(args, ctx) {
|
|
6
6
|
const { url } = args;
|
|
7
|
-
const { projectRoot, configManager, mcpBridge, contextStore
|
|
7
|
+
const { projectRoot, configManager, mcpBridge, contextStore } = ctx;
|
|
8
8
|
const steps = [];
|
|
9
9
|
const errors = [];
|
|
10
|
-
let projectId;
|
|
11
10
|
let projectName;
|
|
12
11
|
let fullProjectInfo = null;
|
|
13
12
|
let interfaceDetail = null;
|
|
14
|
-
// 步骤 1:
|
|
15
|
-
steps.push('📋 步骤 1:
|
|
13
|
+
// 步骤 1: 检查访问令牌
|
|
14
|
+
steps.push('📋 步骤 1: 检查访问令牌');
|
|
16
15
|
steps.push(` 📂 项目根目录: ${projectRoot}`);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
errors.push(...initResult.errors.map((e) => ` - ${e}`));
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
steps.push(' ✅ apifox-mcp.json 文件存在');
|
|
37
|
-
steps.push(` 📍 文件位置: ${configManager.getApifoxConfigPath()}`);
|
|
16
|
+
const accessToken = configManager.getAccessToken();
|
|
17
|
+
if (!accessToken) {
|
|
18
|
+
return {
|
|
19
|
+
content: [
|
|
20
|
+
{
|
|
21
|
+
type: 'text',
|
|
22
|
+
text: `❌ 未找到 APIFOX_ACCESS_TOKEN\n\n` +
|
|
23
|
+
`${steps.join('\n')}\n\n` +
|
|
24
|
+
`请在 MCP 配置的 env 中配置 APIFOX_ACCESS_TOKEN:\n\n` +
|
|
25
|
+
`在 ~/.cursor/mcp.json 或项目根目录的 .cursor/mcp.json 中添加:\n\n` +
|
|
26
|
+
`\`\`\`json\n{\n "mcpServers": {\n "apifox-workspace-mcp": {\n "command": "node",\n "args": ["/path/to/dist/server/index.js"],\n "env": {\n "APIFOX_ACCESS_TOKEN": "your_token_here"\n }\n }\n }\n}\n\`\`\``,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
38
31
|
}
|
|
32
|
+
steps.push(' ✅ Access Token 已配置');
|
|
39
33
|
// 步骤 2: 验证和解析 URL
|
|
40
34
|
steps.push('\n🔗 步骤 2: 验证和解析 URL');
|
|
41
35
|
if (!isValidApifoxUrl(url)) {
|
|
@@ -63,7 +57,7 @@ export async function handleParseAndAddProject(args, ctx) {
|
|
|
63
57
|
isError: true,
|
|
64
58
|
};
|
|
65
59
|
}
|
|
66
|
-
projectId = parsed.projectId;
|
|
60
|
+
const projectId = parsed.projectId;
|
|
67
61
|
projectName = parsed.projectName;
|
|
68
62
|
const linkType = parsed.linkType;
|
|
69
63
|
const llmsUrl = parsed.llmsUrl;
|
|
@@ -79,34 +73,22 @@ export async function handleParseAndAddProject(args, ctx) {
|
|
|
79
73
|
steps.push(` - 接口 ID: ${parsed.interfaceId}`);
|
|
80
74
|
}
|
|
81
75
|
steps.push(` - llms.txt URL: ${llmsUrl}`);
|
|
82
|
-
// 步骤 3:
|
|
83
|
-
steps.push('\n🔑 步骤 3: 检查 Access Token');
|
|
84
|
-
const accessToken = configManager.getAccessToken();
|
|
85
|
-
if (!accessToken) {
|
|
86
|
-
return {
|
|
87
|
-
content: [
|
|
88
|
-
{
|
|
89
|
-
type: 'text',
|
|
90
|
-
text: `❌ 未找到 APIFOX_ACCESS_TOKEN\n\n` +
|
|
91
|
-
`${steps.join('\n')}\n\n` +
|
|
92
|
-
`请在 MCP 配置的 env 中配置 APIFOX_ACCESS_TOKEN:\n\n` +
|
|
93
|
-
`在 ~/.cursor/mcp.json 或项目根目录的 .cursor/mcp.json 中添加:\n\n` +
|
|
94
|
-
`\`\`\`json\n{\n "mcpServers": {\n "apifox-workspace-mcp": {\n "command": "node",\n "args": ["/path/to/dist/server/index.js"],\n "env": {\n "APIFOX_ACCESS_TOKEN": "your_token_here"\n }\n }\n }\n}\n\`\`\``,
|
|
95
|
-
},
|
|
96
|
-
],
|
|
97
|
-
isError: true,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
steps.push(' ✅ Access Token 已配置');
|
|
101
|
-
// 步骤 4: 检查项目是否已存在
|
|
76
|
+
// 步骤 3: 检查项目是否已存在
|
|
102
77
|
steps.push('\n🔍 步骤 4: 检查项目是否已存在');
|
|
103
|
-
|
|
78
|
+
const cacheManager = new UnifiedCacheManager(projectRoot);
|
|
79
|
+
const existingProject = cacheManager.findProjectById(projectId);
|
|
80
|
+
if (existingProject) {
|
|
81
|
+
steps.push(` ℹ️ 项目已存在: ${existingProject.projectName} (${projectId})`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
steps.push(` ✅ 项目不存在,将创建新项目`);
|
|
85
|
+
}
|
|
104
86
|
// 步骤 5: 如果是接口分享链接,获取接口详情
|
|
105
87
|
if (linkType === ShareLinkType.INTERFACE && parsed.interfaceId) {
|
|
106
88
|
steps.push('\n📡 步骤 5: 获取接口详情');
|
|
107
89
|
steps.push(` 🔄 正在获取接口 ${parsed.interfaceId} 的详细信息...`);
|
|
108
90
|
try {
|
|
109
|
-
const apifoxClient = new ApifoxClient(accessToken, getApiBaseUrl() ?? undefined);
|
|
91
|
+
const apifoxClient = new ApifoxClient(accessToken, configManager.getApiBaseUrl() ?? undefined);
|
|
110
92
|
interfaceDetail = await apifoxClient.getInterfaceDetail(projectId, parsed.interfaceId);
|
|
111
93
|
steps.push(' ✅ 成功获取接口详情');
|
|
112
94
|
}
|
|
@@ -114,29 +96,34 @@ export async function handleParseAndAddProject(args, ctx) {
|
|
|
114
96
|
steps.push(` ⚠️ 获取接口详情失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
115
97
|
}
|
|
116
98
|
}
|
|
117
|
-
// 步骤
|
|
118
|
-
steps.push('\n📡 步骤
|
|
99
|
+
// 步骤 5: 获取项目信息(通过 Apifox 官方 MCP Server,可选)
|
|
100
|
+
steps.push('\n📡 步骤 5: 获取项目信息(可选)');
|
|
119
101
|
if (!projectName) {
|
|
120
102
|
steps.push(' 🔄 通过 Apifox 官方 MCP Server 获取项目信息...');
|
|
121
103
|
try {
|
|
122
104
|
const mcpResult = await mcpBridge.getProjectInfoViaMcp(accessToken, projectId);
|
|
123
105
|
fullProjectInfo = mcpResult;
|
|
124
|
-
projectName = mcpResult.name
|
|
125
|
-
|
|
106
|
+
projectName = mcpResult.name;
|
|
107
|
+
if (projectName) {
|
|
108
|
+
steps.push(' ✅ 通过 MCP Server 成功获取项目信息');
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
steps.push(' ⚠️ MCP Server 未返回项目名称');
|
|
112
|
+
}
|
|
126
113
|
}
|
|
127
114
|
catch (mcpError) {
|
|
128
115
|
steps.push(` ⚠️ MCP Server 调用失败: ${mcpError instanceof Error ? mcpError.message : String(mcpError)}`);
|
|
129
|
-
projectName = projectName || `project-${projectId.substring(0, 8)}`;
|
|
130
|
-
steps.push(` ⚠️ 使用默认项目名称: ${projectName}`);
|
|
131
116
|
}
|
|
132
117
|
}
|
|
133
118
|
else {
|
|
134
119
|
steps.push(' ℹ️ 已从页面标题获取项目名称,跳过 MCP Server 调用');
|
|
135
120
|
}
|
|
136
|
-
// 步骤
|
|
137
|
-
steps.push('\n💾 步骤
|
|
121
|
+
// 步骤 6: 保存或更新项目信息到统一缓存
|
|
122
|
+
steps.push('\n💾 步骤 6: 保存项目信息到统一缓存');
|
|
123
|
+
// 如果无法获取真实项目名称,使用 ${shareId}-${projectId} 作为后备
|
|
138
124
|
if (!projectName) {
|
|
139
|
-
projectName =
|
|
125
|
+
projectName = shareId ? `${shareId}-${projectId}` : projectId;
|
|
126
|
+
steps.push(` ⚠️ 使用后备项目名称: ${projectName}`);
|
|
140
127
|
}
|
|
141
128
|
if (!llmsUrl) {
|
|
142
129
|
return {
|
|
@@ -150,9 +137,8 @@ export async function handleParseAndAddProject(args, ctx) {
|
|
|
150
137
|
};
|
|
151
138
|
}
|
|
152
139
|
// 使用统一缓存管理器
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
cacheManager.upsertProjectMetadata(projectName, projectId, llmsUrl);
|
|
140
|
+
// 保存项目元数据(包含 shareId)
|
|
141
|
+
cacheManager.upsertProjectMetadata(projectName, projectId, llmsUrl, shareId);
|
|
156
142
|
steps.push(' ✅ 已保存项目元数据到统一缓存');
|
|
157
143
|
// 从 llms.txt 解析接口列表
|
|
158
144
|
steps.push(' 🔄 正在从 llms.txt 解析接口列表...');
|
|
@@ -167,81 +153,67 @@ export async function handleParseAndAddProject(args, ctx) {
|
|
|
167
153
|
steps.push(` ⚠️ 解析 llms.txt 失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
168
154
|
errors.push(`解析 llms.txt 失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
169
155
|
}
|
|
170
|
-
//
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
responseText +=
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
responseText += `-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
156
|
+
// 设置最后操作的项目
|
|
157
|
+
contextStore.setLastProject(projectName, projectId);
|
|
158
|
+
// 构建返回信息
|
|
159
|
+
let responseText = '';
|
|
160
|
+
// 检查是否为新项目
|
|
161
|
+
const isNewProject = !existingProject;
|
|
162
|
+
// 根据链接类型和是否为新项目,构造不同的提示语
|
|
163
|
+
if (linkType === ShareLinkType.PROJECT) {
|
|
164
|
+
responseText = isNewProject ? `✅ 项目配置已添加!\n\n` : `✅ 项目配置已更新!\n\n`;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
responseText = isNewProject
|
|
168
|
+
? `✅ 该接口对应项目配置已添加!\n\n`
|
|
169
|
+
: `✅ 该接口对应项目配置已存在!\n\n`;
|
|
170
|
+
}
|
|
171
|
+
responseText += `**保存的信息:**\n`;
|
|
172
|
+
responseText += `- 项目 ID: ${projectId}\n`;
|
|
173
|
+
responseText += `- 项目名称: ${projectName}\n`;
|
|
174
|
+
responseText += `- 分享 ID: ${shareId}\n`;
|
|
175
|
+
if (llmsUrl) {
|
|
176
|
+
responseText += `- llms.txt URL: ${llmsUrl}\n`;
|
|
177
|
+
}
|
|
178
|
+
if (parsed.interfaceId) {
|
|
179
|
+
responseText += `- 接口 ID: ${parsed.interfaceId}\n`;
|
|
180
|
+
}
|
|
181
|
+
responseText += `\n`;
|
|
182
|
+
// 如果是接口分享链接,输出接口详情
|
|
183
|
+
if (linkType === ShareLinkType.INTERFACE && interfaceDetail) {
|
|
184
|
+
responseText += `**当前接口信息:**\n`;
|
|
185
|
+
responseText += `- 接口名称: ${interfaceDetail.name || '未命名'}\n`;
|
|
186
|
+
responseText += `- 请求方法: ${interfaceDetail.method || 'UNKNOWN'}\n`;
|
|
187
|
+
responseText += `- 接口路径: ${interfaceDetail.path || '/'}\n`;
|
|
188
|
+
if (interfaceDetail.description) {
|
|
189
|
+
responseText += `- 描述: ${interfaceDetail.description}\n`;
|
|
199
190
|
}
|
|
200
191
|
responseText += `\n`;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
responseText += `**当前接口信息:**\n`;
|
|
204
|
-
responseText += `- 接口名称: ${interfaceDetail.name || '未命名'}\n`;
|
|
205
|
-
responseText += `- 请求方法: ${interfaceDetail.method || 'UNKNOWN'}\n`;
|
|
206
|
-
responseText += `- 接口路径: ${interfaceDetail.path || '/'}\n`;
|
|
207
|
-
if (interfaceDetail.description) {
|
|
208
|
-
responseText += `- 描述: ${interfaceDetail.description}\n`;
|
|
209
|
-
}
|
|
210
|
-
responseText += `\n`;
|
|
211
|
-
responseText += `**完整接口详情:**\n`;
|
|
212
|
-
responseText += `\`\`\`json\n${JSON.stringify(interfaceDetail, null, 2)}\n\`\`\`\n\n`;
|
|
213
|
-
}
|
|
214
|
-
if (fullProjectInfo) {
|
|
215
|
-
responseText += `**项目完整信息:**\n`;
|
|
216
|
-
responseText += `\`\`\`json\n${JSON.stringify(fullProjectInfo, null, 2)}\n\`\`\`\n\n`;
|
|
217
|
-
}
|
|
218
|
-
// 根据链接类型询问用户下一步
|
|
219
|
-
if (linkType === ShareLinkType.PROJECT) {
|
|
220
|
-
responseText += `现在想要了解该项目的哪些信息?\n`;
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
responseText += `现在需要我帮助您做什么?\n`;
|
|
224
|
-
}
|
|
225
|
-
return {
|
|
226
|
-
content: [
|
|
227
|
-
{
|
|
228
|
-
type: 'text',
|
|
229
|
-
text: responseText,
|
|
230
|
-
},
|
|
231
|
-
],
|
|
232
|
-
};
|
|
192
|
+
responseText += `**完整接口详情:**\n`;
|
|
193
|
+
responseText += `\`\`\`json\n${JSON.stringify(interfaceDetail, null, 2)}\n\`\`\`\n\n`;
|
|
233
194
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
content: [
|
|
238
|
-
{
|
|
239
|
-
type: 'text',
|
|
240
|
-
text: `❌ ${upsertResult.message}\n\n**执行过程:**\n${steps.join('\n')}\n\n**错误:**\n${errors.join('\n')}`,
|
|
241
|
-
},
|
|
242
|
-
],
|
|
243
|
-
isError: true,
|
|
244
|
-
};
|
|
195
|
+
if (fullProjectInfo) {
|
|
196
|
+
responseText += `**项目完整信息:**\n`;
|
|
197
|
+
responseText += `\`\`\`json\n${JSON.stringify(fullProjectInfo, null, 2)}\n\`\`\`\n\n`;
|
|
245
198
|
}
|
|
199
|
+
// 根据链接类型询问用户下一步
|
|
200
|
+
if (linkType === ShareLinkType.PROJECT) {
|
|
201
|
+
responseText += `现在想要了解该项目的哪些信息?\n`;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
responseText += `现在需要我帮助您做什么?\n`;
|
|
205
|
+
}
|
|
206
|
+
// 如果有错误,添加错误信息
|
|
207
|
+
if (errors.length > 0) {
|
|
208
|
+
responseText += `\n**警告:**\n${errors.join('\n')}\n`;
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
content: [
|
|
212
|
+
{
|
|
213
|
+
type: 'text',
|
|
214
|
+
text: responseText,
|
|
215
|
+
},
|
|
216
|
+
],
|
|
217
|
+
};
|
|
246
218
|
}
|
|
247
219
|
//# sourceMappingURL=parse-and-add-project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-and-add-project.js","sourceRoot":"","sources":["../../../src/server/handlers/parse-and-add-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,aAAa,EAEb,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-and-add-project.js","sourceRoot":"","sources":["../../../src/server/handlers/parse-and-add-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,9 +9,10 @@ export interface ResolvedProjectInfo {
|
|
|
9
9
|
/**
|
|
10
10
|
* 解析项目信息(从统一缓存)
|
|
11
11
|
*/
|
|
12
|
-
export declare function resolveProjectInfo(projectRoot: string, contextStore: ContextStore, projectName?: string, projectId?: string): ResolvedProjectInfo | null;
|
|
12
|
+
export declare function resolveProjectInfo(projectRoot: string, contextStore: ContextStore, projectName?: string, projectId?: string, shareId?: string): ResolvedProjectInfo | null;
|
|
13
13
|
/**
|
|
14
|
-
* 获取 API Base URL
|
|
14
|
+
* 获取 API Base URL(已废弃,使用 ConfigManager.getApiBaseUrl())
|
|
15
|
+
* @deprecated 使用 ConfigManager.getApiBaseUrl() 替代
|
|
15
16
|
*/
|
|
16
17
|
export declare function getApiBaseUrlFromEnv(): string | null;
|
|
17
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,YAAY,EAC1B,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,mBAAmB,GAAG,IAAI,CAyB5B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAOpD;AAED;;GAEG;AACH,wBAAgB,yBAAyB;;;;;;EAYxC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ;;;;;;EAU9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAKnF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQpF"}
|
|
@@ -2,24 +2,31 @@ import { UnifiedCacheManager } from '../../core/index.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* 解析项目信息(从统一缓存)
|
|
4
4
|
*/
|
|
5
|
-
export function resolveProjectInfo(projectRoot, contextStore, projectName, projectId) {
|
|
5
|
+
export function resolveProjectInfo(projectRoot, contextStore, projectName, projectId, shareId) {
|
|
6
6
|
const cacheManager = new UnifiedCacheManager(projectRoot);
|
|
7
7
|
if (projectId) {
|
|
8
8
|
const project = cacheManager.findProjectById(projectId);
|
|
9
9
|
const derivedName = projectName ?? project?.projectName ?? projectId;
|
|
10
10
|
return { projectId, projectName: derivedName };
|
|
11
11
|
}
|
|
12
|
+
if (shareId) {
|
|
13
|
+
const project = cacheManager.findProjectByShareId(shareId);
|
|
14
|
+
if (project) {
|
|
15
|
+
return { projectId: project.projectId, projectName: project.projectName };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
12
18
|
if (projectName) {
|
|
13
19
|
const project = cacheManager.findProjectByName(projectName);
|
|
14
20
|
if (!project) {
|
|
15
21
|
return null;
|
|
16
22
|
}
|
|
17
|
-
return { projectId: project.
|
|
23
|
+
return { projectId: project.projectId, projectName };
|
|
18
24
|
}
|
|
19
25
|
return contextStore.getLastProject();
|
|
20
26
|
}
|
|
21
27
|
/**
|
|
22
|
-
* 获取 API Base URL
|
|
28
|
+
* 获取 API Base URL(已废弃,使用 ConfigManager.getApiBaseUrl())
|
|
29
|
+
* @deprecated 使用 ConfigManager.getApiBaseUrl() 替代
|
|
23
30
|
*/
|
|
24
31
|
export function getApiBaseUrlFromEnv() {
|
|
25
32
|
const baseUrl = process.env.APIFOX_API_BASE_URL;
|