@mybricks/plugin-ai 0.0.2 → 0.0.3

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 (249) hide show
  1. package/dist/_virtual/_rollupPluginBabelHelpers.js +164 -0
  2. package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  3. package/dist/agents/app.js +335 -0
  4. package/dist/agents/app.js.map +1 -0
  5. package/dist/agents/common.js +483 -0
  6. package/dist/agents/common.js.map +1 -0
  7. package/dist/agents/custom.js +16 -0
  8. package/dist/agents/custom.js.map +1 -0
  9. package/dist/agents/index.js +38 -0
  10. package/dist/agents/index.js.map +1 -0
  11. package/dist/agents/knowledges/knowledge-base.js +579 -0
  12. package/dist/agents/knowledges/knowledge-base.js.map +1 -0
  13. package/dist/agents/knowledges/knowledge-node.js +228 -0
  14. package/dist/agents/knowledges/knowledge-node.js.map +1 -0
  15. package/dist/agents/knowledges/types.js +105 -0
  16. package/dist/agents/knowledges/types.js.map +1 -0
  17. package/dist/agents/utils/config.js +229 -0
  18. package/dist/agents/utils/config.js.map +1 -0
  19. package/dist/agents/workspace/coding-manager.js +20 -0
  20. package/dist/agents/workspace/coding-manager.js.map +1 -0
  21. package/dist/agents/workspace/components-manager.js +113 -0
  22. package/dist/agents/workspace/components-manager.js.map +1 -0
  23. package/dist/agents/workspace/outline-focus.js +167 -0
  24. package/dist/agents/workspace/outline-focus.js.map +1 -0
  25. package/dist/agents/workspace/outline-info.js +430 -0
  26. package/dist/agents/workspace/outline-info.js.map +1 -0
  27. package/dist/agents/workspace/page-tree-generator.js +70 -0
  28. package/dist/agents/workspace/page-tree-generator.js.map +1 -0
  29. package/dist/agents/workspace/workspace.js +251 -0
  30. package/dist/agents/workspace/workspace.js.map +1 -0
  31. package/dist/agents/workspace-by-knowledges/providers/component-docs-provider.js +100 -0
  32. package/dist/agents/workspace-by-knowledges/providers/component-docs-provider.js.map +1 -0
  33. package/dist/agents/workspace-by-knowledges/providers/focus-info-provider.js +120 -0
  34. package/dist/agents/workspace-by-knowledges/providers/focus-info-provider.js.map +1 -0
  35. package/dist/agents/workspace-by-knowledges/providers/project-info-provider.js +146 -0
  36. package/dist/agents/workspace-by-knowledges/providers/project-info-provider.js.map +1 -0
  37. package/dist/agents/workspace-by-knowledges/test.js +242 -0
  38. package/dist/agents/workspace-by-knowledges/test.js.map +1 -0
  39. package/dist/agents/workspace-by-knowledges/utils/components-manager.js +132 -0
  40. package/dist/agents/workspace-by-knowledges/utils/components-manager.js.map +1 -0
  41. package/dist/agents/workspace-by-knowledges/utils/outline-focus.js +167 -0
  42. package/dist/agents/workspace-by-knowledges/utils/outline-focus.js.map +1 -0
  43. package/dist/agents/workspace-by-knowledges/utils/outline-info.js +430 -0
  44. package/dist/agents/workspace-by-knowledges/utils/outline-info.js.map +1 -0
  45. package/dist/agents/workspace-by-knowledges/workspace.js +169 -0
  46. package/dist/agents/workspace-by-knowledges/workspace.js.map +1 -0
  47. package/dist/api/cloud-components.js +85 -0
  48. package/dist/api/cloud-components.js.map +1 -0
  49. package/dist/api-record-replay/manager.js +168 -0
  50. package/dist/api-record-replay/manager.js.map +1 -0
  51. package/{src/api-record-replay/recorder.ts → dist/api-record-replay/recorder.js} +22 -32
  52. package/dist/api-record-replay/recorder.js.map +1 -0
  53. package/dist/api-record-replay/replayer.js +136 -0
  54. package/dist/api-record-replay/replayer.js.map +1 -0
  55. package/dist/components/attachments/index.js +124 -0
  56. package/dist/components/attachments/index.js.map +1 -0
  57. package/dist/components/attachments/index.less.js +8 -0
  58. package/dist/components/attachments/index.less.js.map +1 -0
  59. package/dist/components/icons/index.js +112 -0
  60. package/dist/components/icons/index.js.map +1 -0
  61. package/dist/components/icons/index.less.js +8 -0
  62. package/dist/components/icons/index.less.js.map +1 -0
  63. package/dist/components/mention/index.js +19 -0
  64. package/dist/components/mention/index.js.map +1 -0
  65. package/dist/components/mention/index.less.js +8 -0
  66. package/dist/components/mention/index.less.js.map +1 -0
  67. package/dist/components/messages/index.js +429 -0
  68. package/dist/components/messages/index.js.map +1 -0
  69. package/dist/components/messages/index.less.js +8 -0
  70. package/dist/components/messages/index.less.js.map +1 -0
  71. package/dist/components/sender/index.js +244 -0
  72. package/dist/components/sender/index.js.map +1 -0
  73. package/dist/components/sender/index.less.js +8 -0
  74. package/dist/components/sender/index.less.js.map +1 -0
  75. package/dist/context/RequestStatusTracker.js +44 -0
  76. package/dist/context/RequestStatusTracker.js.map +1 -0
  77. package/dist/context/index.js +45 -0
  78. package/dist/context/index.js.map +1 -0
  79. package/dist/data.js +4 -0
  80. package/dist/data.js.map +1 -0
  81. package/dist/index.js +306 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/plugin-ai/node_modules/style-inject/dist/style-inject.es.js +27 -0
  84. package/dist/plugin-ai/node_modules/style-inject/dist/style-inject.es.js.map +1 -0
  85. package/dist/plugin-ai/package.json.js +8 -0
  86. package/dist/plugin-ai/package.json.js.map +1 -0
  87. package/dist/plugin-ai/test/index.js +206 -0
  88. package/dist/plugin-ai/test/index.js.map +1 -0
  89. package/dist/preset/createTemplates.js +29 -0
  90. package/dist/preset/createTemplates.js.map +1 -0
  91. package/dist/preset/index.js +13 -0
  92. package/dist/preset/index.js.map +1 -0
  93. package/dist/preset/prompts.js +34 -0
  94. package/dist/preset/prompts.js.map +1 -0
  95. package/{src/preset/user.ts → dist/preset/user.js} +4 -3
  96. package/dist/preset/user.js.map +1 -0
  97. package/dist/requestAsStream.js +269 -0
  98. package/dist/requestAsStream.js.map +1 -0
  99. package/dist/rxai/node_modules/idb/build/index.js +277 -0
  100. package/dist/rxai/node_modules/idb/build/index.js.map +1 -0
  101. package/dist/rxai/src/agent/base.js +16 -0
  102. package/dist/rxai/src/agent/base.js.map +1 -0
  103. package/dist/rxai/src/agent/planning.js +1076 -0
  104. package/dist/rxai/src/agent/planning.js.map +1 -0
  105. package/dist/rxai/src/agent/rxai.js +254 -0
  106. package/dist/rxai/src/agent/rxai.js.map +1 -0
  107. package/dist/rxai/src/error/base.js +39 -0
  108. package/dist/rxai/src/error/base.js.map +1 -0
  109. package/dist/rxai/src/prompt/base.js +11 -0
  110. package/dist/rxai/src/prompt/base.js.map +1 -0
  111. package/dist/rxai/src/prompt/planning.js +23 -0
  112. package/dist/rxai/src/prompt/planning.js.map +1 -0
  113. package/dist/rxai/src/prompt/tool.js +14 -0
  114. package/dist/rxai/src/prompt/tool.js.map +1 -0
  115. package/dist/rxai/src/request/request.js +123 -0
  116. package/dist/rxai/src/request/request.js.map +1 -0
  117. package/dist/rxai/src/tool/getHistoryRecords.js +65 -0
  118. package/dist/rxai/src/tool/getHistoryRecords.js.map +1 -0
  119. package/dist/rxai/src/tool/util.js +424 -0
  120. package/dist/rxai/src/tool/util.js.map +1 -0
  121. package/dist/rxai/src/utils/events.js +43 -0
  122. package/dist/rxai/src/utils/events.js.map +1 -0
  123. package/dist/rxai/src/utils/idb.js +240 -0
  124. package/dist/rxai/src/utils/idb.js.map +1 -0
  125. package/dist/rxai/src/utils/retry.js +32 -0
  126. package/dist/rxai/src/utils/retry.js.map +1 -0
  127. package/dist/rxai/src/utils/uuid.js +7 -0
  128. package/dist/rxai/src/utils/uuid.js.map +1 -0
  129. package/dist/startView/components/header/header.js +12 -0
  130. package/dist/startView/components/header/header.js.map +1 -0
  131. package/dist/startView/components/header/header.less.js +8 -0
  132. package/dist/startView/components/header/header.less.js.map +1 -0
  133. package/dist/startView/index.js +62 -0
  134. package/dist/startView/index.js.map +1 -0
  135. package/dist/startView/index.less.js +8 -0
  136. package/dist/startView/index.less.js.map +1 -0
  137. package/dist/tools/analyze-and-expand-prd.js +116 -0
  138. package/dist/tools/analyze-and-expand-prd.js.map +1 -0
  139. package/dist/tools/analyze-requirement-and-components.js +208 -0
  140. package/dist/tools/analyze-requirement-and-components.js.map +1 -0
  141. package/dist/tools/answer.js +33 -0
  142. package/dist/tools/answer.js.map +1 -0
  143. package/dist/tools/build-process.js +550 -0
  144. package/dist/tools/build-process.js.map +1 -0
  145. package/dist/tools/coding-subagent-as-tool.js +101 -0
  146. package/dist/tools/coding-subagent-as-tool.js.map +1 -0
  147. package/dist/tools/generate-ui-content.js +528 -0
  148. package/dist/tools/generate-ui-content.js.map +1 -0
  149. package/dist/tools/index.js +31 -0
  150. package/dist/tools/index.js.map +1 -0
  151. package/dist/tools/open-dsl.js +49 -0
  152. package/dist/tools/open-dsl.js.map +1 -0
  153. package/dist/tools/refactor-ui-content.js +292 -0
  154. package/dist/tools/refactor-ui-content.js.map +1 -0
  155. package/dist/tools/utils.js +832 -0
  156. package/dist/tools/utils.js.map +1 -0
  157. package/dist/types/index.js +8 -0
  158. package/dist/types/index.js.map +1 -0
  159. package/dist/view/components/header/header.js +59 -0
  160. package/dist/view/components/header/header.js.map +1 -0
  161. package/dist/view/components/header/header.less.js +8 -0
  162. package/dist/view/components/header/header.less.js.map +1 -0
  163. package/dist/view/index.js +184 -0
  164. package/dist/view/index.js.map +1 -0
  165. package/dist/view/index.less.js +8 -0
  166. package/dist/view/index.less.js.map +1 -0
  167. package/package.json +28 -6
  168. package/src/agents/app.ts +0 -301
  169. package/src/agents/common.ts +0 -471
  170. package/src/agents/custom.ts +0 -14
  171. package/src/agents/index.ts +0 -37
  172. package/src/agents/knowledges/README.md +0 -614
  173. package/src/agents/knowledges/SUMMARY.md +0 -527
  174. package/src/agents/knowledges/index.ts +0 -8
  175. package/src/agents/knowledges/knowledge-base.ts +0 -565
  176. package/src/agents/knowledges/knowledge-node.ts +0 -266
  177. package/src/agents/knowledges/types.ts +0 -208
  178. package/src/agents/utils/config.ts +0 -427
  179. package/src/agents/workspace/coding-manager.ts +0 -31
  180. package/src/agents/workspace/components-manager.ts +0 -124
  181. package/src/agents/workspace/outline-focus.ts +0 -188
  182. package/src/agents/workspace/outline-info.ts +0 -520
  183. package/src/agents/workspace/page-tree-generator.ts +0 -83
  184. package/src/agents/workspace/workspace.ts +0 -319
  185. package/src/agents/workspace-by-knowledges/MIGRATION.md +0 -568
  186. package/src/agents/workspace-by-knowledges/README.md +0 -521
  187. package/src/agents/workspace-by-knowledges/index.ts +0 -11
  188. package/src/agents/workspace-by-knowledges/providers/component-docs-provider.ts +0 -92
  189. package/src/agents/workspace-by-knowledges/providers/focus-info-provider.ts +0 -131
  190. package/src/agents/workspace-by-knowledges/providers/index.ts +0 -8
  191. package/src/agents/workspace-by-knowledges/providers/project-info-provider.ts +0 -151
  192. package/src/agents/workspace-by-knowledges/test.ts +0 -240
  193. package/src/agents/workspace-by-knowledges/types.ts +0 -56
  194. package/src/agents/workspace-by-knowledges/utils/components-manager.ts +0 -145
  195. package/src/agents/workspace-by-knowledges/utils/index.ts +0 -8
  196. package/src/agents/workspace-by-knowledges/utils/outline-focus.ts +0 -178
  197. package/src/agents/workspace-by-knowledges/utils/outline-info.ts +0 -521
  198. package/src/agents/workspace-by-knowledges/workspace.ts +0 -166
  199. package/src/api/cloud-components.ts +0 -129
  200. package/src/api-record-replay/README.md +0 -187
  201. package/src/api-record-replay/index.ts +0 -11
  202. package/src/api-record-replay/manager.ts +0 -168
  203. package/src/api-record-replay/replayer.ts +0 -148
  204. package/src/components/attachments/index.less +0 -117
  205. package/src/components/attachments/index.tsx +0 -136
  206. package/src/components/icons/index.less +0 -8
  207. package/src/components/icons/index.tsx +0 -44
  208. package/src/components/index.less +0 -34
  209. package/src/components/mention/index.less +0 -23
  210. package/src/components/mention/index.tsx +0 -19
  211. package/src/components/messages/index.less +0 -1013
  212. package/src/components/messages/index.tsx +0 -519
  213. package/src/components/sender/index.less +0 -203
  214. package/src/components/sender/index.tsx +0 -298
  215. package/src/components/types.ts +0 -31
  216. package/src/constants/index.ts +0 -8
  217. package/src/context/RequestStatusTracker.ts +0 -50
  218. package/src/context/index.ts +0 -83
  219. package/src/data.ts +0 -5
  220. package/src/global.d.ts +0 -100
  221. package/src/index.tsx +0 -264
  222. package/src/mock.ts +0 -1267
  223. package/src/preset/agents.ts +0 -380
  224. package/src/preset/createTemplates.ts +0 -25
  225. package/src/preset/index.ts +0 -12
  226. package/src/preset/prompts.ts +0 -235
  227. package/src/preset/requestAsStream.ts +0 -246
  228. package/src/startView/components/header/header.less +0 -17
  229. package/src/startView/components/header/header.tsx +0 -15
  230. package/src/startView/components/index.ts +0 -1
  231. package/src/startView/index.less +0 -34
  232. package/src/startView/index.tsx +0 -61
  233. package/src/tools/analyze-and-expand-prd.ts +0 -272
  234. package/src/tools/analyze-requirement-and-components.ts +0 -589
  235. package/src/tools/answer.ts +0 -59
  236. package/src/tools/build-process.ts +0 -1174
  237. package/src/tools/coding-subagent-as-tool.ts +0 -119
  238. package/src/tools/generate-ui-content.ts +0 -1083
  239. package/src/tools/index.ts +0 -28
  240. package/src/tools/open-dsl.ts +0 -69
  241. package/src/tools/refactor-ui-content.ts +0 -801
  242. package/src/tools/type.d.ts +0 -12
  243. package/src/tools/utils.ts +0 -914
  244. package/src/types/index.ts +0 -4
  245. package/src/view/components/header/header.less +0 -51
  246. package/src/view/components/header/header.tsx +0 -60
  247. package/src/view/components/index.ts +0 -1
  248. package/src/view/index.less +0 -5
  249. package/src/view/index.tsx +0 -168
@@ -1,565 +0,0 @@
1
- /**
2
- * 知识库管理器
3
- */
4
-
5
- import { KnowledgeNode, IProviderManager } from './knowledge-node';
6
- import {
7
- KnowledgeNodeType,
8
- KnowledgeBaseConfig,
9
- ExportOptions,
10
- IDirectoryProvider,
11
- IKnowledgeNode,
12
- DynamicDocument,
13
- DynamicDocDirectoryConfig
14
- } from './types';
15
-
16
- /**
17
- * 知识库类
18
- * 本质上是对一条大模型消息的生成和管理
19
- */
20
- export class KnowledgeBase implements IProviderManager {
21
- /** 知识库名称 */
22
- name: string;
23
-
24
- /** 知识库描述 */
25
- description?: string;
26
-
27
- /** 根节点 */
28
- private root: KnowledgeNode;
29
-
30
- /** 已打开的文件路径列表 */
31
- private openedFilePaths: Set<string> = new Set();
32
-
33
- /** 注册的 Provider 映射 */
34
- private providers: Map<string, IDirectoryProvider> = new Map();
35
-
36
- /** 动态文档目录配置映射 */
37
- private dynamicDirectories: Map<string, DynamicDocDirectoryConfig> = new Map();
38
-
39
- /** 动态文档存储(按目录ID分组) */
40
- private dynamicDocuments: Map<string, Map<string, DynamicDocument>> = new Map();
41
-
42
- /** 默认动态文档目录ID */
43
- private readonly DEFAULT_DYNAMIC_DIR_ID = '__dynamic_docs__';
44
-
45
- constructor(config: KnowledgeBaseConfig) {
46
- this.name = config.name;
47
- this.description = config.description;
48
-
49
- // 初始化根节点
50
- this.root = new KnowledgeNode(
51
- '__root__',
52
- this.name,
53
- KnowledgeNodeType.DIRECTORY,
54
- this,
55
- {
56
- description: this.description,
57
- metadata: { providerId: '__root__' }
58
- }
59
- );
60
- }
61
-
62
- /**
63
- * 注册目录提供者
64
- */
65
- registerProvider(provider: IDirectoryProvider): void {
66
- this.providers.set(provider.id, provider);
67
- }
68
-
69
- /**
70
- * 注册动态文档目录
71
- */
72
- registerDynamicDirectory(config: DynamicDocDirectoryConfig): void {
73
- this.dynamicDirectories.set(config.id, config);
74
- // 为这个目录初始化文档存储
75
- if (!this.dynamicDocuments.has(config.id)) {
76
- this.dynamicDocuments.set(config.id, new Map());
77
- }
78
- }
79
-
80
- /**
81
- * 获取 Provider(实现 IProviderManager 接口)
82
- */
83
- getProvider(providerId: string): IDirectoryProvider | undefined {
84
- // 根节点特殊处理
85
- if (providerId === '__root__') {
86
- return {
87
- id: '__root__',
88
- name: this.name,
89
- description: this.description,
90
- weight: 0,
91
- getRootNode: () => ({ id: '__root__', name: this.name, type: KnowledgeNodeType.DIRECTORY }),
92
- getChildren: async () => {
93
- // 返回所有注册的 provider 和动态文档目录的根节点,按权重排序(从大到小)
94
- const allNodes: IKnowledgeNode[] = [];
95
-
96
- // 添加 provider 节点
97
- const providers = Array.from(this.providers.values());
98
- allNodes.push(...providers.map(p => p.getRootNode()));
99
-
100
- // 添加动态文档目录节点
101
- const dynamicDirs = Array.from(this.dynamicDirectories.values());
102
- allNodes.push(...dynamicDirs.map(dir => ({
103
- id: dir.id,
104
- name: dir.name, // 直接使用 name 作为展示名称
105
- type: KnowledgeNodeType.DIRECTORY,
106
- description: dir.description,
107
- hidden: dir.hidden,
108
- metadata: {
109
- providerId: dir.id, // 使用自己的 ID 作为 providerId,确保子节点查找正确
110
- isDynamicDirectory: true
111
- }
112
- })));
113
-
114
- // 按权重排序(从大到小)
115
- allNodes.sort((a, b) => {
116
- const weightA = this.getNodeWeight(a.id);
117
- const weightB = this.getNodeWeight(b.id);
118
- return weightB - weightA;
119
- });
120
-
121
- return allNodes;
122
- },
123
- readFile: async () => {
124
- throw new Error('Cannot read file from root');
125
- }
126
- } as IDirectoryProvider;
127
- }
128
-
129
- // 检查是否是动态文档目录
130
- if (this.dynamicDirectories.has(providerId)) {
131
- return this.createDynamicDirectoryProvider(providerId);
132
- }
133
-
134
- return this.providers.get(providerId);
135
- }
136
-
137
- /**
138
- * 获取节点的权重
139
- */
140
- private getNodeWeight(nodeId: string): number {
141
- const provider = this.providers.get(nodeId);
142
- if (provider) {
143
- return provider.weight ?? 0;
144
- }
145
- const dynamicDir = this.dynamicDirectories.get(nodeId);
146
- if (dynamicDir) {
147
- return dynamicDir.weight ?? 0;
148
- }
149
- return 0;
150
- }
151
-
152
- /**
153
- * 为动态文档目录创建 Provider
154
- */
155
- private createDynamicDirectoryProvider(directoryId: string): IDirectoryProvider {
156
- const dirConfig = this.dynamicDirectories.get(directoryId);
157
- if (!dirConfig) {
158
- throw new Error(`Dynamic directory not found: ${directoryId}`);
159
- }
160
-
161
- return {
162
- id: dirConfig.id,
163
- name: dirConfig.name,
164
- description: dirConfig.description,
165
- weight: dirConfig.weight ?? 0,
166
- getRootNode: () => ({
167
- id: dirConfig.id,
168
- name: dirConfig.name, // 直接使用 name 作为展示名称
169
- type: KnowledgeNodeType.DIRECTORY,
170
- description: dirConfig.description,
171
- hidden: dirConfig.hidden,
172
- metadata: {
173
- isDynamicDirectory: true
174
- }
175
- }),
176
- getChildren: async (parentId: string) => {
177
- if (parentId !== dirConfig.id) {
178
- return [];
179
- }
180
- // 返回该目录下的所有动态文档
181
- const docs = this.dynamicDocuments.get(directoryId);
182
- if (!docs) {
183
- return [];
184
- }
185
- return Array.from(docs.values()).map(doc => ({
186
- id: doc.id, // 简单的 id,用于路径匹配
187
- name: doc.title || doc.id, // 使用 title 作为展示名称
188
- type: KnowledgeNodeType.FILE,
189
- extname: doc.extname || '.md',
190
- description: doc.description, // description 就是描述
191
- hidden: dirConfig.hidden,
192
- metadata: {
193
- isDynamicDocument: true,
194
- directoryId,
195
- docId: doc.id
196
- // parentPath 会由 getChildren() 自动传递
197
- }
198
- }));
199
- },
200
- readFile: async (fileId: string) => {
201
- // fileId 格式: directoryId/docId
202
- const match = fileId.match(/^(.+)\/(.+)$/);
203
- if (!match) {
204
- throw new Error(`Invalid dynamic document file ID: ${fileId}`);
205
- }
206
- const [, dirId, docId] = match;
207
- const docs = this.dynamicDocuments.get(dirId);
208
- const doc = docs?.get(docId);
209
- if (!doc) {
210
- throw new Error(`Dynamic document not found: ${fileId}`);
211
- }
212
-
213
- let result = '';
214
- if (doc.title) {
215
- result += `## ${doc.title}\n`;
216
- }
217
- if (doc.description) {
218
- result += `> ${doc.description}\n\n`;
219
- }
220
- result += doc.content;
221
- return result;
222
- }
223
- };
224
- }
225
-
226
- /**
227
- * 添加动态文档
228
- * @param doc 动态文档
229
- */
230
- addDynamicDocument(doc: DynamicDocument): void {
231
- const directoryId = doc.directoryId || this.DEFAULT_DYNAMIC_DIR_ID;
232
-
233
- // 确保目录存在
234
- if (!this.dynamicDirectories.has(directoryId)) {
235
- // 如果是默认目录且不存在,自动创建
236
- if (directoryId === this.DEFAULT_DYNAMIC_DIR_ID) {
237
- this.registerDynamicDirectory({
238
- id: this.DEFAULT_DYNAMIC_DIR_ID,
239
- name: '动态文档',
240
- description: '动态生成的文档',
241
- weight: -100,
242
- hidden: true
243
- });
244
- } else {
245
- throw new Error(`Dynamic directory not found: ${directoryId}`);
246
- }
247
- }
248
-
249
- // 获取或创建该目录的文档存储
250
- let docs = this.dynamicDocuments.get(directoryId);
251
- if (!docs) {
252
- docs = new Map();
253
- this.dynamicDocuments.set(directoryId, docs);
254
- }
255
-
256
- // 添加文档
257
- docs.set(doc.id, doc);
258
- }
259
-
260
- /**
261
- * 删除动态文档
262
- * @param docId 文档ID
263
- * @param directoryId 目录ID(可选,如果不指定则搜索所有目录)
264
- */
265
- removeDynamicDocument(docId: string, directoryId?: string): void {
266
- if (directoryId) {
267
- // 从指定目录删除
268
- const docs = this.dynamicDocuments.get(directoryId);
269
- if (docs) {
270
- docs.delete(docId);
271
- // 同时关闭该文档(如果已打开)
272
- const path = `${directoryId}/${docId}`;
273
- this.closeFile(path);
274
- }
275
- } else {
276
- // 从所有目录中搜索并删除
277
- for (const [dirId, docs] of this.dynamicDocuments.entries()) {
278
- if (docs.has(docId)) {
279
- docs.delete(docId);
280
- const path = `${dirId}/${docId}`;
281
- this.closeFile(path);
282
- }
283
- }
284
- }
285
- }
286
-
287
- /**
288
- * 获取动态文档
289
- * @param docId 文档ID
290
- * @param directoryId 目录ID(可选)
291
- */
292
- getDynamicDocument(docId: string, directoryId?: string): DynamicDocument | undefined {
293
- if (directoryId) {
294
- return this.dynamicDocuments.get(directoryId)?.get(docId);
295
- } else {
296
- // 搜索所有目录
297
- for (const docs of this.dynamicDocuments.values()) {
298
- const doc = docs.get(docId);
299
- if (doc) {
300
- return doc;
301
- }
302
- }
303
- }
304
- return undefined;
305
- }
306
-
307
- /**
308
- * 清空动态文档目录中的所有文档
309
- * @param directoryId 目录ID(可选,如果不指定则清空所有动态文档)
310
- */
311
- clearDynamicDocuments(directoryId?: string): void {
312
- if (directoryId) {
313
- // 清空指定目录
314
- const docs = this.dynamicDocuments.get(directoryId);
315
- if (docs) {
316
- // 关闭所有已打开的文档
317
- docs.forEach((_, docId) => {
318
- const path = `${directoryId}/${docId}`;
319
- this.closeFile(path);
320
- });
321
- docs.clear();
322
- }
323
- } else {
324
- // 清空所有动态文档
325
- this.dynamicDocuments.forEach((docs, dirId) => {
326
- docs.forEach((_, docId) => {
327
- const path = `${dirId}/${docId}`;
328
- this.closeFile(path);
329
- });
330
- docs.clear();
331
- });
332
- }
333
- }
334
-
335
- /**
336
- * 打开动态文档(简化方法)
337
- * @param doc 动态文档
338
- */
339
- async openDynamicDocument(doc: DynamicDocument): Promise<void> {
340
- // 添加到动态文档存储
341
- this.addDynamicDocument(doc);
342
-
343
- // 打开文档
344
- const directoryId = doc.directoryId || this.DEFAULT_DYNAMIC_DIR_ID;
345
- const path = `${directoryId}/${doc.id}`;
346
- await this.openFile(path);
347
- }
348
-
349
- /**
350
- * 打开文件(标记文件为已打开)
351
- * @param path 文件路径,如 "dsl/page1.json"
352
- */
353
- async openFile(path: string): Promise<void> {
354
- console.log('[KnowledgeBase.openFile] 尝试打开文件:', path);
355
- const node = await this.root.findByPath(path);
356
- console.log('[KnowledgeBase.openFile] 找到节点:', node);
357
-
358
- if (!node) {
359
- throw new Error(`File not found: ${path}`);
360
- }
361
-
362
- if (!node.isFile) {
363
- throw new Error(`Path is not a file: ${path}`);
364
- }
365
-
366
- this.openedFilePaths.add(path);
367
- console.log('[KnowledgeBase.openFile] 文件已添加到已打开列表,当前已打开文件数:', this.openedFilePaths.size);
368
- }
369
-
370
- /**
371
- * 关闭文件
372
- * @param path 文件路径
373
- */
374
- closeFile(path: string): void {
375
- this.openedFilePaths.delete(path);
376
- }
377
-
378
- /**
379
- * 检查文件是否已打开
380
- * @param path 文件路径
381
- */
382
- isFileOpened(path: string): boolean {
383
- return this.openedFilePaths.has(path);
384
- }
385
-
386
- /**
387
- * 获取目录树结构(文本格式)
388
- * 每次调用都会动态获取最新的文件树
389
- */
390
- async getDirectoryTree(options?: {
391
- maxDepth?: number;
392
- showDescription?: boolean;
393
- }): Promise<string> {
394
- const { maxDepth = Infinity, showDescription = false } = options || {};
395
- return await this._buildTreeText(this.root, 0, maxDepth, showDescription);
396
- }
397
-
398
- /**
399
- * 导出知识库内容(用于发送给大模型)
400
- * 每次导出都会动态重新获取文件树和文件内容
401
- */
402
- async export(options?: ExportOptions): Promise<string> {
403
- const { includeTree = true } = options || {};
404
-
405
- let result = `# ${this.name}\n`;
406
-
407
- if (this.description) {
408
- result += `${this.description}\n\n`;
409
- }
410
-
411
- // 导出目录结构树(动态获取)
412
- if (includeTree) {
413
- result += `## 目录结构\n`;
414
- result += await this.getDirectoryTree({ showDescription: true });
415
- result += '\n\n';
416
- }
417
-
418
- // 导出已打开的文件内容(每次都重新读取)
419
- console.log('[KnowledgeBase.export] 已打开的文件数:', this.openedFilePaths.size);
420
- console.log('[KnowledgeBase.export] 已打开的文件列表:', Array.from(this.openedFilePaths));
421
- console.log('[KnowledgeBase.export] openedFilePaths 类型:', typeof this.openedFilePaths, this.openedFilePaths);
422
- console.log('[KnowledgeBase.export] 是否是 Set:', this.openedFilePaths instanceof Set);
423
-
424
- if (this.openedFilePaths.size > 0) {
425
- result += `## 已打开的文件\n\n`;
426
-
427
- console.log('[KnowledgeBase.export] ===== 开始遍历已打开的文件 =====');
428
-
429
- // 测试:使用 Array.from 转换后遍历
430
- const pathsArray = Array.from(this.openedFilePaths);
431
- console.log('[KnowledgeBase.export] 转换为数组:', pathsArray);
432
-
433
- let iterationCount = 0;
434
- for (const path of pathsArray) {
435
- iterationCount++;
436
- console.log('[KnowledgeBase.export] 正在导出文件 #' + iterationCount + ':', path);
437
- // 动态查找文件节点
438
- const node = await this.root.findByPath(path);
439
- console.log('[KnowledgeBase.export] 找到节点:', node ? `${node.name}${node.extname || ''}` : 'null');
440
-
441
- if (node && node.isFile) {
442
- try {
443
- console.log('[KnowledgeBase.export] 开始读取文件内容...');
444
- const content = await node.getContent();
445
- console.log('[KnowledgeBase.export] 文件内容长度:', content.length);
446
-
447
- // 使用 name 作为展示标题(如果是动态文档,name 就是 title)
448
- const displayTitle = node.name + (node.extname || '');
449
- result += `### ${displayTitle}\n`;
450
-
451
- if (node.description) {
452
- result += `> ${node.description}\n\n`;
453
- }
454
- result += '--BEGIN--\n';
455
- result += content;
456
- result += '\n--END--\n\n';
457
- } catch (error) {
458
- console.error(`Failed to export file ${path}:`, error);
459
- const displayTitle = node.name + (node.extname || '');
460
- result += `### ${displayTitle} [已删除]\n`;
461
- result += `> 读取失败: ${error}\n\n`;
462
- }
463
- } else {
464
- // 文件不存在或被删除
465
- console.log('[KnowledgeBase.export] 节点不存在或不是文件');
466
- result += `### ${path} [已删除]\n`;
467
- result += `> 该文件已被删除或不存在\n\n`;
468
- }
469
- }
470
- console.log('[KnowledgeBase.export] ===== 遍历完成,共处理', iterationCount, '个文件 =====');
471
- } else {
472
- console.log('[KnowledgeBase.export] 没有已打开的文件');
473
- result += `## 已打开的文件\n暂无打开的文件\n\n`;
474
- }
475
-
476
- console.log('[KnowledgeBase.export] 导出完成,总长度:', result.length);
477
- return result;
478
- }
479
-
480
- /**
481
- * 获取根节点
482
- */
483
- getRoot(): KnowledgeNode {
484
- return this.root;
485
- }
486
-
487
- /**
488
- * 根据路径查找节点(动态查找)
489
- */
490
- async findNode(path: string): Promise<KnowledgeNode | null> {
491
- return await this.root.findByPath(path);
492
- }
493
-
494
- /**
495
- * 清空所有已打开的文件
496
- */
497
- clearOpenedFiles(): void {
498
- this.openedFilePaths.clear();
499
- }
500
-
501
- /**
502
- * 获取已打开的文件路径列表
503
- */
504
- getOpenedFilePaths(): string[] {
505
- return Array.from(this.openedFilePaths);
506
- }
507
-
508
- /**
509
- * 构建树形文本(动态获取子节点)
510
- */
511
- private async _buildTreeText(
512
- node: KnowledgeNode,
513
- depth: number,
514
- maxDepth: number,
515
- showDescription: boolean,
516
- currentPath: string = ''
517
- ): Promise<string> {
518
- if (depth > maxDepth) {
519
- return '';
520
- }
521
-
522
- const prefix = depth > 0 ? '-'.repeat(depth) + ' ' : '';
523
- let text = '';
524
-
525
- // 根节点不显示
526
- if (depth > 0) {
527
- // 隐藏的节点不显示
528
- if (node.hidden) {
529
- return '';
530
- }
531
-
532
- const path = currentPath;
533
- const openedMark = this.openedFilePaths.has(path) ? ' [已打开]' : '';
534
- // 直接使用 name 作为展示名称
535
- const displayName = node.extname ? `${node.name}${node.extname}` : node.name;
536
- const folderMark = node.isDirectory ? '/' : '';
537
- const ellipsisMark = node.ellipsis ? ' ...' : '';
538
- text += `${prefix}${displayName}${folderMark}${openedMark}${ellipsisMark}`;
539
-
540
- if (showDescription && node.description && node.description !== 'undefined') {
541
- text += ` (${node.description})`;
542
- }
543
-
544
- text += '\n';
545
- }
546
-
547
- // 动态获取子节点
548
- if (node.isDirectory) {
549
- try {
550
- const children = await node.getChildren();
551
- for (const child of children) {
552
- // 直接使用 id 构建路径
553
- const childId = child.extname ? `${child.id}${child.extname}` : child.id;
554
- const childPath = currentPath ? `${currentPath}/${childId}` : childId;
555
- text += await this._buildTreeText(child, depth + 1, maxDepth, showDescription, childPath);
556
- }
557
- } catch (error) {
558
- console.error(`Failed to load children of ${node.name}:`, error);
559
- }
560
- }
561
-
562
- return text;
563
- }
564
- }
565
-