@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.
- package/dist/_virtual/_rollupPluginBabelHelpers.js +164 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/dist/agents/app.js +335 -0
- package/dist/agents/app.js.map +1 -0
- package/dist/agents/common.js +483 -0
- package/dist/agents/common.js.map +1 -0
- package/dist/agents/custom.js +16 -0
- package/dist/agents/custom.js.map +1 -0
- package/dist/agents/index.js +38 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/knowledges/knowledge-base.js +579 -0
- package/dist/agents/knowledges/knowledge-base.js.map +1 -0
- package/dist/agents/knowledges/knowledge-node.js +228 -0
- package/dist/agents/knowledges/knowledge-node.js.map +1 -0
- package/dist/agents/knowledges/types.js +105 -0
- package/dist/agents/knowledges/types.js.map +1 -0
- package/dist/agents/utils/config.js +229 -0
- package/dist/agents/utils/config.js.map +1 -0
- package/dist/agents/workspace/coding-manager.js +20 -0
- package/dist/agents/workspace/coding-manager.js.map +1 -0
- package/dist/agents/workspace/components-manager.js +113 -0
- package/dist/agents/workspace/components-manager.js.map +1 -0
- package/dist/agents/workspace/outline-focus.js +167 -0
- package/dist/agents/workspace/outline-focus.js.map +1 -0
- package/dist/agents/workspace/outline-info.js +430 -0
- package/dist/agents/workspace/outline-info.js.map +1 -0
- package/dist/agents/workspace/page-tree-generator.js +70 -0
- package/dist/agents/workspace/page-tree-generator.js.map +1 -0
- package/dist/agents/workspace/workspace.js +251 -0
- package/dist/agents/workspace/workspace.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/providers/component-docs-provider.js +100 -0
- package/dist/agents/workspace-by-knowledges/providers/component-docs-provider.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/providers/focus-info-provider.js +120 -0
- package/dist/agents/workspace-by-knowledges/providers/focus-info-provider.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/providers/project-info-provider.js +146 -0
- package/dist/agents/workspace-by-knowledges/providers/project-info-provider.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/test.js +242 -0
- package/dist/agents/workspace-by-knowledges/test.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/utils/components-manager.js +132 -0
- package/dist/agents/workspace-by-knowledges/utils/components-manager.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/utils/outline-focus.js +167 -0
- package/dist/agents/workspace-by-knowledges/utils/outline-focus.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/utils/outline-info.js +430 -0
- package/dist/agents/workspace-by-knowledges/utils/outline-info.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/workspace.js +169 -0
- package/dist/agents/workspace-by-knowledges/workspace.js.map +1 -0
- package/dist/api/cloud-components.js +85 -0
- package/dist/api/cloud-components.js.map +1 -0
- package/dist/api-record-replay/manager.js +168 -0
- package/dist/api-record-replay/manager.js.map +1 -0
- package/{src/api-record-replay/recorder.ts → dist/api-record-replay/recorder.js} +22 -32
- package/dist/api-record-replay/recorder.js.map +1 -0
- package/dist/api-record-replay/replayer.js +136 -0
- package/dist/api-record-replay/replayer.js.map +1 -0
- package/dist/components/attachments/index.js +124 -0
- package/dist/components/attachments/index.js.map +1 -0
- package/dist/components/attachments/index.less.js +8 -0
- package/dist/components/attachments/index.less.js.map +1 -0
- package/dist/components/icons/index.js +112 -0
- package/dist/components/icons/index.js.map +1 -0
- package/dist/components/icons/index.less.js +8 -0
- package/dist/components/icons/index.less.js.map +1 -0
- package/dist/components/mention/index.js +19 -0
- package/dist/components/mention/index.js.map +1 -0
- package/dist/components/mention/index.less.js +8 -0
- package/dist/components/mention/index.less.js.map +1 -0
- package/dist/components/messages/index.js +429 -0
- package/dist/components/messages/index.js.map +1 -0
- package/dist/components/messages/index.less.js +8 -0
- package/dist/components/messages/index.less.js.map +1 -0
- package/dist/components/sender/index.js +244 -0
- package/dist/components/sender/index.js.map +1 -0
- package/dist/components/sender/index.less.js +8 -0
- package/dist/components/sender/index.less.js.map +1 -0
- package/dist/context/RequestStatusTracker.js +44 -0
- package/dist/context/RequestStatusTracker.js.map +1 -0
- package/dist/context/index.js +45 -0
- package/dist/context/index.js.map +1 -0
- package/dist/data.js +4 -0
- package/dist/data.js.map +1 -0
- package/dist/index.js +306 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin-ai/node_modules/style-inject/dist/style-inject.es.js +27 -0
- package/dist/plugin-ai/node_modules/style-inject/dist/style-inject.es.js.map +1 -0
- package/dist/plugin-ai/package.json.js +8 -0
- package/dist/plugin-ai/package.json.js.map +1 -0
- package/dist/plugin-ai/test/index.js +206 -0
- package/dist/plugin-ai/test/index.js.map +1 -0
- package/dist/preset/createTemplates.js +29 -0
- package/dist/preset/createTemplates.js.map +1 -0
- package/dist/preset/index.js +13 -0
- package/dist/preset/index.js.map +1 -0
- package/dist/preset/prompts.js +34 -0
- package/dist/preset/prompts.js.map +1 -0
- package/{src/preset/user.ts → dist/preset/user.js} +4 -3
- package/dist/preset/user.js.map +1 -0
- package/dist/requestAsStream.js +269 -0
- package/dist/requestAsStream.js.map +1 -0
- package/dist/rxai/node_modules/idb/build/index.js +277 -0
- package/dist/rxai/node_modules/idb/build/index.js.map +1 -0
- package/dist/rxai/src/agent/base.js +16 -0
- package/dist/rxai/src/agent/base.js.map +1 -0
- package/dist/rxai/src/agent/planning.js +1076 -0
- package/dist/rxai/src/agent/planning.js.map +1 -0
- package/dist/rxai/src/agent/rxai.js +254 -0
- package/dist/rxai/src/agent/rxai.js.map +1 -0
- package/dist/rxai/src/error/base.js +39 -0
- package/dist/rxai/src/error/base.js.map +1 -0
- package/dist/rxai/src/prompt/base.js +11 -0
- package/dist/rxai/src/prompt/base.js.map +1 -0
- package/dist/rxai/src/prompt/planning.js +23 -0
- package/dist/rxai/src/prompt/planning.js.map +1 -0
- package/dist/rxai/src/prompt/tool.js +14 -0
- package/dist/rxai/src/prompt/tool.js.map +1 -0
- package/dist/rxai/src/request/request.js +123 -0
- package/dist/rxai/src/request/request.js.map +1 -0
- package/dist/rxai/src/tool/getHistoryRecords.js +65 -0
- package/dist/rxai/src/tool/getHistoryRecords.js.map +1 -0
- package/dist/rxai/src/tool/util.js +424 -0
- package/dist/rxai/src/tool/util.js.map +1 -0
- package/dist/rxai/src/utils/events.js +43 -0
- package/dist/rxai/src/utils/events.js.map +1 -0
- package/dist/rxai/src/utils/idb.js +240 -0
- package/dist/rxai/src/utils/idb.js.map +1 -0
- package/dist/rxai/src/utils/retry.js +32 -0
- package/dist/rxai/src/utils/retry.js.map +1 -0
- package/dist/rxai/src/utils/uuid.js +7 -0
- package/dist/rxai/src/utils/uuid.js.map +1 -0
- package/dist/startView/components/header/header.js +12 -0
- package/dist/startView/components/header/header.js.map +1 -0
- package/dist/startView/components/header/header.less.js +8 -0
- package/dist/startView/components/header/header.less.js.map +1 -0
- package/dist/startView/index.js +62 -0
- package/dist/startView/index.js.map +1 -0
- package/dist/startView/index.less.js +8 -0
- package/dist/startView/index.less.js.map +1 -0
- package/dist/tools/analyze-and-expand-prd.js +116 -0
- package/dist/tools/analyze-and-expand-prd.js.map +1 -0
- package/dist/tools/analyze-requirement-and-components.js +208 -0
- package/dist/tools/analyze-requirement-and-components.js.map +1 -0
- package/dist/tools/answer.js +33 -0
- package/dist/tools/answer.js.map +1 -0
- package/dist/tools/build-process.js +550 -0
- package/dist/tools/build-process.js.map +1 -0
- package/dist/tools/coding-subagent-as-tool.js +101 -0
- package/dist/tools/coding-subagent-as-tool.js.map +1 -0
- package/dist/tools/generate-ui-content.js +528 -0
- package/dist/tools/generate-ui-content.js.map +1 -0
- package/dist/tools/index.js +31 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/open-dsl.js +49 -0
- package/dist/tools/open-dsl.js.map +1 -0
- package/dist/tools/refactor-ui-content.js +292 -0
- package/dist/tools/refactor-ui-content.js.map +1 -0
- package/dist/tools/utils.js +832 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/view/components/header/header.js +59 -0
- package/dist/view/components/header/header.js.map +1 -0
- package/dist/view/components/header/header.less.js +8 -0
- package/dist/view/components/header/header.less.js.map +1 -0
- package/dist/view/index.js +184 -0
- package/dist/view/index.js.map +1 -0
- package/dist/view/index.less.js +8 -0
- package/dist/view/index.less.js.map +1 -0
- package/package.json +28 -6
- package/src/agents/app.ts +0 -301
- package/src/agents/common.ts +0 -471
- package/src/agents/custom.ts +0 -14
- package/src/agents/index.ts +0 -37
- package/src/agents/knowledges/README.md +0 -614
- package/src/agents/knowledges/SUMMARY.md +0 -527
- package/src/agents/knowledges/index.ts +0 -8
- package/src/agents/knowledges/knowledge-base.ts +0 -565
- package/src/agents/knowledges/knowledge-node.ts +0 -266
- package/src/agents/knowledges/types.ts +0 -208
- package/src/agents/utils/config.ts +0 -427
- package/src/agents/workspace/coding-manager.ts +0 -31
- package/src/agents/workspace/components-manager.ts +0 -124
- package/src/agents/workspace/outline-focus.ts +0 -188
- package/src/agents/workspace/outline-info.ts +0 -520
- package/src/agents/workspace/page-tree-generator.ts +0 -83
- package/src/agents/workspace/workspace.ts +0 -319
- package/src/agents/workspace-by-knowledges/MIGRATION.md +0 -568
- package/src/agents/workspace-by-knowledges/README.md +0 -521
- package/src/agents/workspace-by-knowledges/index.ts +0 -11
- package/src/agents/workspace-by-knowledges/providers/component-docs-provider.ts +0 -92
- package/src/agents/workspace-by-knowledges/providers/focus-info-provider.ts +0 -131
- package/src/agents/workspace-by-knowledges/providers/index.ts +0 -8
- package/src/agents/workspace-by-knowledges/providers/project-info-provider.ts +0 -151
- package/src/agents/workspace-by-knowledges/test.ts +0 -240
- package/src/agents/workspace-by-knowledges/types.ts +0 -56
- package/src/agents/workspace-by-knowledges/utils/components-manager.ts +0 -145
- package/src/agents/workspace-by-knowledges/utils/index.ts +0 -8
- package/src/agents/workspace-by-knowledges/utils/outline-focus.ts +0 -178
- package/src/agents/workspace-by-knowledges/utils/outline-info.ts +0 -521
- package/src/agents/workspace-by-knowledges/workspace.ts +0 -166
- package/src/api/cloud-components.ts +0 -129
- package/src/api-record-replay/README.md +0 -187
- package/src/api-record-replay/index.ts +0 -11
- package/src/api-record-replay/manager.ts +0 -168
- package/src/api-record-replay/replayer.ts +0 -148
- package/src/components/attachments/index.less +0 -117
- package/src/components/attachments/index.tsx +0 -136
- package/src/components/icons/index.less +0 -8
- package/src/components/icons/index.tsx +0 -44
- package/src/components/index.less +0 -34
- package/src/components/mention/index.less +0 -23
- package/src/components/mention/index.tsx +0 -19
- package/src/components/messages/index.less +0 -1013
- package/src/components/messages/index.tsx +0 -519
- package/src/components/sender/index.less +0 -203
- package/src/components/sender/index.tsx +0 -298
- package/src/components/types.ts +0 -31
- package/src/constants/index.ts +0 -8
- package/src/context/RequestStatusTracker.ts +0 -50
- package/src/context/index.ts +0 -83
- package/src/data.ts +0 -5
- package/src/global.d.ts +0 -100
- package/src/index.tsx +0 -264
- package/src/mock.ts +0 -1267
- package/src/preset/agents.ts +0 -380
- package/src/preset/createTemplates.ts +0 -25
- package/src/preset/index.ts +0 -12
- package/src/preset/prompts.ts +0 -235
- package/src/preset/requestAsStream.ts +0 -246
- package/src/startView/components/header/header.less +0 -17
- package/src/startView/components/header/header.tsx +0 -15
- package/src/startView/components/index.ts +0 -1
- package/src/startView/index.less +0 -34
- package/src/startView/index.tsx +0 -61
- package/src/tools/analyze-and-expand-prd.ts +0 -272
- package/src/tools/analyze-requirement-and-components.ts +0 -589
- package/src/tools/answer.ts +0 -59
- package/src/tools/build-process.ts +0 -1174
- package/src/tools/coding-subagent-as-tool.ts +0 -119
- package/src/tools/generate-ui-content.ts +0 -1083
- package/src/tools/index.ts +0 -28
- package/src/tools/open-dsl.ts +0 -69
- package/src/tools/refactor-ui-content.ts +0 -801
- package/src/tools/type.d.ts +0 -12
- package/src/tools/utils.ts +0 -914
- package/src/types/index.ts +0 -4
- package/src/view/components/header/header.less +0 -51
- package/src/view/components/header/header.tsx +0 -60
- package/src/view/components/index.ts +0 -1
- package/src/view/index.less +0 -5
- package/src/view/index.tsx +0 -168
|
@@ -1,614 +0,0 @@
|
|
|
1
|
-
# Knowledges - 知识库系统
|
|
2
|
-
|
|
3
|
-
## 概述
|
|
4
|
-
|
|
5
|
-
知识库系统是一个用于组织和管理发送给大模型的消息内容的抽象框架。它通过虚拟的目录树结构来组织各类知识,并支持完全动态的内容获取,实现了与具体内容(如DSL、组件文档等)的解耦。
|
|
6
|
-
|
|
7
|
-
**核心特性**:
|
|
8
|
-
- 每次 export 时动态获取最新的文件树和文件内容,确保数据实时性
|
|
9
|
-
- 只初始化一个根目录,所有内容完全动态获取
|
|
10
|
-
- 通过 `new DirectoryProvider(config)` 创建 Provider,代码组织清晰
|
|
11
|
-
- 支持动态文档功能,可以运行时添加/删除文档
|
|
12
|
-
- 支持多个动态文档目录,每个目录独立配置
|
|
13
|
-
- 支持权重排序,控制目录和文件的显示顺序
|
|
14
|
-
- 支持隐藏节点,隐藏的节点不在目录树中显示但可以打开
|
|
15
|
-
- 自动标记已删除的文件
|
|
16
|
-
|
|
17
|
-
## 核心概念
|
|
18
|
-
|
|
19
|
-
### 1. 知识库 (KnowledgeBase)
|
|
20
|
-
|
|
21
|
-
知识库是整个系统的核心,管理着目录提供者(Provider)、动态文档和已打开的文件。一个知识库本质上对应着一条发送给大模型的消息。
|
|
22
|
-
|
|
23
|
-
**主要功能**:
|
|
24
|
-
- 注册和管理 Provider
|
|
25
|
-
- 注册和管理动态文档目录
|
|
26
|
-
- 添加/删除/打开动态文档
|
|
27
|
-
- 打开/关闭文件
|
|
28
|
-
- 导出知识库内容
|
|
29
|
-
|
|
30
|
-
### 2. 知识节点 (KnowledgeNode)
|
|
31
|
-
|
|
32
|
-
知识节点是知识库中的基本单元,可以是:
|
|
33
|
-
- **目录节点**:组织结构,包含子节点
|
|
34
|
-
- **文件节点**:实际的知识内容
|
|
35
|
-
|
|
36
|
-
**节点属性**:
|
|
37
|
-
- `id` - 节点唯一标识
|
|
38
|
-
- `name` - 节点名称(用于展示)
|
|
39
|
-
- `type` - 节点类型(DIRECTORY 或 FILE)
|
|
40
|
-
- `description` - 节点描述
|
|
41
|
-
- `extname` - 文件扩展名(如 `.md`, `.json` 等)
|
|
42
|
-
- `hidden` - 是否隐藏(隐藏的节点不在目录树中显示)
|
|
43
|
-
- `ellipsis` - 是否显示省略号(表示不完整的树)
|
|
44
|
-
- `metadata` - 元数据
|
|
45
|
-
|
|
46
|
-
### 3. 目录提供者 (DirectoryProvider)
|
|
47
|
-
|
|
48
|
-
每种目录类型(如项目信息、组件文档等)通过 `new DirectoryProvider(config)` 创建,负责:
|
|
49
|
-
- 定义目录的基本信息(id、name、description、weight)
|
|
50
|
-
- 动态获取子节点列表(getChildren)
|
|
51
|
-
- 动态读取文件内容(readFile)
|
|
52
|
-
- 可以自定义根节点(customRootNode),将目录呈现为文件
|
|
53
|
-
|
|
54
|
-
### 4. 动态文档 (DynamicDocument)
|
|
55
|
-
|
|
56
|
-
动态文档是运行时动态添加的文档,可以聚合在不同的动态文档目录下:
|
|
57
|
-
- 支持添加/删除动态文档
|
|
58
|
-
- 支持注册多个动态文档目录
|
|
59
|
-
- 每个目录可以独立配置名称、描述、权重、是否隐藏
|
|
60
|
-
- 动态文档可以像普通文件一样打开和导出
|
|
61
|
-
|
|
62
|
-
## 使用示例
|
|
63
|
-
|
|
64
|
-
### 基础使用
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
import {
|
|
68
|
-
KnowledgeBase,
|
|
69
|
-
DirectoryProvider,
|
|
70
|
-
IKnowledgeNode,
|
|
71
|
-
KnowledgeNodeType
|
|
72
|
-
} from './knowledges';
|
|
73
|
-
|
|
74
|
-
// 1. 创建知识库
|
|
75
|
-
const knowledgeBase = new KnowledgeBase({
|
|
76
|
-
name: 'Workspace Knowledge',
|
|
77
|
-
description: '工作空间知识库,包含项目的所有相关信息'
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
// 2. 创建并注册 Provider(使用 new DirectoryProvider)
|
|
81
|
-
const projectInfoProvider = new DirectoryProvider({
|
|
82
|
-
id: 'project-info',
|
|
83
|
-
name: '项目信息',
|
|
84
|
-
description: '包含项目的基本信息',
|
|
85
|
-
weight: 100, // 权重越大越靠前
|
|
86
|
-
|
|
87
|
-
async getChildren(parentId: string): Promise<IKnowledgeNode[]> {
|
|
88
|
-
if (parentId === 'project-info') {
|
|
89
|
-
const pages = await fetchAllPages();
|
|
90
|
-
return pages.map(page => ({
|
|
91
|
-
id: page.id,
|
|
92
|
-
name: page.name,
|
|
93
|
-
type: KnowledgeNodeType.FILE,
|
|
94
|
-
extname: '.dsl',
|
|
95
|
-
description: page.description,
|
|
96
|
-
metadata: { providerId: 'project-info', pageId: page.id }
|
|
97
|
-
}));
|
|
98
|
-
}
|
|
99
|
-
return [];
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
async readFile(fileId: string): Promise<string> {
|
|
103
|
-
return await fetchPageContent(fileId);
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
knowledgeBase.registerProvider(projectInfoProvider);
|
|
108
|
-
|
|
109
|
-
// 3. 创建并注册另一个 Provider
|
|
110
|
-
const docsProvider = new DirectoryProvider({
|
|
111
|
-
id: 'component-docs',
|
|
112
|
-
name: '组件文档',
|
|
113
|
-
description: '组件配置文档',
|
|
114
|
-
weight: 80,
|
|
115
|
-
hidden: true, // 隐藏目录,不在目录树中显示
|
|
116
|
-
|
|
117
|
-
async getChildren(parentId: string): Promise<IKnowledgeNode[]> {
|
|
118
|
-
if (parentId === 'component-docs') {
|
|
119
|
-
const components = await fetchAllComponents();
|
|
120
|
-
return components.map(comp => ({
|
|
121
|
-
id: comp.namespace,
|
|
122
|
-
name: comp.abbreviation,
|
|
123
|
-
type: KnowledgeNodeType.FILE,
|
|
124
|
-
extname: '.md',
|
|
125
|
-
hidden: true, // 文件也是隐藏的
|
|
126
|
-
metadata: { providerId: 'component-docs', namespace: comp.namespace }
|
|
127
|
-
}));
|
|
128
|
-
}
|
|
129
|
-
return [];
|
|
130
|
-
},
|
|
131
|
-
|
|
132
|
-
async readFile(fileId: string): Promise<string> {
|
|
133
|
-
return await fetchComponentDoc(fileId);
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
knowledgeBase.registerProvider(docsProvider);
|
|
138
|
-
|
|
139
|
-
// 4. 标记要打开的文件
|
|
140
|
-
await knowledgeBase.openFile('project-info/首页.dsl');
|
|
141
|
-
await knowledgeBase.openFile('component-docs/pc.button.md'); // 可以打开隐藏文件
|
|
142
|
-
|
|
143
|
-
// 5. 导出(动态获取最新文件树和内容)
|
|
144
|
-
const message = await knowledgeBase.export({
|
|
145
|
-
includeTree: true
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
console.log(message);
|
|
149
|
-
// 输出:
|
|
150
|
-
// # Workspace Knowledge
|
|
151
|
-
// 工作空间知识库,包含项目的所有相关信息
|
|
152
|
-
//
|
|
153
|
-
// ## 目录结构
|
|
154
|
-
// - 项目信息/ (包含项目的基本信息)
|
|
155
|
-
// - 首页.dsl [已打开]
|
|
156
|
-
// - 详情页.dsl
|
|
157
|
-
// (组件文档目录被隐藏,不显示在目录树中)
|
|
158
|
-
//
|
|
159
|
-
// ## 已打开的文件
|
|
160
|
-
//
|
|
161
|
-
// ### 首页.dsl
|
|
162
|
-
// > 首页描述
|
|
163
|
-
// --BEGIN--
|
|
164
|
-
// { ... DSL 内容 ... }
|
|
165
|
-
// --END--
|
|
166
|
-
//
|
|
167
|
-
// ### pc.button.md
|
|
168
|
-
// > 按钮组件
|
|
169
|
-
// --BEGIN--
|
|
170
|
-
// # Button 组件文档
|
|
171
|
-
// ...
|
|
172
|
-
// --END--
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### 创建自定义 Provider - 基础示例
|
|
176
|
-
|
|
177
|
-
```typescript
|
|
178
|
-
import { DirectoryProvider, IKnowledgeNode, KnowledgeNodeType } from './knowledges';
|
|
179
|
-
|
|
180
|
-
// 方式1:使用 new DirectoryProvider 创建(推荐)
|
|
181
|
-
function createFocusInfoProvider(getFocusInfo: () => Promise<string>) {
|
|
182
|
-
return new DirectoryProvider({
|
|
183
|
-
id: 'focus-info',
|
|
184
|
-
name: '聚焦信息',
|
|
185
|
-
description: '当前聚焦的信息',
|
|
186
|
-
weight: 90,
|
|
187
|
-
|
|
188
|
-
async getChildren(parentId: string): Promise<IKnowledgeNode[]> {
|
|
189
|
-
if (parentId === 'focus-info') {
|
|
190
|
-
return [{
|
|
191
|
-
id: 'focus-description',
|
|
192
|
-
name: 'description',
|
|
193
|
-
type: KnowledgeNodeType.FILE,
|
|
194
|
-
extname: '.md',
|
|
195
|
-
description: '当前聚焦的信息',
|
|
196
|
-
metadata: { providerId: 'focus-info' }
|
|
197
|
-
}];
|
|
198
|
-
}
|
|
199
|
-
return [];
|
|
200
|
-
},
|
|
201
|
-
|
|
202
|
-
async readFile(fileId: string): Promise<string> {
|
|
203
|
-
if (fileId === 'focus-info/focus-description') {
|
|
204
|
-
return await getFocusInfo();
|
|
205
|
-
}
|
|
206
|
-
throw new Error(`File not found: ${fileId}`);
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// 使用
|
|
212
|
-
const focusProvider = createFocusInfoProvider(
|
|
213
|
-
async () => '当前聚焦的页面是:首页'
|
|
214
|
-
);
|
|
215
|
-
knowledgeBase.registerProvider(focusProvider);
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### 将目录呈现为文件
|
|
219
|
-
|
|
220
|
-
有时你希望将一个 Provider 呈现为单个文件而不是目录,可以使用 `customRootNode`:
|
|
221
|
-
|
|
222
|
-
```typescript
|
|
223
|
-
// 创建一个作为文件呈现的 Provider
|
|
224
|
-
const projectInfoProvider = new DirectoryProvider({
|
|
225
|
-
id: 'project-info',
|
|
226
|
-
name: '项目信息',
|
|
227
|
-
description: '包含项目的画布索引',
|
|
228
|
-
weight: 100,
|
|
229
|
-
|
|
230
|
-
// 自定义根节点为文件
|
|
231
|
-
customRootNode: {
|
|
232
|
-
id: 'project-info',
|
|
233
|
-
name: '项目信息',
|
|
234
|
-
type: KnowledgeNodeType.FILE,
|
|
235
|
-
extname: '.md',
|
|
236
|
-
description: '包含项目的画布索引',
|
|
237
|
-
metadata: { providerId: 'project-info' }
|
|
238
|
-
},
|
|
239
|
-
|
|
240
|
-
// 因为是文件,所以没有子节点
|
|
241
|
-
async getChildren(parentId: string) {
|
|
242
|
-
return [];
|
|
243
|
-
},
|
|
244
|
-
|
|
245
|
-
// 读取文件内容
|
|
246
|
-
async readFile(fileId: string) {
|
|
247
|
-
if (fileId !== 'project-info') {
|
|
248
|
-
throw new Error(`Invalid file ID: ${fileId}`);
|
|
249
|
-
}
|
|
250
|
-
return await generateProjectInfo();
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
knowledgeBase.registerProvider(projectInfoProvider);
|
|
255
|
-
|
|
256
|
-
// 现在可以直接打开这个文件
|
|
257
|
-
await knowledgeBase.openFile('项目信息.md');
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
### 动态文档功能
|
|
261
|
-
|
|
262
|
-
动态文档是运行时动态添加的文档,非常适合用于临时内容或用户操作生成的内容:
|
|
263
|
-
|
|
264
|
-
```typescript
|
|
265
|
-
// 1. 注册动态文档目录
|
|
266
|
-
knowledgeBase.registerDynamicDirectory({
|
|
267
|
-
id: 'opened-pages',
|
|
268
|
-
name: '已打开的页面',
|
|
269
|
-
description: '用户打开的页面文档',
|
|
270
|
-
weight: 80,
|
|
271
|
-
hidden: false // 不隐藏,在目录树中显示
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
// 2. 添加动态文档到指定目录
|
|
275
|
-
knowledgeBase.addDynamicDocument({
|
|
276
|
-
id: 'page1',
|
|
277
|
-
title: '首页',
|
|
278
|
-
description: '项目首页',
|
|
279
|
-
content: '<页面内容>',
|
|
280
|
-
directoryId: 'opened-pages',
|
|
281
|
-
extname: '.md'
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
// 3. 打开动态文档(简化方法)
|
|
285
|
-
await knowledgeBase.openDynamicDocument({
|
|
286
|
-
id: 'page2',
|
|
287
|
-
title: '详情页',
|
|
288
|
-
content: '<详情页内容>',
|
|
289
|
-
directoryId: 'opened-pages'
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
// 4. 获取动态文档
|
|
293
|
-
const doc = knowledgeBase.getDynamicDocument('page1', 'opened-pages');
|
|
294
|
-
|
|
295
|
-
// 5. 删除动态文档
|
|
296
|
-
knowledgeBase.removeDynamicDocument('page1', 'opened-pages');
|
|
297
|
-
|
|
298
|
-
// 6. 清空目录中的所有动态文档
|
|
299
|
-
knowledgeBase.clearDynamicDocuments('opened-pages');
|
|
300
|
-
|
|
301
|
-
// 目录树中会显示:
|
|
302
|
-
// - 已打开的页面/ (用户打开的页面文档)
|
|
303
|
-
// - 首页.md [已打开]
|
|
304
|
-
// - 详情页.md [已打开]
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
### 处理已删除的文件
|
|
308
|
-
|
|
309
|
-
当一个已打开的文件被删除后,export 时会自动标记为"已删除":
|
|
310
|
-
|
|
311
|
-
```typescript
|
|
312
|
-
// 打开一个文件
|
|
313
|
-
await knowledgeBase.openFile('project-info/temp.dsl');
|
|
314
|
-
|
|
315
|
-
// 稍后该文件被删除...
|
|
316
|
-
|
|
317
|
-
// 导出时会自动处理
|
|
318
|
-
const message = await knowledgeBase.export();
|
|
319
|
-
// 输出:
|
|
320
|
-
// ### temp.dsl [已删除]
|
|
321
|
-
// > 该文件已被删除或不存在
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
## API 文档
|
|
325
|
-
|
|
326
|
-
### KnowledgeBase
|
|
327
|
-
|
|
328
|
-
#### 构造函数
|
|
329
|
-
```typescript
|
|
330
|
-
constructor(config: KnowledgeBaseConfig)
|
|
331
|
-
|
|
332
|
-
interface KnowledgeBaseConfig {
|
|
333
|
-
name: string;
|
|
334
|
-
description?: string;
|
|
335
|
-
}
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
#### Provider 管理
|
|
339
|
-
|
|
340
|
-
- `registerProvider(provider: IDirectoryProvider): void` - 注册目录提供者
|
|
341
|
-
- `getProvider(providerId: string): IDirectoryProvider | undefined` - 获取 Provider
|
|
342
|
-
|
|
343
|
-
#### 动态文档管理
|
|
344
|
-
|
|
345
|
-
- `registerDynamicDirectory(config: DynamicDocDirectoryConfig): void` - 注册动态文档目录
|
|
346
|
-
- `addDynamicDocument(doc: DynamicDocument): void` - 添加动态文档
|
|
347
|
-
- `removeDynamicDocument(docId: string, directoryId?: string): void` - 删除动态文档
|
|
348
|
-
- `getDynamicDocument(docId: string, directoryId?: string): DynamicDocument | undefined` - 获取动态文档
|
|
349
|
-
- `clearDynamicDocuments(directoryId?: string): void` - 清空动态文档
|
|
350
|
-
- `openDynamicDocument(doc: DynamicDocument): Promise<void>` - 打开动态文档(简化方法)
|
|
351
|
-
|
|
352
|
-
#### 文件管理
|
|
353
|
-
|
|
354
|
-
- `openFile(path: string): Promise<void>` - 打开文件(动态查找文件)
|
|
355
|
-
- `closeFile(path: string): void` - 关闭文件
|
|
356
|
-
- `isFileOpened(path: string): boolean` - 检查文件是否已打开
|
|
357
|
-
- `getOpenedFilePaths(): string[]` - 获取所有已打开的文件路径
|
|
358
|
-
- `clearOpenedFiles(): void` - 清空所有已打开的文件
|
|
359
|
-
|
|
360
|
-
#### 查询和导出
|
|
361
|
-
|
|
362
|
-
- `getRoot(): KnowledgeNode` - 获取根节点
|
|
363
|
-
- `findNode(path: string): Promise<KnowledgeNode | null>` - 根据路径查找节点(动态查找)
|
|
364
|
-
- `getDirectoryTree(options?): Promise<string>` - 获取目录树文本(动态获取,隐藏节点不显示)
|
|
365
|
-
- `export(options?: ExportOptions): Promise<string>` - 导出为消息内容(动态获取,自动标记已删除文件)
|
|
366
|
-
|
|
367
|
-
### DirectoryProvider
|
|
368
|
-
|
|
369
|
-
通过 `new DirectoryProvider(config)` 创建:
|
|
370
|
-
|
|
371
|
-
#### DirectoryProviderConfig
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
interface DirectoryProviderConfig {
|
|
375
|
-
// 基本信息
|
|
376
|
-
id: string; // Provider 唯一标识
|
|
377
|
-
name: string; // 目录名称
|
|
378
|
-
description?: string; // 目录描述
|
|
379
|
-
weight?: number; // 权重(数字越大优先级越高),默认为 0
|
|
380
|
-
hidden?: boolean; // 是否隐藏(隐藏的目录不在目录树中显示)
|
|
381
|
-
|
|
382
|
-
// 自定义根节点(可选)
|
|
383
|
-
customRootNode?: IKnowledgeNode;
|
|
384
|
-
|
|
385
|
-
// 必须实现的方法
|
|
386
|
-
getChildren: (parentId: string) => Promise<IKnowledgeNode[]>;
|
|
387
|
-
readFile: (fileId: string) => Promise<string>;
|
|
388
|
-
}
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
#### DynamicDocument
|
|
392
|
-
|
|
393
|
-
```typescript
|
|
394
|
-
interface DynamicDocument {
|
|
395
|
-
id: string; // 文档唯一ID
|
|
396
|
-
title?: string; // 文档标题
|
|
397
|
-
description?: string; // 文档描述
|
|
398
|
-
content: string; // 文档内容
|
|
399
|
-
docType?: string; // 文档类型(用于分类)
|
|
400
|
-
extname?: string; // 文件扩展名,默认 .md
|
|
401
|
-
directoryId?: string; // 所属目录ID
|
|
402
|
-
}
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
#### DynamicDocDirectoryConfig
|
|
406
|
-
|
|
407
|
-
```typescript
|
|
408
|
-
interface DynamicDocDirectoryConfig {
|
|
409
|
-
id: string; // 目录ID
|
|
410
|
-
name: string; // 目录名称
|
|
411
|
-
description?: string; // 目录描述
|
|
412
|
-
weight?: number; // 权重(数字越大优先级越高)
|
|
413
|
-
hidden?: boolean; // 是否隐藏
|
|
414
|
-
}
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
### KnowledgeNode
|
|
418
|
-
|
|
419
|
-
#### 属性
|
|
420
|
-
|
|
421
|
-
- `id: string` - 节点ID
|
|
422
|
-
- `name: string` - 节点名称
|
|
423
|
-
- `type: KnowledgeNodeType` - 节点类型
|
|
424
|
-
- `description?: string` - 节点描述
|
|
425
|
-
- `extname?: string` - 文件扩展名(如 .dsl, .md 等;目录也可以有扩展名)
|
|
426
|
-
- `ellipsis?: boolean` - 是否显示省略号(表示不完整的树)
|
|
427
|
-
- `hidden?: boolean` - 是否隐藏(隐藏的节点不在目录树中显示,但可以打开)
|
|
428
|
-
- `children?: KnowledgeNode[]` - 子节点(仅目录类型)
|
|
429
|
-
- `metadata?: Record<string, any>` - 元数据
|
|
430
|
-
|
|
431
|
-
#### 主要方法
|
|
432
|
-
|
|
433
|
-
- `getContent(): Promise<string>` - 获取文件内容(每次都重新读取)
|
|
434
|
-
- `getChildren(): Promise<KnowledgeNode[]>` - 获取目录的子节点列表(每次都动态重新查询)
|
|
435
|
-
- `findByPath(path: string): Promise<KnowledgeNode | null>` - 根据路径查找节点(动态查找)
|
|
436
|
-
- `getPath(root: KnowledgeNode): Promise<string>` - 获取节点路径(动态获取)
|
|
437
|
-
|
|
438
|
-
## 设计原则
|
|
439
|
-
|
|
440
|
-
1. **解耦**: 知识库与具体内容(DSL、组件文档等)解耦,通过 `new DirectoryProvider(config)` 创建 Provider
|
|
441
|
-
2. **完全动态**: 每次 export 都动态获取最新的文件树和文件内容,确保数据实时性
|
|
442
|
-
3. **轻量级**: 只初始化一个根目录,不缓存任何文件结构和内容
|
|
443
|
-
4. **容错性**: 自动标记已删除的文件,不影响整体导出
|
|
444
|
-
5. **可扩展**: 通过创建新的 Provider 轻松添加新的目录类型
|
|
445
|
-
6. **代码组织**: 每种目录类型独立的 Provider,避免回调中的大量 if-else
|
|
446
|
-
7. **灵活性**: 支持动态文档、权重排序、隐藏节点等高级功能
|
|
447
|
-
8. **类型安全**: 完整的 TypeScript 类型定义
|
|
448
|
-
|
|
449
|
-
## 与 Workspace 的集成
|
|
450
|
-
|
|
451
|
-
知识库系统可以与 Workspace 集成,查看 `workspace-by-knowledges` 目录了解完整实现:
|
|
452
|
-
|
|
453
|
-
```typescript
|
|
454
|
-
import { KnowledgeBase, DirectoryProvider, IKnowledgeNode, KnowledgeNodeType } from './knowledges';
|
|
455
|
-
|
|
456
|
-
// 创建 Provider 工厂函数
|
|
457
|
-
function createProjectInfoProvider() {
|
|
458
|
-
return new DirectoryProvider({
|
|
459
|
-
id: 'project-info',
|
|
460
|
-
name: '项目信息',
|
|
461
|
-
description: '包含项目的画布索引',
|
|
462
|
-
weight: 100,
|
|
463
|
-
|
|
464
|
-
// 将目录呈现为文件
|
|
465
|
-
customRootNode: {
|
|
466
|
-
id: 'project-info',
|
|
467
|
-
name: '项目信息',
|
|
468
|
-
type: KnowledgeNodeType.FILE,
|
|
469
|
-
extname: '.md',
|
|
470
|
-
metadata: { providerId: 'project-info' }
|
|
471
|
-
},
|
|
472
|
-
|
|
473
|
-
async getChildren(parentId: string) {
|
|
474
|
-
return []; // 文件没有子节点
|
|
475
|
-
},
|
|
476
|
-
|
|
477
|
-
async readFile(fileId: string) {
|
|
478
|
-
const pages = await fetchAllPages();
|
|
479
|
-
return generateProjectInfo(pages);
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
class Workspace extends KnowledgeBase {
|
|
485
|
-
constructor() {
|
|
486
|
-
super({
|
|
487
|
-
name: 'Workspace',
|
|
488
|
-
description: '工作空间知识库'
|
|
489
|
-
});
|
|
490
|
-
|
|
491
|
-
// 注册各种 Provider
|
|
492
|
-
this.registerProvider(createProjectInfoProvider());
|
|
493
|
-
this.registerProvider(createFocusInfoProvider());
|
|
494
|
-
this.registerProvider(createComponentDocsProvider());
|
|
495
|
-
|
|
496
|
-
// 注册动态文档目录
|
|
497
|
-
this.registerDynamicDirectory({
|
|
498
|
-
id: 'opened-pages',
|
|
499
|
-
name: '已打开的页面',
|
|
500
|
-
weight: 80
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
// 默认打开项目信息和聚焦信息
|
|
504
|
-
this.openDefaultFiles();
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
private async openDefaultFiles() {
|
|
508
|
-
await this.openFile('项目信息.md');
|
|
509
|
-
await this.openFile('聚焦信息.md');
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
async openComponentDoc(namespace: string) {
|
|
513
|
-
const abbreviation = getAbbreviation(namespace);
|
|
514
|
-
await this.openFile(`组件配置文档/${abbreviation}.md`);
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
async openDocument(id: string, options: { type: string; content: string }) {
|
|
518
|
-
await this.openDynamicDocument({
|
|
519
|
-
id,
|
|
520
|
-
title: id,
|
|
521
|
-
content: options.content,
|
|
522
|
-
directoryId: 'opened-pages'
|
|
523
|
-
});
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
// 使用
|
|
528
|
-
const workspace = new Workspace();
|
|
529
|
-
await workspace.openComponentDoc('mybricks.normal-pc.button');
|
|
530
|
-
await workspace.openDocument('page1', { type: '画布', content: '<页面内容>' });
|
|
531
|
-
const message = await workspace.export();
|
|
532
|
-
```
|
|
533
|
-
|
|
534
|
-
## 高级特性
|
|
535
|
-
|
|
536
|
-
### 权重排序
|
|
537
|
-
|
|
538
|
-
通过 `weight` 属性控制目录和文件的显示顺序:
|
|
539
|
-
|
|
540
|
-
```typescript
|
|
541
|
-
// 权重越大越靠前
|
|
542
|
-
const projectInfoProvider = new DirectoryProvider({
|
|
543
|
-
id: 'project-info',
|
|
544
|
-
weight: 100, // 最高权重,排第一
|
|
545
|
-
// ...
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
const focusInfoProvider = new DirectoryProvider({
|
|
549
|
-
id: 'focus-info',
|
|
550
|
-
weight: 90, // 排第二
|
|
551
|
-
// ...
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
const componentDocsProvider = new DirectoryProvider({
|
|
555
|
-
id: 'component-docs',
|
|
556
|
-
weight: 0, // 默认权重,排最后
|
|
557
|
-
// ...
|
|
558
|
-
});
|
|
559
|
-
```
|
|
560
|
-
|
|
561
|
-
### 隐藏节点
|
|
562
|
-
|
|
563
|
-
通过 `hidden` 属性隐藏节点,隐藏的节点不在目录树中显示但可以打开:
|
|
564
|
-
|
|
565
|
-
```typescript
|
|
566
|
-
const componentDocsProvider = new DirectoryProvider({
|
|
567
|
-
id: 'component-docs',
|
|
568
|
-
hidden: true, // 目录隐藏
|
|
569
|
-
|
|
570
|
-
async getChildren(parentId: string) {
|
|
571
|
-
return components.map(comp => ({
|
|
572
|
-
id: comp.namespace,
|
|
573
|
-
name: comp.abbreviation,
|
|
574
|
-
type: KnowledgeNodeType.FILE,
|
|
575
|
-
hidden: true, // 文件也隐藏
|
|
576
|
-
// ...
|
|
577
|
-
}));
|
|
578
|
-
},
|
|
579
|
-
// ...
|
|
580
|
-
});
|
|
581
|
-
|
|
582
|
-
// 可以打开隐藏文件
|
|
583
|
-
await knowledgeBase.openFile('component-docs/pc.button.md');
|
|
584
|
-
|
|
585
|
-
// 导出时会包含已打开的隐藏文件
|
|
586
|
-
const content = await knowledgeBase.export();
|
|
587
|
-
```
|
|
588
|
-
|
|
589
|
-
### 省略号支持
|
|
590
|
-
|
|
591
|
-
通过 `ellipsis` 属性标记节点为不完整的树:
|
|
592
|
-
|
|
593
|
-
```typescript
|
|
594
|
-
return [{
|
|
595
|
-
id: 'partial-tree',
|
|
596
|
-
name: '部分树结构',
|
|
597
|
-
type: KnowledgeNodeType.DIRECTORY,
|
|
598
|
-
ellipsis: true, // 标记为不完整
|
|
599
|
-
// ...
|
|
600
|
-
}];
|
|
601
|
-
|
|
602
|
-
// 目录树中会显示:
|
|
603
|
-
// - 部分树结构/ ...
|
|
604
|
-
```
|
|
605
|
-
|
|
606
|
-
## 扩展建议
|
|
607
|
-
|
|
608
|
-
1. 支持文件内容缓存策略,减少重复读取
|
|
609
|
-
2. 支持批量打开/关闭文件
|
|
610
|
-
3. 添加文件打开历史记录
|
|
611
|
-
4. 支持文件变更监听和自动更新
|
|
612
|
-
5. 支持文件搜索和过滤功能
|
|
613
|
-
6. 支持多层嵌套的目录结构(在 Provider 的 getChildren 中实现)
|
|
614
|
-
7. 支持文件分组和标签功能
|