@synth-coder/memhub 0.2.1 → 0.2.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/.eslintrc.cjs +45 -45
- package/.factory/commands/opsx-apply.md +150 -0
- package/.factory/commands/opsx-archive.md +155 -0
- package/.factory/commands/opsx-explore.md +171 -0
- package/.factory/commands/opsx-propose.md +104 -0
- package/.factory/skills/openspec-apply-change/SKILL.md +156 -0
- package/.factory/skills/openspec-archive-change/SKILL.md +114 -0
- package/.factory/skills/openspec-explore/SKILL.md +288 -0
- package/.factory/skills/openspec-propose/SKILL.md +110 -0
- package/.github/workflows/ci.yml +74 -74
- package/.iflow/commands/opsx-apply.md +152 -152
- package/.iflow/commands/opsx-archive.md +157 -157
- package/.iflow/commands/opsx-explore.md +173 -173
- package/.iflow/commands/opsx-propose.md +106 -106
- package/.iflow/skills/openspec-apply-change/SKILL.md +156 -156
- package/.iflow/skills/openspec-archive-change/SKILL.md +114 -114
- package/.iflow/skills/openspec-explore/SKILL.md +288 -288
- package/.iflow/skills/openspec-propose/SKILL.md +110 -110
- package/.prettierrc +11 -11
- package/AGENTS.md +169 -26
- package/README.md +195 -195
- package/README.zh-CN.md +193 -193
- package/dist/src/contracts/mcp.js +34 -34
- package/dist/src/server/mcp-server.d.ts +8 -0
- package/dist/src/server/mcp-server.d.ts.map +1 -1
- package/dist/src/server/mcp-server.js +23 -2
- package/dist/src/server/mcp-server.js.map +1 -1
- package/dist/src/services/memory-service.d.ts +1 -0
- package/dist/src/services/memory-service.d.ts.map +1 -1
- package/dist/src/services/memory-service.js +125 -82
- package/dist/src/services/memory-service.js.map +1 -1
- package/docs/architecture-diagrams.md +368 -0
- package/docs/architecture.md +381 -349
- package/docs/contracts.md +190 -119
- package/docs/prompt-template.md +33 -79
- package/docs/proposals/mcp-typescript-sdk-refactor.md +568 -568
- package/docs/proposals/proposal-close-gates.md +58 -58
- package/docs/tool-calling-policy.md +101 -107
- package/docs/vector-search.md +306 -0
- package/package.json +59 -58
- package/src/contracts/index.ts +12 -12
- package/src/contracts/mcp.ts +222 -222
- package/src/contracts/schemas.ts +307 -307
- package/src/contracts/types.ts +410 -410
- package/src/index.ts +8 -8
- package/src/server/index.ts +5 -5
- package/src/server/mcp-server.ts +185 -161
- package/src/services/embedding-service.ts +114 -114
- package/src/services/index.ts +5 -5
- package/src/services/memory-service.ts +663 -621
- package/src/storage/frontmatter-parser.ts +243 -243
- package/src/storage/index.ts +6 -6
- package/src/storage/markdown-storage.ts +236 -236
- package/src/storage/vector-index.ts +160 -160
- package/src/utils/index.ts +5 -5
- package/src/utils/slugify.ts +63 -63
- package/test/contracts/schemas.test.ts +313 -313
- package/test/contracts/types.test.ts +21 -21
- package/test/frontmatter-parser-more.test.ts +94 -94
- package/test/server/mcp-server.test.ts +210 -169
- package/test/services/memory-service-edge.test.ts +248 -248
- package/test/services/memory-service.test.ts +278 -278
- package/test/storage/frontmatter-parser.test.ts +222 -222
- package/test/storage/markdown-storage.test.ts +216 -216
- package/test/storage/storage-edge.test.ts +238 -238
- package/test/storage/vector-index.test.ts +153 -153
- package/test/utils/slugify-edge.test.ts +94 -94
- package/test/utils/slugify.test.ts +68 -68
- package/tsconfig.json +25 -25
- package/tsconfig.test.json +8 -8
- package/vitest.config.ts +29 -29
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
# MemHub 架构图
|
|
2
|
+
|
|
3
|
+
## 1. 整体系统架构
|
|
4
|
+
|
|
5
|
+
```mermaid
|
|
6
|
+
graph TB
|
|
7
|
+
subgraph "Client Layer"
|
|
8
|
+
Client[MCP Client<br/>Claude Desktop / IDE]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
subgraph "Protocol Layer"
|
|
12
|
+
MCP[MCP Protocol<br/>stdio transport]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
subgraph "Application Layer"
|
|
16
|
+
Server[MCP Server<br/>mcp-server.ts]
|
|
17
|
+
Router[Tool Router<br/>memory_load / memory_update]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
subgraph "Service Layer"
|
|
21
|
+
MemoryService[Memory Service<br/>Business Logic]
|
|
22
|
+
EmbeddingService[Embedding Service<br/>ONNX Model]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
subgraph "Storage Layer"
|
|
26
|
+
MarkdownStorage[Markdown Storage<br/>File System]
|
|
27
|
+
VectorIndex[Vector Index<br/>LanceDB]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
subgraph "Data Layer"
|
|
31
|
+
Files[Markdown Files<br/>.md]
|
|
32
|
+
VectorDB[LanceDB<br/>.lancedb/]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
Client -->|stdio| MCP
|
|
36
|
+
MCP --> Server
|
|
37
|
+
Server --> Router
|
|
38
|
+
Router --> MemoryService
|
|
39
|
+
MemoryService --> MarkdownStorage
|
|
40
|
+
MemoryService --> EmbeddingService
|
|
41
|
+
MemoryService --> VectorIndex
|
|
42
|
+
EmbeddingService -.->|embeddings| VectorIndex
|
|
43
|
+
MarkdownStorage --> Files
|
|
44
|
+
VectorIndex --> VectorDB
|
|
45
|
+
|
|
46
|
+
style Client fill:#e1f5ff
|
|
47
|
+
style Server fill:#fff4e1
|
|
48
|
+
style MemoryService fill:#f0f0f0
|
|
49
|
+
style Files fill:#e8f5e9
|
|
50
|
+
style VectorDB fill:#e8f5e9
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 2. 核心组件架构
|
|
54
|
+
|
|
55
|
+
```mermaid
|
|
56
|
+
graph LR
|
|
57
|
+
subgraph "MCP Server"
|
|
58
|
+
A[Server Initialization]
|
|
59
|
+
B[Tool Registration]
|
|
60
|
+
C[Request Handler]
|
|
61
|
+
D[Response Formatter]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
subgraph "Memory Service"
|
|
65
|
+
E[CRUD Operations]
|
|
66
|
+
F[Search Logic]
|
|
67
|
+
G[Validation]
|
|
68
|
+
H[Error Handling]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
subgraph "Storage Components"
|
|
72
|
+
I[Markdown Storage]
|
|
73
|
+
J[FrontMatter Parser]
|
|
74
|
+
K[Vector Index]
|
|
75
|
+
L[Embedding Service]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
A --> B
|
|
79
|
+
B --> C
|
|
80
|
+
C --> E
|
|
81
|
+
E --> I
|
|
82
|
+
E --> L
|
|
83
|
+
E --> K
|
|
84
|
+
I --> J
|
|
85
|
+
F --> K
|
|
86
|
+
L -.->|384-dim vectors| K
|
|
87
|
+
C --> D
|
|
88
|
+
E --> G
|
|
89
|
+
E --> H
|
|
90
|
+
|
|
91
|
+
style A fill:#ffebee
|
|
92
|
+
style E fill:#e3f2fd
|
|
93
|
+
style I fill:#f1f8e9
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## 3. 数据流图
|
|
97
|
+
|
|
98
|
+
### 3.1 Memory Load 流程
|
|
99
|
+
|
|
100
|
+
```mermaid
|
|
101
|
+
sequenceDiagram
|
|
102
|
+
participant Client as MCP Client
|
|
103
|
+
participant Server as MCP Server
|
|
104
|
+
participant Service as Memory Service
|
|
105
|
+
participant Storage as Markdown Storage
|
|
106
|
+
participant Vector as Vector Index
|
|
107
|
+
participant Embed as Embedding Service
|
|
108
|
+
|
|
109
|
+
Client->>Server: memory_load(query, tags, category)
|
|
110
|
+
Server->>Service: memoryLoad(input)
|
|
111
|
+
|
|
112
|
+
alt Vector Search Enabled
|
|
113
|
+
Service->>Embed: embed(query)
|
|
114
|
+
Embed-->>Service: 384-dim vector
|
|
115
|
+
Service->>Vector: search(vector, limit)
|
|
116
|
+
Vector-->>Service: ranked IDs
|
|
117
|
+
Service->>Storage: read(ids)
|
|
118
|
+
Storage-->>Service: Memory objects
|
|
119
|
+
else Tag/Category Filter
|
|
120
|
+
Service->>Storage: list(filters)
|
|
121
|
+
Storage-->>Service: filtered memories
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
Service-->>Server: MemoryLoadOutput
|
|
125
|
+
Server-->>Client: JSON Response
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 3.2 Memory Update 流程
|
|
129
|
+
|
|
130
|
+
```mermaid
|
|
131
|
+
sequenceDiagram
|
|
132
|
+
participant Client as MCP Client
|
|
133
|
+
participant Server as MCP Server
|
|
134
|
+
participant Service as Memory Service
|
|
135
|
+
participant Storage as Markdown Storage
|
|
136
|
+
participant Vector as Vector Index
|
|
137
|
+
participant Embed as Embedding Service
|
|
138
|
+
|
|
139
|
+
Client->>Server: memory_update(content, title, tags)
|
|
140
|
+
Server->>Service: memoryUpdate(input)
|
|
141
|
+
Service->>Service: Generate UUID & timestamp
|
|
142
|
+
Service->>Storage: write(memory)
|
|
143
|
+
Storage-->>Service: file path
|
|
144
|
+
|
|
145
|
+
alt Vector Search Enabled
|
|
146
|
+
Service->>Embed: embedMemory(title, content)
|
|
147
|
+
Embed-->>Service: 384-dim vector
|
|
148
|
+
Service->>Vector: upsert(memory, vector)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
Service-->>Server: MemoryUpdateOutput
|
|
152
|
+
Server-->>Client: JSON Response
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## 4. 存储架构
|
|
156
|
+
|
|
157
|
+
```mermaid
|
|
158
|
+
graph TB
|
|
159
|
+
subgraph "File System Structure"
|
|
160
|
+
Root[memories/]
|
|
161
|
+
DateDir[YYYY-MM-DD/]
|
|
162
|
+
SessionDir[session_uuid/]
|
|
163
|
+
File[title-slug.md]
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
subgraph "Markdown File Format"
|
|
167
|
+
YAML[YAML Front Matter<br/>---<br/>id: uuid<br/>tags: array<br/>category: string<br/>importance: 1-5<br/>---]
|
|
168
|
+
Content[Markdown Content<br/># Title<br/><br/>Body text...]
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
subgraph "Vector Database"
|
|
172
|
+
LanceDB[LanceDB<br/>.lancedb/]
|
|
173
|
+
Table[memories table]
|
|
174
|
+
VectorCol[vector: float32[384]]
|
|
175
|
+
MetaCol[metadata columns<br/>id, title, category, tags]
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
Root --> DateDir
|
|
179
|
+
DateDir --> SessionDir
|
|
180
|
+
SessionDir --> File
|
|
181
|
+
File --> YAML
|
|
182
|
+
File --> Content
|
|
183
|
+
|
|
184
|
+
LanceDB --> Table
|
|
185
|
+
Table --> VectorCol
|
|
186
|
+
Table --> MetaCol
|
|
187
|
+
|
|
188
|
+
style Root fill:#fff9c4
|
|
189
|
+
style LanceDB fill:#e1bee7
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## 5. 技术栈架构
|
|
193
|
+
|
|
194
|
+
```mermaid
|
|
195
|
+
mindmap
|
|
196
|
+
root((MemHub))
|
|
197
|
+
Runtime
|
|
198
|
+
Node.js 18+
|
|
199
|
+
TypeScript 5.9+
|
|
200
|
+
Protocol
|
|
201
|
+
MCP SDK
|
|
202
|
+
stdio transport
|
|
203
|
+
JSON-RPC
|
|
204
|
+
Storage
|
|
205
|
+
Markdown
|
|
206
|
+
YAML Front Matter
|
|
207
|
+
Git-friendly
|
|
208
|
+
Vector DB
|
|
209
|
+
LanceDB
|
|
210
|
+
384-dim vectors
|
|
211
|
+
ML/AI
|
|
212
|
+
Embedding
|
|
213
|
+
ONNX Runtime
|
|
214
|
+
MiniLM-L6-v2
|
|
215
|
+
Validation
|
|
216
|
+
Zod schemas
|
|
217
|
+
TypeScript types
|
|
218
|
+
Testing
|
|
219
|
+
Vitest
|
|
220
|
+
80%+ coverage
|
|
221
|
+
Quality
|
|
222
|
+
ESLint
|
|
223
|
+
Prettier
|
|
224
|
+
TypeScript strict
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## 6. 部署架构
|
|
228
|
+
|
|
229
|
+
```mermaid
|
|
230
|
+
graph TB
|
|
231
|
+
subgraph "Development"
|
|
232
|
+
DevCode[Source Code<br/>TypeScript]
|
|
233
|
+
DevTest[Unit Tests<br/>Vitest]
|
|
234
|
+
DevBuild[Build<br/>tsc]
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
subgraph "Distribution"
|
|
238
|
+
NPM[npm package<br/>@synth-coder/memhub]
|
|
239
|
+
Dist[dist/<br/>JavaScript + .d.ts]
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
subgraph "Runtime"
|
|
243
|
+
MCPClient[MCP Client<br/>Claude/IDE]
|
|
244
|
+
NPX[npx execution]
|
|
245
|
+
NodeEnv[Node.js Environment<br/>MEMHUB_STORAGE_PATH]
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
subgraph "Data Storage"
|
|
249
|
+
MemDir[memories/<br/>Markdown Files]
|
|
250
|
+
VectorDir[.lancedb/<br/>Vector Index]
|
|
251
|
+
HFModel[~/.cache/huggingface/<br/>ONNX Model Cache]
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
DevCode --> DevTest
|
|
255
|
+
DevTest --> DevBuild
|
|
256
|
+
DevBuild --> NPM
|
|
257
|
+
NPM --> NPX
|
|
258
|
+
NPX --> NodeEnv
|
|
259
|
+
MCPClient --> NPX
|
|
260
|
+
NodeEnv --> MemDir
|
|
261
|
+
NodeEnv --> VectorDir
|
|
262
|
+
NodeEnv --> HFModel
|
|
263
|
+
|
|
264
|
+
style DevCode fill:#e3f2fd
|
|
265
|
+
style NPM fill:#fff3e0
|
|
266
|
+
style MCPClient fill:#f3e5f5
|
|
267
|
+
style MemDir fill:#e8f5e9
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## 7. 错误处理架构
|
|
271
|
+
|
|
272
|
+
```mermaid
|
|
273
|
+
graph TD
|
|
274
|
+
A[Client Request] --> B{Parameter Validation}
|
|
275
|
+
B -->|Invalid| C[ZodError]
|
|
276
|
+
B -->|Valid| D{Service Operation}
|
|
277
|
+
|
|
278
|
+
D --> E{Storage Operation}
|
|
279
|
+
E -->|File Error| F[StorageError]
|
|
280
|
+
E -->|Success| G[Memory Object]
|
|
281
|
+
|
|
282
|
+
D --> H{Vector Operation}
|
|
283
|
+
H -->|Index Error| I[ServiceError]
|
|
284
|
+
H -->|Success| J[Vector Result]
|
|
285
|
+
|
|
286
|
+
G --> K{Embedding}
|
|
287
|
+
J --> K
|
|
288
|
+
K -->|Model Error| L[ServiceError]
|
|
289
|
+
K -->|Success| M[Success Response]
|
|
290
|
+
|
|
291
|
+
C --> N[Error Response]
|
|
292
|
+
F --> N
|
|
293
|
+
I --> N
|
|
294
|
+
L --> N
|
|
295
|
+
M --> O[Success Response]
|
|
296
|
+
|
|
297
|
+
N --> P[Client]
|
|
298
|
+
O --> P
|
|
299
|
+
|
|
300
|
+
style C fill:#ffcdd2
|
|
301
|
+
style F fill:#ffcdd2
|
|
302
|
+
style I fill:#ffcdd2
|
|
303
|
+
style L fill:#ffcdd2
|
|
304
|
+
style M fill:#c8e6c9
|
|
305
|
+
style O fill:#c8e6c9
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## 8. 性能优化架构
|
|
309
|
+
|
|
310
|
+
```mermaid
|
|
311
|
+
graph LR
|
|
312
|
+
subgraph "Lazy Loading"
|
|
313
|
+
A1[Service Initialization]
|
|
314
|
+
A2[Embedding Model]
|
|
315
|
+
A3[Vector Index]
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
subgraph "Caching"
|
|
319
|
+
B1[Model Cache<br/>~/.cache/huggingface]
|
|
320
|
+
B2[Vector Cache<br/>LanceDB]
|
|
321
|
+
B3[File Handle Pool]
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
subgraph "Async Operations"
|
|
325
|
+
C1[Non-blocking I/O]
|
|
326
|
+
C2[Background Index Update]
|
|
327
|
+
C3[Parallel Processing]
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
A1 --> A2
|
|
331
|
+
A2 --> A3
|
|
332
|
+
A2 --> B1
|
|
333
|
+
A3 --> B2
|
|
334
|
+
C1 --> C2
|
|
335
|
+
C2 --> C3
|
|
336
|
+
|
|
337
|
+
style A1 fill:#e1f5fe
|
|
338
|
+
style B1 fill:#fff9c4
|
|
339
|
+
style C1 fill:#f3e5f5
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## 关键设计特性
|
|
343
|
+
|
|
344
|
+
### 1. **分层架构**
|
|
345
|
+
- **协议层**: MCP 协议处理
|
|
346
|
+
- **应用层**: 服务器和路由逻辑
|
|
347
|
+
- **服务层**: 核心业务逻辑
|
|
348
|
+
- **存储层**: 数据持久化
|
|
349
|
+
|
|
350
|
+
### 2. **可扩展性**
|
|
351
|
+
- 模块化设计,易于添加新的存储后端
|
|
352
|
+
- 支持插件式的 embedding 服务
|
|
353
|
+
- 可配置的向量搜索开关
|
|
354
|
+
|
|
355
|
+
### 3. **容错性**
|
|
356
|
+
- 优雅的错误处理和降级
|
|
357
|
+
- 向量搜索失败不影响基本功能
|
|
358
|
+
- Markdown 作为唯一数据源
|
|
359
|
+
|
|
360
|
+
### 4. **开发体验**
|
|
361
|
+
- 完整的 TypeScript 类型支持
|
|
362
|
+
- Zod schema 验证
|
|
363
|
+
- 详尽的测试覆盖
|
|
364
|
+
|
|
365
|
+
### 5. **运维友好**
|
|
366
|
+
- 纯文本存储,易于备份和迁移
|
|
367
|
+
- Git 原生支持版本控制
|
|
368
|
+
- 无外部依赖数据库
|