apifox-workspace-mcp 1.0.0 → 1.1.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 (89) hide show
  1. package/README.md +40 -8
  2. package/dist/__tests__/intent.test.d.ts +2 -0
  3. package/dist/__tests__/intent.test.d.ts.map +1 -0
  4. package/dist/__tests__/intent.test.js +62 -0
  5. package/dist/__tests__/intent.test.js.map +1 -0
  6. package/dist/__tests__/llms-parser.test.d.ts +5 -0
  7. package/dist/__tests__/llms-parser.test.d.ts.map +1 -0
  8. package/dist/__tests__/llms-parser.test.js +57 -0
  9. package/dist/__tests__/llms-parser.test.js.map +1 -0
  10. package/dist/__tests__/select-interfaces.test.d.ts +2 -0
  11. package/dist/__tests__/select-interfaces.test.d.ts.map +1 -0
  12. package/dist/__tests__/select-interfaces.test.js +127 -0
  13. package/dist/__tests__/select-interfaces.test.js.map +1 -0
  14. package/dist/__tests__/unified-cache-manager.test.d.ts +5 -0
  15. package/dist/__tests__/unified-cache-manager.test.d.ts.map +1 -0
  16. package/dist/__tests__/unified-cache-manager.test.js +158 -0
  17. package/dist/__tests__/unified-cache-manager.test.js.map +1 -0
  18. package/dist/core/cache/index.d.ts +8 -0
  19. package/dist/core/cache/index.d.ts.map +1 -0
  20. package/dist/core/cache/index.js +7 -0
  21. package/dist/core/cache/index.js.map +1 -0
  22. package/dist/core/cache/interface-cache-manager.d.ts +118 -0
  23. package/dist/core/cache/interface-cache-manager.d.ts.map +1 -0
  24. package/dist/core/cache/interface-cache-manager.js +236 -0
  25. package/dist/core/cache/interface-cache-manager.js.map +1 -0
  26. package/dist/core/cache/unified-cache-manager.d.ts +139 -0
  27. package/dist/core/cache/unified-cache-manager.d.ts.map +1 -0
  28. package/dist/core/cache/unified-cache-manager.js +446 -0
  29. package/dist/core/cache/unified-cache-manager.js.map +1 -0
  30. package/dist/core/client/mcp-bridge.d.ts +14 -10
  31. package/dist/core/client/mcp-bridge.d.ts.map +1 -1
  32. package/dist/core/client/mcp-bridge.js +64 -94
  33. package/dist/core/client/mcp-bridge.js.map +1 -1
  34. package/dist/core/config/manager.d.ts +6 -0
  35. package/dist/core/config/manager.d.ts.map +1 -1
  36. package/dist/core/config/manager.js +13 -0
  37. package/dist/core/config/manager.js.map +1 -1
  38. package/dist/core/index.d.ts +2 -0
  39. package/dist/core/index.d.ts.map +1 -1
  40. package/dist/core/index.js +2 -0
  41. package/dist/core/index.js.map +1 -1
  42. package/dist/core/intent.d.ts +11 -1
  43. package/dist/core/intent.d.ts.map +1 -1
  44. package/dist/core/intent.js +121 -12
  45. package/dist/core/intent.js.map +1 -1
  46. package/dist/core/parser/index.d.ts +2 -0
  47. package/dist/core/parser/index.d.ts.map +1 -1
  48. package/dist/core/parser/index.js +1 -0
  49. package/dist/core/parser/index.js.map +1 -1
  50. package/dist/core/parser/llms.d.ts +37 -0
  51. package/dist/core/parser/llms.d.ts.map +1 -0
  52. package/dist/core/parser/llms.js +83 -0
  53. package/dist/core/parser/llms.js.map +1 -0
  54. package/dist/server/handlers/assistant.d.ts.map +1 -1
  55. package/dist/server/handlers/assistant.js +11 -5
  56. package/dist/server/handlers/assistant.js.map +1 -1
  57. package/dist/server/handlers/generate-artifacts.d.ts.map +1 -1
  58. package/dist/server/handlers/generate-artifacts.js +3 -3
  59. package/dist/server/handlers/generate-artifacts.js.map +1 -1
  60. package/dist/server/handlers/get-interface-detail.d.ts +1 -0
  61. package/dist/server/handlers/get-interface-detail.d.ts.map +1 -1
  62. package/dist/server/handlers/get-interface-detail.js +3 -3
  63. package/dist/server/handlers/get-interface-detail.js.map +1 -1
  64. package/dist/server/handlers/index.d.ts +1 -0
  65. package/dist/server/handlers/index.d.ts.map +1 -1
  66. package/dist/server/handlers/index.js +1 -0
  67. package/dist/server/handlers/index.js.map +1 -1
  68. package/dist/server/handlers/list-projects.d.ts +1 -2
  69. package/dist/server/handlers/list-projects.d.ts.map +1 -1
  70. package/dist/server/handlers/list-projects.js +6 -28
  71. package/dist/server/handlers/list-projects.js.map +1 -1
  72. package/dist/server/handlers/parse-and-add-project.d.ts.map +1 -1
  73. package/dist/server/handlers/parse-and-add-project.js +33 -10
  74. package/dist/server/handlers/parse-and-add-project.js.map +1 -1
  75. package/dist/server/handlers/query-interfaces.d.ts +1 -0
  76. package/dist/server/handlers/query-interfaces.d.ts.map +1 -1
  77. package/dist/server/handlers/query-interfaces.js +31 -12
  78. package/dist/server/handlers/query-interfaces.js.map +1 -1
  79. package/dist/server/handlers/select-interfaces.d.ts +23 -0
  80. package/dist/server/handlers/select-interfaces.d.ts.map +1 -0
  81. package/dist/server/handlers/select-interfaces.js +106 -0
  82. package/dist/server/handlers/select-interfaces.js.map +1 -0
  83. package/dist/server/handlers/utils.d.ts +3 -3
  84. package/dist/server/handlers/utils.d.ts.map +1 -1
  85. package/dist/server/handlers/utils.js +9 -6
  86. package/dist/server/handlers/utils.js.map +1 -1
  87. package/dist/server/index.js +24 -3
  88. package/dist/server/index.js.map +1 -1
  89. package/package.json +6 -2
@@ -0,0 +1,118 @@
1
+ /**
2
+ * 接口基础信息缓存管理器
3
+ *
4
+ * 按目录层级组织接口缓存,只缓存基础信息(id, name, method, path, description)
5
+ * 不缓存接口详情,确保详情始终是最新的
6
+ */
7
+ /**
8
+ * 接口基础信息
9
+ */
10
+ export interface InterfaceBasicInfo {
11
+ id: string;
12
+ name: string;
13
+ method: string;
14
+ path: string;
15
+ description?: string;
16
+ }
17
+ /**
18
+ * 缓存结构:按项目 ID -> 目录层级 -> 接口数组
19
+ *
20
+ * 示例:
21
+ * {
22
+ * "202": {
23
+ * "SFTP": {
24
+ * "App api SFTP template": [
25
+ * { id: "2385", name: "复制SFTP模板", method: "POST", path: "/api/sftp/template/copy", description: "..." }
26
+ * ]
27
+ * },
28
+ * "": [ // 根目录的接口
29
+ * { id: "62227", name: "获取用户信息", method: "GET", path: "/api/users/{id}" }
30
+ * ]
31
+ * }
32
+ * }
33
+ */
34
+ export type InterfaceCache = Record<string, Record<string, unknown> | InterfaceBasicInfo[]>;
35
+ /**
36
+ * 接口缓存管理器
37
+ */
38
+ export declare class InterfaceCacheManager {
39
+ private cachePath;
40
+ private cache;
41
+ constructor(projectRoot: string);
42
+ /**
43
+ * 加载缓存文件
44
+ */
45
+ private loadCache;
46
+ /**
47
+ * 保存缓存到文件
48
+ */
49
+ private saveCache;
50
+ /**
51
+ * 解析目录路径为层级数组
52
+ *
53
+ * 例如:
54
+ * - "Invoice > Info" -> ["Invoice", "Info"]
55
+ * - "APP API company subscribe" -> ["APP API company subscribe"]
56
+ * - "" -> [""] (根目录)
57
+ *
58
+ * @param folderPath 目录路径,使用 " > " 分隔多级目录
59
+ * @returns 目录层级数组
60
+ */
61
+ private parseFolderPath;
62
+ /**
63
+ * 将接口添加到缓存
64
+ *
65
+ * @param projectId 项目 ID
66
+ * @param folderPath 目录路径(如 "Invoice > Info")
67
+ * @param interfaceInfo 接口基础信息
68
+ */
69
+ addInterface(projectId: string, folderPath: string, interfaceInfo: InterfaceBasicInfo): void;
70
+ /**
71
+ * 批量添加接口到缓存
72
+ *
73
+ * @param projectId 项目 ID
74
+ * @param interfaces 接口列表(包含 folderPath)
75
+ */
76
+ addInterfaces(projectId: string, interfaces: Array<InterfaceBasicInfo & {
77
+ folderPath?: string;
78
+ }>): void;
79
+ /**
80
+ * 获取项目下所有缓存的接口(按目录层级组织)
81
+ *
82
+ * @param projectId 项目 ID
83
+ * @returns 按目录层级组织的接口结构,如果项目不存在则返回 undefined
84
+ */
85
+ getInterfacesByProject(projectId: string): Record<string, unknown> | undefined;
86
+ /**
87
+ * 将嵌套的接口结构扁平化为数组
88
+ *
89
+ * @param nested 嵌套的接口结构
90
+ * @returns 扁平化的接口数组(包含 folderPath)
91
+ */
92
+ flattenInterfaces(nested: Record<string, unknown>): Array<InterfaceBasicInfo & {
93
+ folderPath: string;
94
+ }>;
95
+ /**
96
+ * 检查对象是否为接口基础信息
97
+ */
98
+ private isInterfaceBasicInfo;
99
+ /**
100
+ * 根据接口 ID 查找接口基础信息
101
+ *
102
+ * @param projectId 项目 ID
103
+ * @param interfaceId 接口 ID
104
+ * @returns 接口基础信息,如果未找到则返回 null
105
+ */
106
+ findInterfaceById(projectId: string, interfaceId: string): InterfaceBasicInfo | null;
107
+ /**
108
+ * 清空项目的缓存
109
+ *
110
+ * @param projectId 项目 ID
111
+ */
112
+ clearProject(projectId: string): void;
113
+ /**
114
+ * 获取缓存文件路径
115
+ */
116
+ getCachePath(): string;
117
+ }
118
+ //# sourceMappingURL=interface-cache-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface-cache-manager.d.ts","sourceRoot":"","sources":["../../../src/core/cache/interface-cache-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,EAAE,CAAC,CAAC;AAE5F;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAiB;gBAElB,WAAW,EAAE,MAAM;IAM/B;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,SAAS;IAYjB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,eAAe;IAWvB;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,GAAG,IAAI;IA4C5F;;;;;OAKG;IACH,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,KAAK,CAAC,kBAAkB,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAC9D,IAAI;IAaP;;;;;OAKG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAI9E;;;;;OAKG;IACH,iBAAiB,CACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,KAAK,CAAC,kBAAkB,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA2BrD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;;;;OAMG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IA0BpF;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKrC;;OAEG;IACH,YAAY,IAAI,MAAM;CAGvB"}
@@ -0,0 +1,236 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface-cache-manager.js","sourceRoot":"","sources":["../../../src/core/cache/interface-cache-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * 统一缓存管理器
3
+ *
4
+ * 管理项目元数据和接口缓存,所有数据存储在 apifox-interfaces-cache.json
5
+ * 接口只缓存基础信息(id, name, folderPath, docUrl, version),不缓存 method, path, description
6
+ *
7
+ * 优化特性:
8
+ * - 内存缓存:减少 I/O 操作,提升查询性能
9
+ * - 延迟保存:只在必要时保存,批量更新时只保存一次
10
+ * - 文件锁:防止并发写入导致的数据损坏
11
+ * - 索引优化:使用 Map 建立索引,查找时间复杂度 O(1)
12
+ * - 错误恢复:自动备份损坏的文件
13
+ */
14
+ /**
15
+ * 缓存的接口信息(只包含从 llms.txt 解析的基础信息)
16
+ * 注意:不包含 method, path, description,这些信息每次查询详情时都重新获取
17
+ */
18
+ export interface CachedInterface {
19
+ id: string;
20
+ name: string;
21
+ folderPath: string;
22
+ docUrl: string;
23
+ version?: string;
24
+ }
25
+ /**
26
+ * 项目缓存对象
27
+ */
28
+ export interface ProjectCache {
29
+ /** 项目名称 */
30
+ projectName: string;
31
+ /** 项目 ID(单个字符串) */
32
+ projectIds: string;
33
+ /** llms.txt URL */
34
+ llmsUrls: string;
35
+ /** 接口列表(扁平数组) */
36
+ interfaces: CachedInterface[];
37
+ }
38
+ /**
39
+ * 统一缓存文件结构
40
+ */
41
+ export type UnifiedCache = ProjectCache[];
42
+ /**
43
+ * 统一缓存管理器
44
+ */
45
+ export declare class UnifiedCacheManager {
46
+ private cachePath;
47
+ private cache;
48
+ private cacheDirty;
49
+ private lastLoadTime;
50
+ private projectNameIndex;
51
+ private projectIdIndex;
52
+ private interfaceIndex;
53
+ constructor(projectRoot: string);
54
+ /**
55
+ * 构建索引
56
+ */
57
+ private buildIndexes;
58
+ /**
59
+ * 加载缓存文件(带类型验证)
60
+ */
61
+ private loadCache;
62
+ /**
63
+ * 标记缓存为已修改
64
+ */
65
+ private markDirty;
66
+ /**
67
+ * 检查并清理过期的锁文件
68
+ */
69
+ private checkAndCleanExpiredLock;
70
+ /**
71
+ * 保存缓存到文件(带文件锁)
72
+ * 使用 fs.openSync 的排他模式实现简单的文件锁
73
+ */
74
+ private saveCache;
75
+ /**
76
+ * 同步保存缓存(用于需要立即保存的场景)
77
+ */
78
+ private saveCacheSync;
79
+ /**
80
+ * 通过项目名称查找项目(使用索引,O(1) 时间复杂度)
81
+ */
82
+ findProjectByName(projectName: string): ProjectCache | null;
83
+ /**
84
+ * 通过项目 ID 查找项目(使用索引,O(1) 时间复杂度)
85
+ */
86
+ findProjectById(projectId: string): ProjectCache | null;
87
+ /**
88
+ * 获取项目的 llmsUrl
89
+ */
90
+ getLlmsUrl(projectName: string): string | null;
91
+ /**
92
+ * 查找接口基础信息(使用索引,O(1) 时间复杂度)
93
+ */
94
+ findInterface(projectName: string, interfaceId: string): CachedInterface | null;
95
+ /**
96
+ * 获取项目的接口列表
97
+ */
98
+ getInterfaces(projectName: string, keyword?: string): CachedInterface[];
99
+ /**
100
+ * 添加或更新项目元数据
101
+ */
102
+ upsertProjectMetadata(projectName: string, projectId: string, llmsUrl: string): void;
103
+ /**
104
+ * 更新项目的接口列表(从 llms.txt 解析)
105
+ * 支持增量更新:只更新变化的接口
106
+ */
107
+ updateInterfacesFromLlms(projectName: string, parsedInterfaces: Array<{
108
+ id: string;
109
+ name: string;
110
+ folderPath: string;
111
+ docUrl: string;
112
+ version?: string;
113
+ }>): void;
114
+ /**
115
+ * 列出所有项目
116
+ */
117
+ listProjects(): Array<{
118
+ name: string;
119
+ id: string;
120
+ }>;
121
+ /**
122
+ * 获取缓存文件路径
123
+ */
124
+ getCachePath(): string;
125
+ /**
126
+ * 获取缓存统计信息
127
+ */
128
+ getCacheStats(): {
129
+ projectCount: number;
130
+ totalInterfaces: number;
131
+ cacheSize: number;
132
+ lastUpdated: Date | null;
133
+ };
134
+ /**
135
+ * 强制保存缓存(用于需要立即保存的场景)
136
+ */
137
+ flush(): Promise<void>;
138
+ }
139
+ //# sourceMappingURL=unified-cache-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-cache-manager.d.ts","sourceRoot":"","sources":["../../../src/core/cache/unified-cache-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgBH;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC;AAiC1C;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,YAAY,CAAa;IAGjC,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,cAAc,CAA+C;gBAEzD,WAAW,EAAE,MAAM;IAQ/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,OAAO,CAAC,SAAS;IA6CjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA6BhC;;;OAGG;YACW,SAAS;IA0EvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAK3D;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAKvD;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAK9C;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAY/E;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE;IAmBvE;;OAEG;IACH,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IA0DpF;;;OAGG;IACH,wBAAwB,CACtB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,KAAK,CAAC;QACtB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,GACD,IAAI;IA2CP;;OAEG;IACH,YAAY,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAOnD;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,aAAa,IAAI;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;KAC1B;IAqBD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}