@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,527 +0,0 @@
|
|
|
1
|
-
# Knowledges 知识库系统 - 设计总结
|
|
2
|
-
|
|
3
|
-
## 🎯 设计目标
|
|
4
|
-
|
|
5
|
-
为大模型消息生成设计一个**解耦的、可扩展的知识库系统**,用于组织和管理发送给AI的结构化信息。
|
|
6
|
-
|
|
7
|
-
## ✨ 核心特性
|
|
8
|
-
|
|
9
|
-
### 1. 完全解耦
|
|
10
|
-
- ✅ 知识库与具体内容(DSL、组件文档等)**完全分离**
|
|
11
|
-
- ✅ 通过 `new DirectoryProvider(config)` **创建 Provider**
|
|
12
|
-
- ✅ 易于测试和维护
|
|
13
|
-
|
|
14
|
-
### 2. 完全动态
|
|
15
|
-
- ✅ 每次 export 时**动态获取最新文件树和内容**
|
|
16
|
-
- ✅ 只初始化一个根目录,所有内容完全动态
|
|
17
|
-
- ✅ 确保数据始终是最新的
|
|
18
|
-
|
|
19
|
-
### 3. 代码组织清晰
|
|
20
|
-
- ✅ 每种目录类型独立的 **Provider**
|
|
21
|
-
- ✅ 避免回调中的大量 if-else 判断
|
|
22
|
-
- ✅ 支持任意深度的嵌套结构
|
|
23
|
-
- ✅ 支持**自定义元数据**和**自定义根节点**
|
|
24
|
-
|
|
25
|
-
### 4. 灵活性强
|
|
26
|
-
- ✅ 支持**动态文档**功能,运行时添加/删除文档
|
|
27
|
-
- ✅ 支持**多个动态文档目录**,每个目录独立配置
|
|
28
|
-
- ✅ 支持**权重排序**,控制目录和文件的显示顺序
|
|
29
|
-
- ✅ 支持**隐藏节点**,隐藏的节点不在目录树中显示但可以打开
|
|
30
|
-
|
|
31
|
-
### 5. 容错性强
|
|
32
|
-
- ✅ 自动标记已删除的文件
|
|
33
|
-
- ✅ 不依赖真实文件系统
|
|
34
|
-
- ✅ 支持动态生成目录结构
|
|
35
|
-
|
|
36
|
-
## 📂 项目结构
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
knowledges/
|
|
40
|
-
├── 核心文件
|
|
41
|
-
│ ├── index.ts # 主导出
|
|
42
|
-
│ ├── types.ts # 类型定义
|
|
43
|
-
│ ├── knowledge-base.ts # 知识库管理器 (核心)
|
|
44
|
-
│ └── knowledge-node.ts # 知识节点 (基础单元)
|
|
45
|
-
│
|
|
46
|
-
└── 文档
|
|
47
|
-
├── README.md # 完整文档
|
|
48
|
-
└── SUMMARY.md # 本文件
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## 🔑 核心概念
|
|
52
|
-
|
|
53
|
-
### 知识库消息的组成
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
┌─────────────────────────────────────┐
|
|
57
|
-
│ 知识库消息 (Message) │
|
|
58
|
-
├─────────────────────────────────────┤
|
|
59
|
-
│ │
|
|
60
|
-
│ 1. 目录结构树 (Directory Tree) │
|
|
61
|
-
│ └─ 展示知识的组织结构 │
|
|
62
|
-
│ │
|
|
63
|
-
│ 2. 已打开的文件 (Opened Files) │
|
|
64
|
-
│ └─ 实际的知识内容 │
|
|
65
|
-
│ │
|
|
66
|
-
└─────────────────────────────────────┘
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### 两层架构
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
┌──────────────────────────────────────┐
|
|
73
|
-
│ 应用层 (Application Layer) │
|
|
74
|
-
│ Workspace / 用户代码 │
|
|
75
|
-
│ 实现各种 DirectoryProvider │
|
|
76
|
-
│ (DSLProvider, DocsProvider, etc.) │
|
|
77
|
-
└────────────┬─────────────────────────┘
|
|
78
|
-
│
|
|
79
|
-
│ 注册 Provider(动态获取)
|
|
80
|
-
▼
|
|
81
|
-
┌──────────────────────────────────────┐
|
|
82
|
-
│ 抽象层 (Abstract Layer) │
|
|
83
|
-
│ KnowledgeBase + KnowledgeNode │
|
|
84
|
-
│ (与具体业务完全解耦) │
|
|
85
|
-
│ 每次 export 动态调用 Provider 获取最新数据 │
|
|
86
|
-
└──────────────────────────────────────┘
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## 🏗️ 设计模式
|
|
90
|
-
|
|
91
|
-
| 模式 | 应用 | 好处 |
|
|
92
|
-
|------|------|------|
|
|
93
|
-
| **策略模式** | DirectoryProvider | 每种目录类型独立策略 |
|
|
94
|
-
| **注册模式** | registerProvider | 灵活注册不同的 Provider |
|
|
95
|
-
| **组合模式** | KnowledgeNode树结构 | 统一处理目录和文件 |
|
|
96
|
-
| **工厂模式** | `new DirectoryProvider(config)` | 通过配置创建 Provider |
|
|
97
|
-
| **动态获取** | export时调用Provider | 确保数据实时性 |
|
|
98
|
-
| **容错处理** | 已删除文件标记 | 提高系统健壮性 |
|
|
99
|
-
|
|
100
|
-
## 💡 使用流程
|
|
101
|
-
|
|
102
|
-
### 完整流程图
|
|
103
|
-
|
|
104
|
-
```
|
|
105
|
-
创建知识库
|
|
106
|
-
↓
|
|
107
|
-
创建并注册 Provider
|
|
108
|
-
↓
|
|
109
|
-
标记要打开的文件
|
|
110
|
-
↓
|
|
111
|
-
导出为消息(动态获取最新文件树和内容)
|
|
112
|
-
↓
|
|
113
|
-
发送给大模型
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### 代码示例
|
|
117
|
-
|
|
118
|
-
```typescript
|
|
119
|
-
import { KnowledgeBase, DirectoryProvider, IKnowledgeNode, KnowledgeNodeType } from './knowledges';
|
|
120
|
-
|
|
121
|
-
// 1. 创建知识库
|
|
122
|
-
const kb = new KnowledgeBase({
|
|
123
|
-
name: 'Workspace',
|
|
124
|
-
description: '工作空间知识库'
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
// 2. 使用 new DirectoryProvider 创建并注册 Provider(推荐方式)
|
|
128
|
-
const projectInfoProvider = new DirectoryProvider({
|
|
129
|
-
id: 'project-info',
|
|
130
|
-
name: '项目信息',
|
|
131
|
-
description: 'DSL 页面定义',
|
|
132
|
-
weight: 100, // 高权重,排在最前面
|
|
133
|
-
|
|
134
|
-
async getChildren(parentId: string): Promise<IKnowledgeNode[]> {
|
|
135
|
-
if (parentId === 'project-info') {
|
|
136
|
-
const pages = await fetchAllPages(); // 动态获取最新页面列表
|
|
137
|
-
return pages.map(p => ({
|
|
138
|
-
id: p.id,
|
|
139
|
-
name: p.name,
|
|
140
|
-
type: KnowledgeNodeType.FILE,
|
|
141
|
-
extname: '.dsl',
|
|
142
|
-
metadata: { providerId: 'project-info', pageId: p.id }
|
|
143
|
-
}));
|
|
144
|
-
}
|
|
145
|
-
return [];
|
|
146
|
-
},
|
|
147
|
-
|
|
148
|
-
async readFile(fileId: string): Promise<string> {
|
|
149
|
-
return await fetchPageContent(fileId);
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
kb.registerProvider(projectInfoProvider);
|
|
154
|
-
|
|
155
|
-
// 3. 注册组件文档 Provider(隐藏目录)
|
|
156
|
-
const componentDocsProvider = new DirectoryProvider({
|
|
157
|
-
id: 'component-docs',
|
|
158
|
-
name: '组件配置文档',
|
|
159
|
-
description: '所有组件的详细配置文档',
|
|
160
|
-
weight: 0,
|
|
161
|
-
hidden: true, // 隐藏,不在目录树中显示
|
|
162
|
-
|
|
163
|
-
async getChildren(parentId: string): Promise<IKnowledgeNode[]> {
|
|
164
|
-
if (parentId === 'component-docs') {
|
|
165
|
-
const components = await fetchAllComponents();
|
|
166
|
-
return components.map(comp => ({
|
|
167
|
-
id: comp.namespace,
|
|
168
|
-
name: comp.abbreviation,
|
|
169
|
-
type: KnowledgeNodeType.FILE,
|
|
170
|
-
extname: '.md',
|
|
171
|
-
hidden: true, // 文件也隐藏
|
|
172
|
-
metadata: { providerId: 'component-docs', namespace: comp.namespace }
|
|
173
|
-
}));
|
|
174
|
-
}
|
|
175
|
-
return [];
|
|
176
|
-
},
|
|
177
|
-
|
|
178
|
-
async readFile(fileId: string): Promise<string> {
|
|
179
|
-
return await fetchComponentDoc(fileId);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
kb.registerProvider(componentDocsProvider);
|
|
184
|
-
|
|
185
|
-
// 4. 注册动态文档目录
|
|
186
|
-
kb.registerDynamicDirectory({
|
|
187
|
-
id: 'opened-pages',
|
|
188
|
-
name: '已打开的页面',
|
|
189
|
-
description: '用户打开的页面文档',
|
|
190
|
-
weight: 80
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
// 5. 标记要打开的文件
|
|
194
|
-
await kb.openFile('project-info/page1.dsl');
|
|
195
|
-
await kb.openFile('component-docs/pc.button.md'); // 可以打开隐藏文件
|
|
196
|
-
|
|
197
|
-
// 6. 添加动态文档
|
|
198
|
-
await kb.openDynamicDocument({
|
|
199
|
-
id: 'page1_u_123',
|
|
200
|
-
title: '首页',
|
|
201
|
-
content: '<页面内容>',
|
|
202
|
-
directoryId: 'opened-pages'
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
// 7. 导出(动态获取最新数据)
|
|
206
|
-
const message = await kb.export();
|
|
207
|
-
// 发送给大模型
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
## 🔌 扩展点
|
|
211
|
-
|
|
212
|
-
### 1. 创建简单的自定义 Provider
|
|
213
|
-
|
|
214
|
-
```typescript
|
|
215
|
-
import { DirectoryProvider, IKnowledgeNode, KnowledgeNodeType } from './knowledges';
|
|
216
|
-
|
|
217
|
-
// 创建一个聚焦信息 Provider(使用 new DirectoryProvider)
|
|
218
|
-
function createFocusInfoProvider(getFocusInfo: () => Promise<string>) {
|
|
219
|
-
return new DirectoryProvider({
|
|
220
|
-
id: 'focus-info',
|
|
221
|
-
name: '聚焦信息',
|
|
222
|
-
description: '当前聚焦的信息',
|
|
223
|
-
weight: 90,
|
|
224
|
-
|
|
225
|
-
// 将目录呈现为文件
|
|
226
|
-
customRootNode: {
|
|
227
|
-
id: 'focus-info',
|
|
228
|
-
name: '聚焦信息',
|
|
229
|
-
type: KnowledgeNodeType.FILE,
|
|
230
|
-
extname: '.md',
|
|
231
|
-
metadata: { providerId: 'focus-info' }
|
|
232
|
-
},
|
|
233
|
-
|
|
234
|
-
async getChildren(parentId: string): Promise<IKnowledgeNode[]> {
|
|
235
|
-
return []; // 文件没有子节点
|
|
236
|
-
},
|
|
237
|
-
|
|
238
|
-
async readFile(fileId: string): Promise<string> {
|
|
239
|
-
if (fileId === 'focus-info') {
|
|
240
|
-
return await getFocusInfo();
|
|
241
|
-
}
|
|
242
|
-
throw new Error(`File not found: ${fileId}`);
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// 使用
|
|
248
|
-
const focusProvider = createFocusInfoProvider(
|
|
249
|
-
async () => '当前聚焦的页面是:首页'
|
|
250
|
-
);
|
|
251
|
-
knowledgeBase.registerProvider(focusProvider);
|
|
252
|
-
|
|
253
|
-
// 可以直接打开
|
|
254
|
-
await knowledgeBase.openFile('聚焦信息.md');
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
### 2. 创建多层嵌套的 Provider
|
|
258
|
-
|
|
259
|
-
```typescript
|
|
260
|
-
const assetsProvider = new DirectoryProvider({
|
|
261
|
-
id: 'assets',
|
|
262
|
-
name: '资源文件',
|
|
263
|
-
description: '项目资源文件',
|
|
264
|
-
|
|
265
|
-
async getChildren(parentId: string): Promise<IKnowledgeNode[]> {
|
|
266
|
-
if (parentId === 'assets') {
|
|
267
|
-
// 第一层:返回子目录
|
|
268
|
-
return [
|
|
269
|
-
{
|
|
270
|
-
id: 'assets/image',
|
|
271
|
-
name: 'image',
|
|
272
|
-
type: KnowledgeNodeType.DIRECTORY,
|
|
273
|
-
metadata: { providerId: 'assets', type: 'image-dir' }
|
|
274
|
-
},
|
|
275
|
-
{
|
|
276
|
-
id: 'assets/style',
|
|
277
|
-
name: 'style',
|
|
278
|
-
type: KnowledgeNodeType.DIRECTORY,
|
|
279
|
-
metadata: { providerId: 'assets', type: 'style-dir' }
|
|
280
|
-
}
|
|
281
|
-
];
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
if (parentId === 'assets/image') {
|
|
285
|
-
// 第二层:返回图片文件
|
|
286
|
-
const images = await fetchAllImages();
|
|
287
|
-
return images.map(img => ({
|
|
288
|
-
id: `assets/image/${img.id}`,
|
|
289
|
-
name: img.name,
|
|
290
|
-
type: KnowledgeNodeType.FILE,
|
|
291
|
-
metadata: { providerId: 'assets', assetId: img.id }
|
|
292
|
-
}));
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
return [];
|
|
296
|
-
},
|
|
297
|
-
|
|
298
|
-
async readFile(fileId: string): Promise<string> {
|
|
299
|
-
// 读取文件内容...
|
|
300
|
-
const match = fileId.match(/^assets\/image\/(.+)$/);
|
|
301
|
-
if (match) {
|
|
302
|
-
return await fetchImageInfo(match[1]);
|
|
303
|
-
}
|
|
304
|
-
throw new Error(`File not found: ${fileId}`);
|
|
305
|
-
}
|
|
306
|
-
});
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
### 3. Provider 中实现缓存和错误处理
|
|
310
|
-
|
|
311
|
-
```typescript
|
|
312
|
-
// 使用闭包实现缓存
|
|
313
|
-
function createCachedDSLProvider() {
|
|
314
|
-
const cache = new Map<string, string>();
|
|
315
|
-
|
|
316
|
-
return new DirectoryProvider({
|
|
317
|
-
id: 'dsl',
|
|
318
|
-
name: 'DSL 页面定义',
|
|
319
|
-
description: 'DSL 页面定义(带缓存)',
|
|
320
|
-
|
|
321
|
-
async getChildren(parentId: string): Promise<IKnowledgeNode[]> {
|
|
322
|
-
if (parentId === 'dsl') {
|
|
323
|
-
const pages = await fetchAllPages();
|
|
324
|
-
return pages.map(p => ({
|
|
325
|
-
id: p.id,
|
|
326
|
-
name: p.name,
|
|
327
|
-
type: KnowledgeNodeType.FILE,
|
|
328
|
-
extname: '.dsl',
|
|
329
|
-
metadata: { providerId: 'dsl', pageId: p.id }
|
|
330
|
-
}));
|
|
331
|
-
}
|
|
332
|
-
return [];
|
|
333
|
-
},
|
|
334
|
-
|
|
335
|
-
async readFile(fileId: string): Promise<string> {
|
|
336
|
-
// 从缓存读取
|
|
337
|
-
if (cache.has(fileId)) {
|
|
338
|
-
console.log('Cache hit:', fileId);
|
|
339
|
-
return cache.get(fileId)!;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
try {
|
|
343
|
-
// 异步获取
|
|
344
|
-
const content = await fetchContent(fileId);
|
|
345
|
-
|
|
346
|
-
// 写入缓存
|
|
347
|
-
cache.set(fileId, content);
|
|
348
|
-
|
|
349
|
-
return content;
|
|
350
|
-
} catch (error) {
|
|
351
|
-
console.error('Error loading file:', error);
|
|
352
|
-
return '// Error loading file';
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// 如需清除缓存,可以导出清除函数
|
|
359
|
-
const { provider, clearCache } = (() => {
|
|
360
|
-
const cache = new Map<string, string>();
|
|
361
|
-
|
|
362
|
-
return {
|
|
363
|
-
provider: new DirectoryProvider({
|
|
364
|
-
id: 'dsl',
|
|
365
|
-
name: 'DSL 页面定义',
|
|
366
|
-
// ... 使用 cache
|
|
367
|
-
async readFile(fileId: string) {
|
|
368
|
-
if (cache.has(fileId)) return cache.get(fileId)!;
|
|
369
|
-
const content = await fetchContent(fileId);
|
|
370
|
-
cache.set(fileId, content);
|
|
371
|
-
return content;
|
|
372
|
-
}
|
|
373
|
-
} as any),
|
|
374
|
-
clearCache: () => cache.clear()
|
|
375
|
-
};
|
|
376
|
-
})();
|
|
377
|
-
```
|
|
378
|
-
|
|
379
|
-
## 🚀 快速开始
|
|
380
|
-
|
|
381
|
-
### 5分钟上手
|
|
382
|
-
|
|
383
|
-
```typescript
|
|
384
|
-
import { KnowledgeBase, DirectoryProvider, IKnowledgeNode, KnowledgeNodeType } from './knowledges';
|
|
385
|
-
|
|
386
|
-
// 1. 创建自定义 Provider
|
|
387
|
-
class DSLProvider extends DirectoryProvider {
|
|
388
|
-
readonly id = 'dsl';
|
|
389
|
-
readonly name = 'dsl';
|
|
390
|
-
readonly description = 'DSL 页面定义';
|
|
391
|
-
|
|
392
|
-
constructor(
|
|
393
|
-
private getPages: () => Promise<PageInfo[]>,
|
|
394
|
-
private getContent: (pageId: string) => Promise<string>
|
|
395
|
-
) {
|
|
396
|
-
super();
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
async getChildren(parentId: string): Promise<IKnowledgeNode[]> {
|
|
400
|
-
if (parentId === this.id) {
|
|
401
|
-
const pages = await this.getPages();
|
|
402
|
-
return pages.map(p => ({
|
|
403
|
-
id: `dsl-page-${p.id}`,
|
|
404
|
-
name: p.name,
|
|
405
|
-
type: KnowledgeNodeType.FILE,
|
|
406
|
-
extname: '.dsl',
|
|
407
|
-
metadata: { providerId: this.id, pageId: p.id }
|
|
408
|
-
}));
|
|
409
|
-
}
|
|
410
|
-
return [];
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
async readFile(fileId: string): Promise<string> {
|
|
414
|
-
const pageId = fileId.replace('dsl-page-', '');
|
|
415
|
-
return await this.getContent(pageId);
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// 2. 创建知识库
|
|
420
|
-
const kb = new KnowledgeBase({
|
|
421
|
-
name: 'My KB',
|
|
422
|
-
description: '我的知识库'
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
// 3. 注册 Provider
|
|
426
|
-
kb.registerProvider(new DSLProvider(
|
|
427
|
-
async () => await fetchAllPages(),
|
|
428
|
-
async (pageId) => await fetchPageContent(pageId)
|
|
429
|
-
));
|
|
430
|
-
|
|
431
|
-
// 4. 使用
|
|
432
|
-
await kb.openFile('dsl/page1.dsl');
|
|
433
|
-
console.log(await kb.export());
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
## 📖 文档导航
|
|
437
|
-
|
|
438
|
-
| 文档 | 适用场景 |
|
|
439
|
-
|------|---------|
|
|
440
|
-
| [README.md](./README.md) | 完整使用文档和API文档 |
|
|
441
|
-
| [SUMMARY.md](./SUMMARY.md) | 设计总结(本文件) |
|
|
442
|
-
|
|
443
|
-
## 🎯 应用场景
|
|
444
|
-
|
|
445
|
-
### 场景1:工作空间知识整合
|
|
446
|
-
将页面DSL、组件文档、聚焦信息等整合为一条消息发送给AI
|
|
447
|
-
|
|
448
|
-
### 场景2:多项目知识库
|
|
449
|
-
为不同项目创建不同的知识库,灵活切换
|
|
450
|
-
|
|
451
|
-
### 场景3:增量知识更新
|
|
452
|
-
按需打开/关闭文件,控制发送给AI的信息量
|
|
453
|
-
|
|
454
|
-
### 场景4:知识库版本管理
|
|
455
|
-
通过序列化/反序列化实现知识库的保存和恢复
|
|
456
|
-
|
|
457
|
-
## 🔧 最佳实践
|
|
458
|
-
|
|
459
|
-
### ✅ DO
|
|
460
|
-
|
|
461
|
-
- 使用 `new DirectoryProvider(config)` 创建 Provider
|
|
462
|
-
- 为 Provider 设置合理的权重(weight),控制显示顺序
|
|
463
|
-
- 在 `metadata` 中存储必要信息(如文件ID、类型等)
|
|
464
|
-
- 在 Provider 中实现缓存机制(可选)
|
|
465
|
-
- 完善的错误处理(try-catch)
|
|
466
|
-
- 合理使用异步操作
|
|
467
|
-
- 动态获取最新数据,不缓存结构
|
|
468
|
-
- 使用 `hidden` 属性隐藏不需要在目录树中显示的节点
|
|
469
|
-
- 使用 `customRootNode` 将目录呈现为文件
|
|
470
|
-
- 使用动态文档功能处理运行时生成的内容
|
|
471
|
-
|
|
472
|
-
### ❌ DON'T
|
|
473
|
-
|
|
474
|
-
- 在回调中使用大量 if-else(每个 Provider 处理自己的逻辑)
|
|
475
|
-
- 硬编码路径判断
|
|
476
|
-
- 忽略错误处理
|
|
477
|
-
- 缓存文件树结构(应该每次动态获取)
|
|
478
|
-
- 过度嵌套目录结构(影响性能)
|
|
479
|
-
- Provider 中返回完全静态的数据(失去动态优势)
|
|
480
|
-
|
|
481
|
-
## 📈 性能考虑
|
|
482
|
-
|
|
483
|
-
- ✅ **动态加载** - 只在 export 时获取需要的内容
|
|
484
|
-
- ✅ **批量操作** - `Promise.all` 同时打开多个文件
|
|
485
|
-
- ✅ **内容缓存** - 在回调中实现缓存逻辑(可选)
|
|
486
|
-
- ✅ **轻量级** - 不缓存文件树结构,内存占用小
|
|
487
|
-
|
|
488
|
-
## 🔮 未来扩展
|
|
489
|
-
|
|
490
|
-
### 可能的增强功能
|
|
491
|
-
|
|
492
|
-
1. **智能缓存** - 基于时间戳的智能缓存策略
|
|
493
|
-
2. **文件监听** - 自动检测文件变更
|
|
494
|
-
3. **权限控制** - 控制文件访问权限
|
|
495
|
-
4. **版本管理** - 跟踪文件版本变化
|
|
496
|
-
5. **全文搜索** - 在知识库中搜索内容
|
|
497
|
-
6. **可视化工具** - 图形化展示知识库结构
|
|
498
|
-
7. **批量操作** - 批量打开/关闭文件
|
|
499
|
-
|
|
500
|
-
## 📝 总结
|
|
501
|
-
|
|
502
|
-
### 核心价值
|
|
503
|
-
|
|
504
|
-
> **通过 `new DirectoryProvider(config)` 的设计,实现清晰的代码组织和完全动态的数据获取,支持动态文档、权重排序、隐藏节点等高级功能,确保每次导出的都是最新的文件树和内容。**
|
|
505
|
-
|
|
506
|
-
### 五大亮点
|
|
507
|
-
|
|
508
|
-
1. **🎯 完全动态** - 每次 export 动态获取最新数据
|
|
509
|
-
2. **🔧 代码清晰** - 使用 `new DirectoryProvider(config)` 创建 Provider,代码简洁
|
|
510
|
-
3. **⚡ 容错性强** - 自动标记已删除文件
|
|
511
|
-
4. **🎨 灵活多样** - 支持动态文档、权重排序、隐藏节点等高级功能
|
|
512
|
-
5. **🚀 易于扩展** - 通过配置创建 Provider,无需继承类
|
|
513
|
-
|
|
514
|
-
### 适用对象
|
|
515
|
-
|
|
516
|
-
- ✅ 需要向AI发送实时更新的结构化信息的应用
|
|
517
|
-
- ✅ 需要灵活组织知识的系统
|
|
518
|
-
- ✅ 需要高度可扩展的知识管理框架
|
|
519
|
-
- ✅ 需要处理动态变化的文件系统和运行时生成的内容
|
|
520
|
-
- ✅ 需要清晰代码组织的项目
|
|
521
|
-
|
|
522
|
-
---
|
|
523
|
-
|
|
524
|
-
**现在就开始使用 Knowledges 系统,让你的知识管理更加实时和优雅!** 🚀
|
|
525
|
-
|
|
526
|
-
查看 [README.md](./README.md) 了解完整的使用文档。
|
|
527
|
-
|