kimi-code-memory-mcp-server 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -1
- package/README.en.md +349 -0
- package/README.md +223 -137
- package/assets/contextFlow.svg +144 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/context/wire-context.d.ts +3 -0
- package/dist/context/wire-context.js +20 -50
- package/dist/context/wire-context.js.map +1 -1
- package/dist/dao/constants.d.ts +33 -0
- package/dist/dao/constants.js +17 -0
- package/dist/dao/constants.js.map +1 -0
- package/dist/dao/index-catalog.d.ts +19 -0
- package/dist/dao/index-catalog.js +94 -0
- package/dist/dao/index-catalog.js.map +1 -0
- package/dist/dao/index-reconciler.d.ts +13 -0
- package/dist/dao/index-reconciler.js +162 -0
- package/dist/dao/index-reconciler.js.map +1 -0
- package/dist/dao/index-store.d.ts +31 -0
- package/dist/dao/index-store.js +128 -0
- package/dist/dao/index-store.js.map +1 -0
- package/dist/dao/index.d.ts +12 -31
- package/dist/dao/index.js +50 -404
- package/dist/dao/index.js.map +1 -1
- package/dist/dao/memory-store.js +2 -10
- package/dist/dao/memory-store.js.map +1 -1
- package/dist/dao/memory-tree-renderer.d.ts +22 -0
- package/dist/dao/memory-tree-renderer.js +75 -0
- package/dist/dao/memory-tree-renderer.js.map +1 -0
- package/dist/prompts/index.d.ts +26 -0
- package/dist/prompts/index.js +103 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/refine/adapter.d.ts +6 -0
- package/dist/refine/adapter.js +28 -0
- package/dist/refine/adapter.js.map +1 -0
- package/dist/refine/constants.d.ts +35 -0
- package/dist/refine/constants.js +107 -0
- package/dist/refine/constants.js.map +1 -0
- package/dist/refine/extractor.d.ts +12 -0
- package/dist/refine/extractor.js +122 -0
- package/dist/refine/extractor.js.map +1 -0
- package/dist/refine/store.d.ts +23 -0
- package/dist/refine/store.js +153 -0
- package/dist/refine/store.js.map +1 -0
- package/dist/refine/types.d.ts +56 -0
- package/dist/refine/types.js +5 -0
- package/dist/refine/types.js.map +1 -0
- package/dist/refined-manager.d.ts +14 -56
- package/dist/refined-manager.js +27 -341
- package/dist/refined-manager.js.map +1 -1
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.js +134 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.js +46 -2
- package/dist/server.js.map +1 -1
- package/dist/theme-manager.d.ts +1 -0
- package/dist/theme-manager.js +7 -0
- package/dist/theme-manager.js.map +1 -1
- package/dist/tools/context-tools.d.ts +16 -51
- package/dist/tools/context-tools.js +303 -55
- package/dist/tools/context-tools.js.map +1 -1
- package/dist/tools/index.d.ts +5 -827
- package/dist/tools/index.js +23 -354
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +4 -60
- package/dist/tools/memory-tools.js +129 -79
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/system-tools.d.ts +3 -34
- package/dist/tools/system-tools.js +110 -33
- package/dist/tools/system-tools.js.map +1 -1
- package/dist/tools/theme-tools.d.ts +3 -31
- package/dist/tools/theme-tools.js +101 -22
- package/dist/tools/theme-tools.js.map +1 -1
- package/dist/tools/types.d.ts +21 -0
- package/dist/tools/types.js +13 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types.d.ts +11 -2
- package/dist/utils/action-entities.d.ts +16 -0
- package/dist/utils/action-entities.js +35 -0
- package/dist/utils/action-entities.js.map +1 -0
- package/dist/utils/date.d.ts +11 -0
- package/dist/utils/date.js +13 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/file-helpers.d.ts +10 -0
- package/dist/utils/file-helpers.js +28 -0
- package/dist/utils/file-helpers.js.map +1 -0
- package/dist/utils/headings.d.ts +5 -0
- package/dist/utils/headings.js +21 -0
- package/dist/utils/headings.js.map +1 -0
- package/dist/utils/search.d.ts +17 -0
- package/dist/utils/search.js +60 -0
- package/dist/utils/search.js.map +1 -0
- package/dist/utils/tools.d.ts +5 -0
- package/dist/utils/tools.js +10 -0
- package/dist/utils/tools.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/vis/api.d.ts +117 -0
- package/dist/vis/api.js +426 -0
- package/dist/vis/api.js.map +1 -0
- package/dist/vis/auto-start.d.ts +12 -0
- package/dist/vis/auto-start.js +87 -0
- package/dist/vis/auto-start.js.map +1 -0
- package/dist/vis/server.d.ts +14 -0
- package/dist/vis/server.js +337 -0
- package/dist/vis/server.js.map +1 -0
- package/dist/vis/static/api.js +57 -0
- package/dist/vis/static/app.js +1468 -0
- package/dist/vis/static/index.html +25 -0
- package/dist/vis/static/state.js +26 -0
- package/dist/vis/static/style.css +1553 -0
- package/dist/vis/static/utils/helpers.js +94 -0
- package/dist/vis/static/utils/markdown.js +81 -0
- package/dist/vis-cli.d.ts +7 -0
- package/dist/vis-cli.js +140 -0
- package/dist/vis-cli.js.map +1 -0
- package/docs/0.agent-memory-market-research.md +354 -0
- package/docs/1.memory-system-proposal-for-kimi-code.md +688 -0
- package/docs/2.memory-architecture-overview.md +417 -0
- package/docs/3.memory-skill-prompt-design.md +430 -0
- package/docs/4.kimi-code-native-evolution-roadmap.md +559 -0
- package/docs/5.decision-guard-design-notes.md +500 -0
- package/docs/ARCHITECTURE.md +2 -2
- package/docs/design-story.md +350 -0
- package/docs/three-layer-memory-model.md +153 -0
- package/docs/three-layer-memory-model.zh-CN.md +153 -0
- package/package.json +12 -6
- package/README.zh-CN.md +0 -292
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# Kimi Code Memory MCP Server 设计笔记
|
|
2
|
+
|
|
3
|
+
> 一份写给工程师看的设计记录:在没有向量数据库、图数据库和云 API 的前提下,如何让 Agent 记得住、找得回、想得起来龙去脉。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 一、从一个老问题开始
|
|
8
|
+
|
|
9
|
+
每个用过 AI 编程助手的人都经历过这一幕:
|
|
10
|
+
|
|
11
|
+
> 你花了一个下午和 Agent 讨论完项目的架构、踩过的坑、临时决定放弃的接口。第二天新开一个会话,Agent 客气地问:“请问这是什么项目?”
|
|
12
|
+
|
|
13
|
+
你愣住了。昨天那些上下文明明还在终端的滚动日志里,却像没发生过一样。
|
|
14
|
+
|
|
15
|
+
这就是我们要解决的最朴素的问题:**让 Agent 拥有真正属于这个项目的长期记忆**。
|
|
16
|
+
|
|
17
|
+
但怎么做到?
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 二、两条诱人的歧途
|
|
22
|
+
|
|
23
|
+
在动手之前,我们先看看市面上的主流方向。
|
|
24
|
+
|
|
25
|
+
### 歧途一:把记忆做成“第二互联网”
|
|
26
|
+
|
|
27
|
+
向量数据库 + 大规模 RAG 的思路很性感:
|
|
28
|
+
|
|
29
|
+
> 把所有历史对话都存下来,用的时候靠语义相似度捞一捞。
|
|
30
|
+
|
|
31
|
+
听起来很强大,但用在 coding agent 上会有三个致命问题:
|
|
32
|
+
|
|
33
|
+
1. **记忆失去了筛选机制**。互联网已经是全人类的外脑,如果 Agent 的本地记忆也是无差别囤积的数据,那它和 Google 的区别只在于数据来源。
|
|
34
|
+
2. **检索质量不可控**。语义相似不等于主题相关。两个都提到“路由”的代码片段,一个是前端页面跳转,一个是后端消息路由,向量距离可能很近,但 engineering 意义完全不同。
|
|
35
|
+
3. **可解释性差**。模型为什么召回这条记忆?用户很难理解和修正。
|
|
36
|
+
|
|
37
|
+
如果 Agent 的记忆只是一个小号的、私人的互联网,那它就不值得单独做一个系统。
|
|
38
|
+
|
|
39
|
+
### 歧途二:把记忆做成“第二数据库”
|
|
40
|
+
|
|
41
|
+
图数据库、时序知识图、复杂的关系 schema……这些方案在语义建模上很优雅,但对 coding agent 来说:
|
|
42
|
+
|
|
43
|
+
- 运维成本高:需要额外服务、索引、迁移、备份;
|
|
44
|
+
- 写放大严重:每条对话都要经过实体抽取、关系链接、冲突消解;
|
|
45
|
+
- 与人类工作流割裂:开发者不会为了“让 Agent 记住”而先去维护一个知识图谱。
|
|
46
|
+
|
|
47
|
+
**记忆系统应该服务于人的工作流,而不是反过来要求人为记忆系统建模。**
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 三、我们的答案:一本“会思考的笔记本”
|
|
52
|
+
|
|
53
|
+
我们决定回到工程师最熟悉的东西:**文件**。
|
|
54
|
+
|
|
55
|
+
不是数据库,不是向量索引,而是普通的 Markdown 文件。因为:
|
|
56
|
+
|
|
57
|
+
- 工程师每天都会读、写、搜索 Markdown;
|
|
58
|
+
- Markdown 天然适合 git diff,适合代码审查,适合在 IDE 里直接编辑;
|
|
59
|
+
- 任何能读文本的 LLM 都能理解它;
|
|
60
|
+
- 它足够轻量,不需要安装任何外部服务。
|
|
61
|
+
|
|
62
|
+
但光有文件不够。我们还需要一套**分层**的存储和召回机制,让不同类型的信息各得其所。
|
|
63
|
+
|
|
64
|
+
于是我们提出了 **三层记忆模型**。
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 四、三层记忆模型:像人一样分层思考
|
|
69
|
+
|
|
70
|
+
### 第一层:持续认知层 —— 你的“工作宪法”
|
|
71
|
+
|
|
72
|
+
想象一下,你每天早上醒来,不需要重新学习“我是谁、我会说什么语言、我有什么原则”。这些是你的底层认知,一直在线。
|
|
73
|
+
|
|
74
|
+
Agent 也需要这样的东西。我们把它放在:
|
|
75
|
+
|
|
76
|
+
- `essence/essence.md` —— 每个工作区一份,不超过 15 KB 的精要;
|
|
77
|
+
- `AGENTS.md` —— 跨所有会话注入的行为规则和协议。
|
|
78
|
+
|
|
79
|
+
这里存的不是具体知识,而是**人格、规则、偏好、红线**。比如:
|
|
80
|
+
|
|
81
|
+
- “始终用中文回复用户”
|
|
82
|
+
- “涉及 IPC 信号变更时,同时维护文档”
|
|
83
|
+
- “禁止执行任何 git 突变,除非用户明确授权”
|
|
84
|
+
|
|
85
|
+
这些规则在每个 session 开始时就通过 `bootstrap_workspace` 注入,Agent 不需要临时去“回忆”,因为它从未忘记。
|
|
86
|
+
|
|
87
|
+
### 第二层:持久化知识库 —— 你的“项目笔记”
|
|
88
|
+
|
|
89
|
+
这是真正需要被长期保存的项目资产,按类型分门别类放在 `memory/` 下:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
memory/
|
|
93
|
+
├── decisions/ # 架构和产品决策
|
|
94
|
+
├── knowledge/ # 项目特定知识
|
|
95
|
+
├── rules/ # 协作规范和红线
|
|
96
|
+
└── reference/ # 外部参考和术语
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
每条记忆都是一个 `.md` 文件,带 YAML frontmatter,记录标题、标签、创建时间、更新时间。比如:
|
|
100
|
+
|
|
101
|
+
```markdown
|
|
102
|
+
---
|
|
103
|
+
title: 选择 SQLite 作为缓存层
|
|
104
|
+
tags: [decision, database, sqlite]
|
|
105
|
+
createdAt: 2026-06-24T12:00:00.000Z
|
|
106
|
+
updatedAt: 2026-06-24T12:00:00.000Z
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
我们选择 SQLite 而不是 Redis,因为:
|
|
110
|
+
- 项目追求本地离线可用;
|
|
111
|
+
- 缓存数据量小,SQLite 完全够用;
|
|
112
|
+
- 避免引入额外服务。
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
这些文件是**真相源**。`index.json` 只是它们的缓存和索引,损坏后可以通过 `sync_workspace_index` 一键重建。
|
|
116
|
+
|
|
117
|
+
### 第三层:上下文保持与回忆 —— 你的“近期工作记忆”
|
|
118
|
+
|
|
119
|
+
长期记忆解决了“知道什么”,但还缺一个能力:**想起刚刚发生了什么**。
|
|
120
|
+
|
|
121
|
+
Kimi Code CLI 本身会把每次对话以事件流的形式写入 `wire.jsonl`。我们直接读取它,而不是让 Agent 自己手动“保存上下文”。因为:
|
|
122
|
+
|
|
123
|
+
> 既然完整上下文已经被持久化在 `~/.kimi-code/sessions/.../wire.jsonl` 里,为什么还要让 Agent 再写一份?
|
|
124
|
+
|
|
125
|
+
但 `wire.jsonl` 是原始事件流,直接解析很贵。于是我们引入了 **refined turns**:
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
wire.jsonl ──► refined/refined.sqlite ──► search_context / trace_theme
|
|
129
|
+
原始事件流 结构化摘要(SQLite 本地索引) 快速搜索与主题追溯
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`refined.sqlite` 不是用户资产,而是**派生索引**。它让历史对话可以被关键词快速搜索,同时保留原始 wire 作为真相源。
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 五、主题追溯:在时间轴上重新打捞相关思考
|
|
137
|
+
|
|
138
|
+
大多数上下文窗口只按**时间纵向**查看: turn 1、turn 2、turn 3……当前窗口满了,旧的 turn 就被压缩、打包、存档,细节随之流逝。
|
|
139
|
+
|
|
140
|
+
但人类的思考往往是**横向**的:
|
|
141
|
+
|
|
142
|
+
> “上周我们讨论过登录模块的 JWT 方案,前天又聊到 OAuth 流程,今天用户问登录怎么做,我应该把这三段连起来。”
|
|
143
|
+
|
|
144
|
+
这就是 **Theme Tracing(主题追溯)**——它不是简单的“按主题筛选”,而是在**时间轴的废墟**里把同一个主题的碎片重新串成一条线。
|
|
145
|
+
|
|
146
|
+
### 时间轴上的真实形状
|
|
147
|
+
|
|
148
|
+
想象一条水平向右延伸的时间轴。上面的每一个小圆柱都是一次对话轮(turn):
|
|
149
|
+
|
|
150
|
+

|
|
151
|
+
|
|
152
|
+
图中元素:
|
|
153
|
+
|
|
154
|
+
- **竖条(turn)**:每次对话轮,高度代表计算深度——思考、工具调用越多,条越高。
|
|
155
|
+
- **粗横线(cluster)**:紧密相邻、围绕同一决策的若干 turn 被聚成一个簇,簇通常对应一次具体决策或结论。
|
|
156
|
+
- **灰框(session)**:横向包裹一段时间内的 turns 与 clusters;上下文窗口满了会被整体压缩打包。
|
|
157
|
+
- **彩色括号(theme)**:跨越多个 session,把属于同一主题的 turns / clusters 横向串联起来,形成一条跨时间的认知线。
|
|
158
|
+
|
|
159
|
+
关键隐喻:**session 会下沉**。旧 session 被压缩、打包、存档后,原始细节逐渐不可见,只剩下 `refined.sqlite` 里的结构化摘要;而主题线被单独保存下来,即使原始 session 已经下沉,主题仍然鲜活可用。
|
|
160
|
+
|
|
161
|
+
### trace_theme 做了什么?
|
|
162
|
+
|
|
163
|
+
当用户问“登录模块是怎么演进的?”时,主题追溯会沿时间轴反向扫描:
|
|
164
|
+
|
|
165
|
+
1. 在 `refined.sqlite` 里搜索与“登录模块”相关的 turn 和簇;
|
|
166
|
+
2. 把散落在多个 session 中的相关片段重新捞出来;
|
|
167
|
+
3. 用 `themes/<theme>.json` 把它们按时间顺序串联成一条主题线。
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
trace_theme(theme=login-module):
|
|
171
|
+
╭─────────────────────────────────────────────────────────────────────╮
|
|
172
|
+
│ 沿时间线回溯,把属于“登录模块”的 turns / clusters 重新串联: │
|
|
173
|
+
│ │
|
|
174
|
+
│ [Session A: 登录决策簇] ──→ [Session B: 认证方案簇] ──→ │
|
|
175
|
+
│ [Session C: OAuth流程] │
|
|
176
|
+
│ │
|
|
177
|
+
│ 保存为 themes/login-module.json(只存引用,不复制内容) │
|
|
178
|
+
╰─────────────────────────────────────────────────────────────────────╯
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
主题文件只存引用,不存内容。这意味着:
|
|
182
|
+
|
|
183
|
+
- 一个 turn 可以同时属于多个主题;
|
|
184
|
+
- 主题之间没有冗余复制;
|
|
185
|
+
- 即使原始 session 已经被压缩存档,主题线仍然鲜活可用;
|
|
186
|
+
- Agent 的思考从“最近说了什么”变成“这个主题是怎么发展过来的”。
|
|
187
|
+
|
|
188
|
+
### 为什么是“横向提炼”?
|
|
189
|
+
|
|
190
|
+
纵向看,信息会随时间衰减:窗口满了,旧的就被压成摘要。
|
|
191
|
+
|
|
192
|
+
横向看,主题追溯把不同时间、不同 session 中围绕同一主题的碎片重新组织起来,形成一条**跨时间的认知线**。它不是在保存所有信息,而是在保存“哪些信息属于同一个思想”。
|
|
193
|
+
|
|
194
|
+
这让 Agent 的记忆变得更加聚焦:不是记住一切,而是记住**思考的脉络**。
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 六、精炼:让机器替你先读一遍历史
|
|
199
|
+
|
|
200
|
+
`search_context` 是这个系统里最有趣的工具之一。它做了几件事:
|
|
201
|
+
|
|
202
|
+
1. **关键词搜索**:先在 `refined.sqlite` 里用 SQL `LIKE` 快速命中;
|
|
203
|
+
2. **簇扩展**:命中一个 turn 后,向前后扩展 90 秒内的相邻 turn,把一段连续讨论聚成一个“簇”;
|
|
204
|
+
3. **自动提炼**:对簇中还没提炼的 turn,调用 `refinedManager.refineTurn()` 生成结构化摘要;
|
|
205
|
+
4. **保存搜索视图**:把这次搜索的簇结构存到 `searches/search-<hash>.json`,供后续 `tag_theme` 使用。
|
|
206
|
+
|
|
207
|
+
> **重要:当前的会话提炼不调用 LLM,因此没有 token 开销。**
|
|
208
|
+
>
|
|
209
|
+
> 提炼规则是纯本地、确定性的。它基于正则和启发式规则从 `wire.jsonl` 中提取结构化信息,而不是把历史对话再送给大模型总结一次。
|
|
210
|
+
|
|
211
|
+
它识别:
|
|
212
|
+
|
|
213
|
+
- Markdown 标题(如 `## 已完成`、`## 下一步`、`## 阻塞项`);
|
|
214
|
+
- 列表项和编号列表;
|
|
215
|
+
- 中英文动作关键词(`已完成`、`Fixed`、`Next step`、`阻塞` 等);
|
|
216
|
+
- 工具调用、文件路径、错误信息。
|
|
217
|
+
|
|
218
|
+
这让历史对话从“一堆文本”变成“可搜索、可分类、可挂载到主题”的素材,同时保持低成本和可复现性。
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 七、数据流:一图胜千言
|
|
223
|
+
|
|
224
|
+
```text
|
|
225
|
+
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
|
226
|
+
│ Kimi Code CLI │────▶│ wire.jsonl │────▶│ wire-context.ts │
|
|
227
|
+
│ (conversation) │ │ (event stream) │ │ (parser) │
|
|
228
|
+
└─────────────────┘ └──────────────────┘ └────────┬────────┘
|
|
229
|
+
│
|
|
230
|
+
▼
|
|
231
|
+
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
|
232
|
+
│ Agent tools │◀────│ MCP server │◀────│ context-tools │
|
|
233
|
+
│ remember/ │ │ src/server.ts │ │ │
|
|
234
|
+
│ search/ │ │ │ │ │
|
|
235
|
+
│ trace_theme/ │ │ │ │ │
|
|
236
|
+
└─────────────────┘ └────────┬─────────┘ └─────────────────┘
|
|
237
|
+
│
|
|
238
|
+
┌─────────────────────┼─────────────────────┐
|
|
239
|
+
│ │ │
|
|
240
|
+
▼ ▼ ▼
|
|
241
|
+
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
|
|
242
|
+
│ memory-tools │ │ theme-tools │ │ system-tools │
|
|
243
|
+
│ CRUD memory │ │ tag/trace/ │ │ organize/ │
|
|
244
|
+
│ files │ │ refine │ │ sync/bootstrap│
|
|
245
|
+
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
|
|
246
|
+
│ │ │
|
|
247
|
+
▼ ▼ ▼
|
|
248
|
+
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
|
|
249
|
+
│ memory-store │ │ theme-manager │ │ refined- │
|
|
250
|
+
│ (.md I/O) │ │ (themes/*.json)│ │ manager │
|
|
251
|
+
└───────┬───────┘ └───────────────┘ │ (refined/ │
|
|
252
|
+
│ │ refined.sqlite)│
|
|
253
|
+
▼ └───────────────┘
|
|
254
|
+
┌───────────────┐
|
|
255
|
+
│ IndexDao │
|
|
256
|
+
│ (index.json) │
|
|
257
|
+
└───────────────┘
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
所有工具共享同一个 `Ctx`,里面持有:
|
|
261
|
+
|
|
262
|
+
- `IndexDao`:管理 `index.json` 缓存;
|
|
263
|
+
- `MemoryStore`:读写 Markdown 文件;
|
|
264
|
+
- `ThemeManager`:管理主题关联;
|
|
265
|
+
- `RefinedManager`:管理 SQLite 中的提炼摘要。
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## 八、为什么轻量反而更强
|
|
270
|
+
|
|
271
|
+
我们刻意不做几件事:
|
|
272
|
+
|
|
273
|
+
| 我们没做 | 为什么不做 |
|
|
274
|
+
|---|---|
|
|
275
|
+
| 向量数据库默认检索 | coding 场景最有价值的记忆是决策、规则、事实,用路径+标签+关键词更确定、更可解释 |
|
|
276
|
+
| 图数据库 | 引入运维负担,与人类工作流割裂 |
|
|
277
|
+
| LLM 提炼摘要 | **当前实现不调用 LLM**:会话提炼基于本地确定性规则,无 token 开销;本地规则提取已覆盖大多数场景 |
|
|
278
|
+
| 云端存储 | 数据留在本地,离线可用,隐私可控 |
|
|
279
|
+
|
|
280
|
+
我们坚持 **local-first, offline, zero external dependencies**。整个系统只依赖:
|
|
281
|
+
|
|
282
|
+
- 文件系统;
|
|
283
|
+
- 一个本地 SQLite 文件(仅用于 refined 派生索引);
|
|
284
|
+
- Node.js 运行时。
|
|
285
|
+
|
|
286
|
+
这让 Kimi Code Memory MCP Server 可以像 `~/.ssh/` 或 `~/.aws/` 一样,安静地待在你的用户目录里,不需要守护进程,不需要 Docker,不需要网络。
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## 九、一些生动的使用场景
|
|
291
|
+
|
|
292
|
+
### 场景一:你还记得上周的决定吗?
|
|
293
|
+
|
|
294
|
+
```text
|
|
295
|
+
User: 我们之前决定用什么做缓存?
|
|
296
|
+
Agent: [search] query=缓存层 decision
|
|
297
|
+
[recall] key=choose-sqlite-cache, folder=memory/decisions
|
|
298
|
+
→ "我们选择 SQLite 而不是 Redis,因为项目追求本地离线可用……"
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### 场景二:这个功能是怎么演进的?
|
|
302
|
+
|
|
303
|
+
```text
|
|
304
|
+
User: 登录模块是怎么演进的?
|
|
305
|
+
Agent: [tag_theme] theme=login-module
|
|
306
|
+
[trace_theme] theme=login-module
|
|
307
|
+
→ 展示跨三个 session 的 five turns:
|
|
308
|
+
- 登录表单设计
|
|
309
|
+
- JWT 策略
|
|
310
|
+
- OAuth 流程
|
|
311
|
+
- 密码重置
|
|
312
|
+
- 双因素认证
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 场景三:我又回到这个项目了
|
|
316
|
+
|
|
317
|
+
```text
|
|
318
|
+
[session start]
|
|
319
|
+
Agent: [bootstrap_workspace]
|
|
320
|
+
→ 加载 essence.md、memory/ 索引、最近对话上下文
|
|
321
|
+
→ “欢迎回来。当前项目是 kimicode-memory-mcp-server,
|
|
322
|
+
上次我们在改 README 的主题追溯示例……”
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## 十、写在最后
|
|
328
|
+
|
|
329
|
+
Kimi Code Memory MCP Server 不是又一个“把所有东西存下来再靠语义搜索”的记忆系统。
|
|
330
|
+
|
|
331
|
+
它是一个**有判断力的记忆系统**:
|
|
332
|
+
|
|
333
|
+
- 知道什么值得记(决策、规则、知识);
|
|
334
|
+
- 知道什么是临时噪音(具体某次提问、过时的调试过程);
|
|
335
|
+
- 知道怎么把零散的对话重新组织成主题;
|
|
336
|
+
- 知道用人类可读的文件作为真相源,用轻量索引作为加速器。
|
|
337
|
+
|
|
338
|
+
如果把它比作一个工具,它不是一台庞大的数据中心,而是一本**会思考的笔记本**:
|
|
339
|
+
|
|
340
|
+
> 你随手写下笔记,它替你整理目录、标注重点、关联前后文;当你再次翻开时,它不仅能告诉你“上次写了什么”,还能告诉你“这些想法是怎么发展过来的”。
|
|
341
|
+
|
|
342
|
+
这就是我们选择的设计。
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## 相关文档
|
|
347
|
+
|
|
348
|
+
- [`ARCHITECTURE.md`](./ARCHITECTURE.md) —— 更干、更技术化的架构说明
|
|
349
|
+
- [`three-layer-memory-model.md`](./three-layer-memory-model.md) —— 三层记忆模型的完整理论
|
|
350
|
+
- [`search-logic.md`](./search-logic.md) —— `search` 与 `search_context` 的实现细节
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
> **Note:** This document is adapted from a discussion on agent memory architecture between Zehee and K2.7 Code thinking.
|
|
2
|
+
|
|
3
|
+
# Three-Layer Memory Model
|
|
4
|
+
|
|
5
|
+
## TL;DR
|
|
6
|
+
|
|
7
|
+
`kimi-code-memory-mcp-server` uses a lightweight, file-system-based memory architecture:
|
|
8
|
+
|
|
9
|
+
- **Continuous cognition layer** — `AGENTS.md` / `essence.md`: rules, identity, and core constraints carried into every session.
|
|
10
|
+
- **Persistent knowledge layer** — `memory/`: structured Markdown notes for decisions, knowledge, rules, and references.
|
|
11
|
+
- **Context retention & recall layer** — `wire.jsonl` parsed on demand, with a `refined/` SQLite cache and `themes/` for cross-session tracing.
|
|
12
|
+
|
|
13
|
+
No vector database or graph database is required.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. What is Worth Remembering?
|
|
18
|
+
|
|
19
|
+
Not everything deserves persistence. We keep only three kinds of information:
|
|
20
|
+
|
|
21
|
+
1. **Continuous cognition** — who the agent is, what rules it follows, core project constraints.
|
|
22
|
+
2. **Persistent knowledge** — decisions, patterns, conventions, and reference material worth revisiting.
|
|
23
|
+
3. **Context & recall** — recent conversation state and cross-session theme associations.
|
|
24
|
+
|
|
25
|
+
Everything else stays in `wire.jsonl` as an audit trace or is discarded.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. Layer One: Continuous Cognition
|
|
30
|
+
|
|
31
|
+
File: `essence/essence.md` (and optionally user-level `~/.kimi-code/AGENTS.md`)
|
|
32
|
+
|
|
33
|
+
This layer is small, hot-reloadable, and always present. It contains:
|
|
34
|
+
|
|
35
|
+
- Identity and role expectations
|
|
36
|
+
- Hard rules (e.g., "no git mutations without explicit user approval")
|
|
37
|
+
- Language and style preferences
|
|
38
|
+
- Project-wide conventions
|
|
39
|
+
|
|
40
|
+
In this MCP server, `essence.md` is constrained to **≤15 KB**. If it grows beyond that, `organize_memories` refuses to write until the user condenses it. The file is loaded at session start via `bootstrap_workspace`.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 3. Layer Two: Persistent Knowledge
|
|
45
|
+
|
|
46
|
+
Directory: `memory/`
|
|
47
|
+
|
|
48
|
+
Structured Markdown files, categorized by purpose:
|
|
49
|
+
|
|
50
|
+
| Folder | Purpose | Tag |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `memory/decisions/` | Architecture and product decisions | `decision` |
|
|
53
|
+
| `memory/knowledge/` | Project-specific technical knowledge | `knowledge` |
|
|
54
|
+
| `memory/rules/` | Conventions, guardrails, and red lines | `rule` |
|
|
55
|
+
| `memory/reference/` | External links and documentation references | `reference` |
|
|
56
|
+
|
|
57
|
+
Each file has YAML frontmatter:
|
|
58
|
+
|
|
59
|
+
```yaml
|
|
60
|
+
---
|
|
61
|
+
key: agent-memory-three-layer-model
|
|
62
|
+
folder: memory
|
|
63
|
+
tags: [knowledge, memory, architecture]
|
|
64
|
+
---
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
A lightweight `index.json` v3-kv cache records file paths, titles, and tags. The cache is rebuildable from disk via `sync_workspace_index`; the Markdown files are the source of truth.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 4. Layer Three: Context Retention & Theme Tracing
|
|
72
|
+
|
|
73
|
+
Source: Kimi Code CLI's `wire.jsonl`
|
|
74
|
+
Cache: `refined/refined.sqlite`
|
|
75
|
+
Associations: `themes/<theme>.json`
|
|
76
|
+
|
|
77
|
+
### 4.1 Why not use raw `wire.jsonl`?
|
|
78
|
+
|
|
79
|
+
Raw wire streams contain a lot of noise: streaming fragments, "Thinking..." traces, repeated tool headers. Searching and clustering them directly produces poor results.
|
|
80
|
+
|
|
81
|
+
### 4.2 Refined turns
|
|
82
|
+
|
|
83
|
+
When the user triggers theme tracing, `search_context` finds candidate turns across all workspace sessions. `refine_session_turns` then compresses them into structured records:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"sessionId": "sess-a",
|
|
88
|
+
"turnId": 42,
|
|
89
|
+
"summary": "Fixed port occupation issue when MCP server starts",
|
|
90
|
+
"facts": [
|
|
91
|
+
"Modified listen() logic in src/mcp/server.ts",
|
|
92
|
+
"Added port fallback mechanism (3000 -> 3001)"
|
|
93
|
+
],
|
|
94
|
+
"entities": {
|
|
95
|
+
"files": ["src/mcp/server.ts"],
|
|
96
|
+
"tools": ["edit_file", "bash"],
|
|
97
|
+
"errors": []
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
These refined turns are stored in `refined/refined.sqlite` and reused on later queries.
|
|
103
|
+
|
|
104
|
+
### 4.3 Themes as views, not containers
|
|
105
|
+
|
|
106
|
+
A theme file only holds pointers to turns and memories:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"theme": "memory-mcp-evolution",
|
|
111
|
+
"turns": [
|
|
112
|
+
{"sessionId": "sess-a", "turnId": 12},
|
|
113
|
+
{"sessionId": "sess-b", "turnId": 3}
|
|
114
|
+
],
|
|
115
|
+
"memories": [
|
|
116
|
+
{"key": "agent-memory-three-layer-model", "folder": "memory"}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
A single refined turn can be referenced by multiple themes. This avoids duplicating content and keeps the storage model simple.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 5. Tools by Layer
|
|
126
|
+
|
|
127
|
+
| Layer | Tools |
|
|
128
|
+
|---|---|
|
|
129
|
+
| Continuous cognition | `bootstrap_workspace`, `organize_memories` |
|
|
130
|
+
| Persistent knowledge | `remember`, `recall`, `search`, `list`, `move`, `delete`, `sync_workspace_index` |
|
|
131
|
+
| Context & themes | `load_workspace_context`, `load_more_context`, `search_context`, `refine_session_turns`, `load_turn_context`, `tag_theme`, `trace_theme`, `list_themes` |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 6. Why No Vector or Graph Database?
|
|
136
|
+
|
|
137
|
+
For coding agents, the hard problem is usually **curation**, not **retrieval scale**. A well-structured Markdown library with path/tag/keyword search covers most needs:
|
|
138
|
+
|
|
139
|
+
- Path search: `memory/decisions/*`
|
|
140
|
+
- Tag filter: `tag = architecture`
|
|
141
|
+
- Keyword search: `search` and `search_context`
|
|
142
|
+
- Theme traversal: `trace_theme`
|
|
143
|
+
|
|
144
|
+
These are fast, deterministic, and explainable. If vector retrieval is ever needed, it can be added as an optional plugin, not the default.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 7. References
|
|
149
|
+
|
|
150
|
+
- CoALA: A Cognitive Architecture for Language Agents (Princeton, 2023)
|
|
151
|
+
- Mem0: Chhikara et al., 2025
|
|
152
|
+
- Zep / Graphiti: Rasmussen et al., 2025
|
|
153
|
+
- Claude Code Auto-Memory / CLAUDE.md: datastudios.org, 2026
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
> **说明:** 本文档由 Zehee 与 K2.7 Code thinking 关于 Agent 记忆架构的讨论整理而来。
|
|
2
|
+
|
|
3
|
+
# 三层记忆模型
|
|
4
|
+
|
|
5
|
+
## TL;DR
|
|
6
|
+
|
|
7
|
+
`kimi-code-memory-mcp-server` 采用轻量的、基于文件系统的记忆架构:
|
|
8
|
+
|
|
9
|
+
- **持续认知层** —— `AGENTS.md` / `essence.md`:每个会话都会携带的规则、身份与核心约束。
|
|
10
|
+
- **持久化知识层** —— `memory/`:结构化的 Markdown 笔记,记录决策、知识、规则与参考。
|
|
11
|
+
- **上下文保持与追溯层** —— 按需解析 `wire.jsonl`,通过 `refined/` SQLite 缓存与 `themes/` 实现跨会话主题追溯。
|
|
12
|
+
|
|
13
|
+
无需向量数据库或图数据库。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. 什么值得被记住?
|
|
18
|
+
|
|
19
|
+
并非所有信息都值得持久化。我们只保留三类:
|
|
20
|
+
|
|
21
|
+
1. **持续认知**:Agent 是谁、遵循什么规则、核心项目约束。
|
|
22
|
+
2. **持久化知识**:值得反复查阅的决策、模式、约定与参考资料。
|
|
23
|
+
3. **上下文与追溯**:近期对话状态与跨会话主题关联。
|
|
24
|
+
|
|
25
|
+
其余内容留在 `wire.jsonl` 作为审计痕迹,或直接丢弃。
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. 第一层:持续认知
|
|
30
|
+
|
|
31
|
+
文件:`essence/essence.md`(以及可选的用户级 `~/.kimi-code/AGENTS.md`)
|
|
32
|
+
|
|
33
|
+
这一层体积小、支持热加载、始终在场,包含:
|
|
34
|
+
|
|
35
|
+
- 身份与角色期望
|
|
36
|
+
- 硬性规则(例如"未经用户明确授权不得进行 git 突变")
|
|
37
|
+
- 语言与风格偏好
|
|
38
|
+
- 项目级约定
|
|
39
|
+
|
|
40
|
+
在本 MCP server 中,`essence.md` 被限制为 **≤15 KB**。超出时 `organize_memories` 会拒绝写入,强制用户精简。该文件通过 `bootstrap_workspace` 在会话启动时加载。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 3. 第二层:持久化知识
|
|
45
|
+
|
|
46
|
+
目录:`memory/`
|
|
47
|
+
|
|
48
|
+
按用途分类的结构化 Markdown 文件:
|
|
49
|
+
|
|
50
|
+
| 目录 | 用途 | 标签 |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `memory/decisions/` | 架构与产品决策 | `decision` |
|
|
53
|
+
| `memory/knowledge/` | 项目专属技术知识 | `knowledge` |
|
|
54
|
+
| `memory/rules/` | 约定、红线与行为规范 | `rule` |
|
|
55
|
+
| `memory/reference/` | 外部链接与文档引用 | `reference` |
|
|
56
|
+
|
|
57
|
+
每个文件都有 YAML frontmatter:
|
|
58
|
+
|
|
59
|
+
```yaml
|
|
60
|
+
---
|
|
61
|
+
key: agent-memory-three-layer-model
|
|
62
|
+
folder: memory
|
|
63
|
+
tags: [knowledge, memory, architecture]
|
|
64
|
+
---
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
轻量的 `index.json` v3-kv 缓存记录文件路径、标题与标签。该缓存可通过 `sync_workspace_index` 从磁盘重建;Markdown 文件才是真相来源。
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 4. 第三层:上下文保持与主题追溯
|
|
72
|
+
|
|
73
|
+
来源:Kimi Code CLI 的 `wire.jsonl`
|
|
74
|
+
缓存:`refined/refined.sqlite`
|
|
75
|
+
关联:`themes/<theme>.json`
|
|
76
|
+
|
|
77
|
+
### 4.1 为什么不直接用原始 `wire.jsonl`?
|
|
78
|
+
|
|
79
|
+
原始 wire 流包含大量噪声:流式输出碎片、"Thinking..." 痕迹、重复的 tool 头部。直接搜索和聚类效果很差。
|
|
80
|
+
|
|
81
|
+
### 4.2 精炼轮次
|
|
82
|
+
|
|
83
|
+
当用户触发主题追溯时,`search_context` 先跨所有工作区会话找到候选 turns。然后 `refine_session_turns` 将其压缩为结构化记录:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"sessionId": "sess-a",
|
|
88
|
+
"turnId": 42,
|
|
89
|
+
"summary": "修复了 MCP 服务器启动时的端口占用问题",
|
|
90
|
+
"facts": [
|
|
91
|
+
"修改了 src/mcp/server.ts 的 listen() 逻辑",
|
|
92
|
+
"增加了端口回退机制 (3000 -> 3001)"
|
|
93
|
+
],
|
|
94
|
+
"entities": {
|
|
95
|
+
"files": ["src/mcp/server.ts"],
|
|
96
|
+
"tools": ["edit_file", "bash"],
|
|
97
|
+
"errors": []
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
精炼后的 turns 存入 `refined/refined.sqlite`,后续查询直接复用。
|
|
103
|
+
|
|
104
|
+
### 4.3 主题是视图,不是容器
|
|
105
|
+
|
|
106
|
+
主题文件只保存指向 turns 和记忆的指针:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"theme": "memory-mcp-evolution",
|
|
111
|
+
"turns": [
|
|
112
|
+
{"sessionId": "sess-a", "turnId": 12},
|
|
113
|
+
{"sessionId": "sess-b", "turnId": 3}
|
|
114
|
+
],
|
|
115
|
+
"memories": [
|
|
116
|
+
{"key": "agent-memory-three-layer-model", "folder": "memory"}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
一个精炼 turn 可被多个主题引用,避免内容重复,保持存储模型简单。
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 5. 按层划分的工具
|
|
126
|
+
|
|
127
|
+
| 层 | 工具 |
|
|
128
|
+
|---|---|
|
|
129
|
+
| 持续认知 | `bootstrap_workspace`, `organize_memories` |
|
|
130
|
+
| 持久化知识 | `remember`, `recall`, `search`, `list`, `move`, `delete`, `sync_workspace_index` |
|
|
131
|
+
| 上下文与主题 | `load_workspace_context`, `load_more_context`, `search_context`, `refine_session_turns`, `load_turn_context`, `tag_theme`, `trace_theme`, `list_themes` |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 6. 为什么不用向量或图数据库?
|
|
136
|
+
|
|
137
|
+
对 coding agent 来说,困难的问题通常是**整理**而非**检索规模**。结构良好的 Markdown 库配合路径/标签/关键词搜索足以覆盖大多数场景:
|
|
138
|
+
|
|
139
|
+
- 路径搜索:`memory/decisions/*`
|
|
140
|
+
- 标签过滤:`tag = architecture`
|
|
141
|
+
- 关键词搜索:`search` 与 `search_context`
|
|
142
|
+
- 主题遍历:`trace_theme`
|
|
143
|
+
|
|
144
|
+
这些方法快速、确定、可解释。如果未来确实需要向量检索,可以作为可选插件加入,而不是默认路径。
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 7. 参考
|
|
149
|
+
|
|
150
|
+
- CoALA: A Cognitive Architecture for Language Agents (Princeton, 2023)
|
|
151
|
+
- Mem0: Chhikara et al., 2025
|
|
152
|
+
- Zep / Graphiti: Rasmussen et al., 2025
|
|
153
|
+
- Claude Code Auto-Memory / CLAUDE.md: datastudios.org, 2026
|