kimi-code-memory-mcp-server 0.1.0 → 0.1.2
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 +29 -1
- package/README.en.md +342 -0
- package/README.md +267 -125
- package/assets/contextFlow.svg +144 -0
- package/assets/user-agents.md +111 -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 +19 -0
- package/dist/refine/store.js +139 -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 +10 -56
- package/dist/refined-manager.js +22 -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/setup-cli.d.ts +11 -0
- package/dist/setup-cli.js +84 -0
- package/dist/setup-cli.js.map +1 -0
- package/dist/setup.d.ts +33 -0
- package/dist/setup.js +206 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/context-tools.d.ts +16 -51
- package/dist/tools/context-tools.js +247 -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 +86 -32
- package/dist/tools/system-tools.js.map +1 -1
- package/dist/tools/theme-tools.d.ts +3 -31
- package/dist/tools/theme-tools.js +78 -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 +4 -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 +82 -0
- package/dist/vis/api.js +212 -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 +103 -0
- package/dist/vis/server.js.map +1 -0
- package/dist/vis/static/app.js +395 -0
- package/dist/vis/static/index.html +95 -0
- package/dist/vis/static/style.css +707 -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 +14 -6
- package/README.zh-CN.md +0 -227
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
> 本文性质:设计思考 / 讨论稿,记录对决策守卫机制的深入探讨。
|
|
2
|
+
> 与具体项目无关。
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 决策守卫机制设计笔记
|
|
7
|
+
|
|
8
|
+
## 一、问题背景
|
|
9
|
+
|
|
10
|
+
在多轮、长周期的 coding agent 项目中,历史决策的漂移和矛盾是一个常见问题:
|
|
11
|
+
|
|
12
|
+
- agent 在新 session 中推翻昨天刚定的架构
|
|
13
|
+
- 长会话中逐渐偏离早期结论
|
|
14
|
+
- 同一个问题在不同 session 被反复争论
|
|
15
|
+
- 决策更新后,相关历史讨论没有被自动关联
|
|
16
|
+
|
|
17
|
+
决策守卫(Decision Guard)就是为了解决这个问题而提出的机制。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 二、一个常见的误解:决策守卫是外部控制
|
|
22
|
+
|
|
23
|
+
最初容易把决策守卫理解为一种**外部强制机制**:
|
|
24
|
+
|
|
25
|
+
- 在 agent 执行 Write/Edit/Bash 之前拦截
|
|
26
|
+
- 监听 agent 的 thinking 流
|
|
27
|
+
- 替 agent 判断某个动作是否违反历史决策
|
|
28
|
+
|
|
29
|
+
但这种思路有一个根本问题:**它入侵了 agent 的行为层和思想层**。
|
|
30
|
+
|
|
31
|
+
agent 架构的核心原则是:LLM 是决策者,外部系统只提供信息和工具。如果外部系统强制控制 LLM 能做什么、不能做什么,就违背了这个原则,也会带来高昂的实现成本和误判风险。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 三、核心洞察:决策守卫是认知问题,不是控制问题
|
|
36
|
+
|
|
37
|
+
**决策守卫本质上只能发生在 LLM 的意识层。**
|
|
38
|
+
|
|
39
|
+
如果 LLM 自己不知道、不理解、不重视历史决策,任何外部强制都是:
|
|
40
|
+
- 入侵行为层(拦截工具调用)
|
|
41
|
+
- 入侵思想层(监听 thinking 流)
|
|
42
|
+
- 架空 LLM(替它做决定)
|
|
43
|
+
|
|
44
|
+
因此,真正的问题不是"如何阻止 LLM 做错误的事",而是:
|
|
45
|
+
|
|
46
|
+
> **如何让 LLM 在需要时,主动、自然、低成本地想起并检查相关历史决策?**
|
|
47
|
+
|
|
48
|
+
决策守卫的边界应该在 LLM 意识层:系统负责把正确的决策在合适的时机送到 LLM 面前,LLM 负责基于这些决策做判断。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 四、从软约束到硬机制的光谱
|
|
53
|
+
|
|
54
|
+
决策守卫不是单一机制,而是一个从软到硬的连续谱。
|
|
55
|
+
|
|
56
|
+
### 4.1 Prompt 软约束:意义层(必要但不足够)
|
|
57
|
+
|
|
58
|
+
把决策守卫写在 Prompt 里,要求 agent 在执行状态改变动作前主动检索 memory/、search_context、trace_theme。
|
|
59
|
+
|
|
60
|
+
**Prompt 软约束是必须的**,因为它是让 agent **理解决策守卫意义**的关键。agent 需要知道:
|
|
61
|
+
- 历史决策为什么重要
|
|
62
|
+
- 什么时候应该检查
|
|
63
|
+
- 检查到什么结果该怎么处理
|
|
64
|
+
- 冲突时应该向用户报告而不是 silently 绕过
|
|
65
|
+
|
|
66
|
+
没有这一层,任何工具或机制都会变成无意义的仪式。agent 可能机械地调用 `decision_guard`,但不理解为什么要重视返回结果。
|
|
67
|
+
|
|
68
|
+
**但 Prompt 软约束本身不够**:
|
|
69
|
+
- 长会话中 agent 会"忘记"
|
|
70
|
+
- 检索质量不稳定
|
|
71
|
+
- 发现冲突也只是文本提醒,agent 仍可能继续执行
|
|
72
|
+
|
|
73
|
+
所以 Prompt 是**意义层**,负责解释"为什么";还需要一个**机制层**,负责提醒"什么时候做"。
|
|
74
|
+
|
|
75
|
+
### 4.2 提供专用检查工具(低侵入,中等可靠性)
|
|
76
|
+
|
|
77
|
+
提供一个 `decision_guard(query)` 工具,让 LLM 用一步调用就能查到相关决策。
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
LLM: 我要把 refresh token 存到 localStorage
|
|
81
|
+
│
|
|
82
|
+
▼
|
|
83
|
+
decision_guard("refresh token localStorage")
|
|
84
|
+
│
|
|
85
|
+
▼
|
|
86
|
+
返回:memory/decisions/auth-flow.md
|
|
87
|
+
"refresh token 不得存储在前端"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
这比让 LLM 自己组织检索要容易,但仍然依赖自觉。
|
|
91
|
+
|
|
92
|
+
### 4.3 任务层上下文注入(中等侵入,中等可靠性)
|
|
93
|
+
|
|
94
|
+
当用户给出一个任务时,系统根据任务描述匹配相关 themes,把 decision clusters 注入到 LLM 初始上下文中。
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
User: "帮我改一下 Auth 模块的 token 刷新逻辑"
|
|
98
|
+
│
|
|
99
|
+
▼
|
|
100
|
+
Orchestrator: 这个任务与 auth-flow 主题相关
|
|
101
|
+
│
|
|
102
|
+
▼
|
|
103
|
+
在 LLM 初始上下文中追加:
|
|
104
|
+
"[相关决策] Auth 模块采用 JWT + httpOnly cookie 方案,
|
|
105
|
+
refresh token 不得存储在前端。"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
这相当于"会议开场时把背景资料摆在桌上",不需要监听 LLM 的 thinking。
|
|
109
|
+
|
|
110
|
+
**局限**:只能覆盖用户明确提到的任务,无法处理会话中自发偏离。
|
|
111
|
+
|
|
112
|
+
### 4.4 响应/计划层上下文注入(较高侵入)
|
|
113
|
+
|
|
114
|
+
系统观察 LLM 的输出或计划,当检测到与某主题相关时,动态注入决策上下文。
|
|
115
|
+
|
|
116
|
+
这需要某种形式的观察,侵入性比任务层更高。
|
|
117
|
+
|
|
118
|
+
### 4.5 工具调用层 checkpoint(高侵入,高可靠性)
|
|
119
|
+
|
|
120
|
+
在状态改变类工具调用执行前,系统暂停并要求 LLM 完成决策检索。
|
|
121
|
+
|
|
122
|
+
```text
|
|
123
|
+
LLM: 我要写 src/auth/token.ts
|
|
124
|
+
│
|
|
125
|
+
▼
|
|
126
|
+
Orchestrator: 这个文件与 auth-flow 主题相关,请先检查历史决策
|
|
127
|
+
│
|
|
128
|
+
▼
|
|
129
|
+
LLM 完成检索后,Orchestrator 决定是否放行
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**问题**:
|
|
133
|
+
- 侵入 orchestrator 核心流程
|
|
134
|
+
- 每次 Write/Edit 都可能触发,增加延迟
|
|
135
|
+
- 误判成本高,容易打断开发流
|
|
136
|
+
- 只看工具调用参数,可能判断不出真实意图
|
|
137
|
+
|
|
138
|
+
### 4.6 事后漂移检测(低侵入,滞后)
|
|
139
|
+
|
|
140
|
+
不在执行前拦截,而是在 session 结束或 compaction 时,native 语义分析检查本次会话是否有与历史决策冲突的操作,生成报告。
|
|
141
|
+
|
|
142
|
+
```text
|
|
143
|
+
Session 结束
|
|
144
|
+
│
|
|
145
|
+
▼
|
|
146
|
+
native 分析本次 turns 和动作
|
|
147
|
+
│
|
|
148
|
+
▼
|
|
149
|
+
发现:本次提议"前端存储 refresh token"与 auth-flow 决策冲突
|
|
150
|
+
│
|
|
151
|
+
▼
|
|
152
|
+
生成 drift report,供用户 review
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
这是"发现后提醒",不是"执行前阻止"。
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 五、关键张力:不存在完美方案
|
|
160
|
+
|
|
161
|
+
决策守卫面临一个根本张力:
|
|
162
|
+
|
|
163
|
+
| 方案 | 侵入性 | 可靠性 |
|
|
164
|
+
|------|--------|--------|
|
|
165
|
+
| 纯 LLM 自觉 | 零 | 低 |
|
|
166
|
+
| 提供检查工具 | 低 | 中低 |
|
|
167
|
+
| 任务层注入 | 中 | 中 |
|
|
168
|
+
| 响应层注入 | 中高 | 中高 |
|
|
169
|
+
| 工具调用 checkpoint | 高 | 高 |
|
|
170
|
+
| 事后漂移检测 | 低 | 滞后 |
|
|
171
|
+
|
|
172
|
+
**不存在一个既零侵入又高度可靠的方案。**
|
|
173
|
+
|
|
174
|
+
任何系统侧的主动行为都需要某种形式的观察:
|
|
175
|
+
- 要知道 LLM 在讨论什么主题
|
|
176
|
+
- 要知道 LLM 准备改哪个文件
|
|
177
|
+
- 要知道 LLM 当前的任务范围
|
|
178
|
+
|
|
179
|
+
这些信息的获取本质上都需要读取 LLM 的输出、计划或工具调用意图。
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 六、推荐形态:TodoList 第零项
|
|
184
|
+
|
|
185
|
+
在所有可选方案中,把 `decision_guard` 集成到 TodoList 内部作为**第零项**,是目前看起来最干净、最尊重 agent 自主性的形态。
|
|
186
|
+
|
|
187
|
+
### 6.1 基本设计
|
|
188
|
+
|
|
189
|
+
当 agent 创建一个较长的 coding todo list 时,系统自动在第零项插入 guard 任务:
|
|
190
|
+
|
|
191
|
+
```text
|
|
192
|
+
[TodoList]
|
|
193
|
+
0. 🔍 decision_guard: 检查与本计划相关的历史决策
|
|
194
|
+
1. 设计 JWT 认证流程
|
|
195
|
+
2. 实现 refresh token 存储
|
|
196
|
+
3. 添加登录页面
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
第零项意味着:
|
|
200
|
+
- 它在所有实际工作之前
|
|
201
|
+
- 它是一个显式的前置检查点
|
|
202
|
+
- 它不参与后续编号竞争
|
|
203
|
+
- 它是可选的,但足够显眼
|
|
204
|
+
|
|
205
|
+
### 6.2 触发条件
|
|
206
|
+
|
|
207
|
+
不是每个 todo list 都需要 guard。触发条件:
|
|
208
|
+
|
|
209
|
+
- todo 项数量超过 N(如 3 或 4)
|
|
210
|
+
- native 语义分析判断该 list 的 coding 强度超过阈值
|
|
211
|
+
- 涉及架构、接口、依赖、数据模型等决策敏感领域
|
|
212
|
+
|
|
213
|
+
```text
|
|
214
|
+
coding_score > 0.6 且 项数 > 3 → 自动插入第零项
|
|
215
|
+
coding_score < 0.6 → 不插入
|
|
216
|
+
纯研究/讨论类 list → 不插入
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### 6.3 为什么放在第零项而不是自动调用
|
|
220
|
+
|
|
221
|
+
| 方式 | 问题 | 第零项方式 |
|
|
222
|
+
|------|------|-----------|
|
|
223
|
+
| 系统自动静默调用 | agent 不知道发生了什么 | agent 在自己的计划里看到 guard 任务 |
|
|
224
|
+
| 纯 Prompt 软约束 | agent 可能忘记 | todo 项是显式的,无法忽视 |
|
|
225
|
+
| 工具调用拦截 | 高侵入 | 不拦截任何动作 |
|
|
226
|
+
| 任务层自动注入 | 系统替 agent 决定 | agent 自己执行 guard |
|
|
227
|
+
|
|
228
|
+
注意:第零项不是替代 Prompt,而是**承载 Prompt**。Prompt 解释意义,第零项提供时机。
|
|
229
|
+
|
|
230
|
+
第零项的关键优势:**它既提供了强提醒,又保留了 agent 的跳过权利**。
|
|
231
|
+
|
|
232
|
+
### 6.4 信任 agent 的正常性
|
|
233
|
+
|
|
234
|
+
如果 agent 直接划掉第零项不执行,这本身是一个有效信号:
|
|
235
|
+
|
|
236
|
+
- 这个计划可能不够严肃,只是脑暴或试探
|
|
237
|
+
- 或者确实不需要决策守卫
|
|
238
|
+
- 或者 agent 自己已经判断没有相关决策
|
|
239
|
+
|
|
240
|
+
**不应该假设 agent 恶意**。设计的正确假设是:
|
|
241
|
+
|
|
242
|
+
```text
|
|
243
|
+
错误假设:agent 会故意违反决策 → 需要强制拦截
|
|
244
|
+
正确假设:agent 会遗忘或没意识到 → 给它一个无法遗忘的提醒
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
第零项就是那个"无法遗忘的提醒"。
|
|
248
|
+
|
|
249
|
+
### 6.5 执行与上下文增强
|
|
250
|
+
|
|
251
|
+
agent 执行第零项时调用 `decision_guard(query)`:
|
|
252
|
+
|
|
253
|
+
```text
|
|
254
|
+
LLM: 执行第零项
|
|
255
|
+
│
|
|
256
|
+
▼
|
|
257
|
+
decision_guard("auth token frontend-state")
|
|
258
|
+
│
|
|
259
|
+
▼
|
|
260
|
+
返回相关 decision clusters
|
|
261
|
+
│
|
|
262
|
+
▼
|
|
263
|
+
系统把决策追加到当前上下文顶部
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
这样即使 agent 只是"完成"了 guard 项,上下文已经被增强,后续 todo 执行时会自然看到这些决策。
|
|
267
|
+
|
|
268
|
+
### 6.6 被跳过的处理
|
|
269
|
+
|
|
270
|
+
如果 agent 跳过第零项,系统记录:
|
|
271
|
+
|
|
272
|
+
```text
|
|
273
|
+
guard_item_0: skipped_by_agent
|
|
274
|
+
inferred_reason: agent_judged_unnecessary
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
这个记录不用于惩罚或拦截,只用于:
|
|
278
|
+
- 事后复盘时参考
|
|
279
|
+
- 帮助优化触发条件
|
|
280
|
+
- 发现 agent 是否系统性忽略 guard
|
|
281
|
+
|
|
282
|
+
### 6.7 Prompt 软约束与第零项的关系
|
|
283
|
+
|
|
284
|
+
第零项是**机制层**,负责在正确时机提醒 agent 执行 guard。但它不能替代 **Prompt 软约束(意义层)**。
|
|
285
|
+
|
|
286
|
+
完整的工作方式是:
|
|
287
|
+
|
|
288
|
+
```text
|
|
289
|
+
系统 Prompt 中:
|
|
290
|
+
"在改变项目状态前,你应该检查相关历史决策。
|
|
291
|
+
当 todo list 出现第零项 decision_guard 时,请优先执行它。
|
|
292
|
+
如果发现冲突,向用户报告并请求澄清,不要 silently 绕过。"
|
|
293
|
+
|
|
294
|
+
实际运行时:
|
|
295
|
+
[TodoList]
|
|
296
|
+
0. 🔍 decision_guard: 检查与本计划相关的历史决策
|
|
297
|
+
1. 设计 JWT 认证流程
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
Prompt 回答"为什么"和"怎么处理",第零项回答"什么时候做"。两者结合:
|
|
301
|
+
- Prompt 让 agent 理解决策守卫的意义
|
|
302
|
+
- 第零项让 agent 无法忘记执行
|
|
303
|
+
|
|
304
|
+
没有 Prompt,第零项只是一个无意义的仪式;没有第零项,Prompt 只是容易被遗忘的嘱咐。
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## 七、`decision_guard` 工具设计
|
|
309
|
+
|
|
310
|
+
### 7.1 基础设施 2 之后的成本结构
|
|
311
|
+
|
|
312
|
+
在主题检索基础设施化之前,`decision_guard` 的成本很高:
|
|
313
|
+
|
|
314
|
+
```text
|
|
315
|
+
当前:
|
|
316
|
+
search(memory/) + search_context() + trace_theme()
|
|
317
|
+
│
|
|
318
|
+
▼
|
|
319
|
+
LLM 从大量原始文本中找决策、判断是否冲突
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
每一步都有 token 开销:检索需要 LLM 理解上下文,分析需要 LLM 从结果中提炼决策。
|
|
323
|
+
|
|
324
|
+
基础设施 2 之后:
|
|
325
|
+
|
|
326
|
+
```text
|
|
327
|
+
未来:
|
|
328
|
+
nativeQuery(memory/) → 命中决策条目(无 token)
|
|
329
|
+
nativeQuery(turns/) → 命中相关 clusters(无 token)
|
|
330
|
+
│
|
|
331
|
+
▼
|
|
332
|
+
LLM 只读少量已命中的 memory + turns,判断是否有决策冲突
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**关键变化**:
|
|
336
|
+
- 检索本身没有 token 开销
|
|
337
|
+
- 返回结果是已经被语义化提炼过的 clusters
|
|
338
|
+
- LLM 只需要做最后的判断
|
|
339
|
+
- 决策守卫的性价比因此变高
|
|
340
|
+
|
|
341
|
+
### 7.2 工具只做召回,不做判断
|
|
342
|
+
|
|
343
|
+
`decision_guard` 的定位是**材料准备工具**,不是**冲突判断工具**。
|
|
344
|
+
|
|
345
|
+
**冲突判断必须由 LLM 自己完成**,因为:
|
|
346
|
+
- 冲突往往是语境化的
|
|
347
|
+
- "冲突"可能只是合法的决策演进
|
|
348
|
+
- 决策有优先级和边界,需要权衡
|
|
349
|
+
- 只有 LLM 理解当前动作的真实意图
|
|
350
|
+
|
|
351
|
+
所以工具内部不应该输出"冲突/不冲突"的结论,只输出"相关材料"。
|
|
352
|
+
|
|
353
|
+
### 7.3 输入
|
|
354
|
+
|
|
355
|
+
```json
|
|
356
|
+
{
|
|
357
|
+
"query": "auth token refresh localStorage"
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
`query` 描述当前计划或动作。context 不是必须的,因为 native query 会根据语义自动召回。
|
|
362
|
+
|
|
363
|
+
### 7.4 内部实现
|
|
364
|
+
|
|
365
|
+
```text
|
|
366
|
+
decision_guard(query)
|
|
367
|
+
│
|
|
368
|
+
├── nativeQuery(memory/, query)
|
|
369
|
+
│ └── 命中决策、规则、知识条目
|
|
370
|
+
│
|
|
371
|
+
└── nativeQuery(turns/clusters/, query)
|
|
372
|
+
└── 命中历史讨论 clusters
|
|
373
|
+
│
|
|
374
|
+
▼
|
|
375
|
+
返回给 LLM:
|
|
376
|
+
- 相关 memory 条目
|
|
377
|
+
- 相关 turns/clusters 摘要
|
|
378
|
+
│
|
|
379
|
+
▼
|
|
380
|
+
LLM 判断是否存在冲突
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
为什么只需要 memory 和 turns:
|
|
384
|
+
- **memory** 保存决策结论
|
|
385
|
+
- **turns/clusters** 保存决策形成过程的上下文
|
|
386
|
+
- 单独的 context 查询不再必要,因为 context 已经在 turns 里
|
|
387
|
+
|
|
388
|
+
### 7.5 返回值
|
|
389
|
+
|
|
390
|
+
```json
|
|
391
|
+
{
|
|
392
|
+
"status": "ok",
|
|
393
|
+
"query": "auth token refresh localStorage",
|
|
394
|
+
"hits": {
|
|
395
|
+
"memory": [
|
|
396
|
+
{
|
|
397
|
+
"source": "memory/decisions/auth-flow.md",
|
|
398
|
+
"title": "JWT + httpOnly cookie 方案",
|
|
399
|
+
"content": "refresh token 不得存储在前端",
|
|
400
|
+
"relevance_score": 0.94
|
|
401
|
+
}
|
|
402
|
+
],
|
|
403
|
+
"turns": [
|
|
404
|
+
{
|
|
405
|
+
"cluster_id": "cluster-3",
|
|
406
|
+
"theme": "auth-flow",
|
|
407
|
+
"summary": "确定 JWT + httpOnly cookie 的 Auth 方案",
|
|
408
|
+
"decision": true,
|
|
409
|
+
"relevance_score": 0.91
|
|
410
|
+
}
|
|
411
|
+
]
|
|
412
|
+
},
|
|
413
|
+
"llm_judgment_required": true,
|
|
414
|
+
"summary": "找到 auth-flow 相关决策和讨论,请 LLM 判断是否冲突"
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
注意:返回值中没有 `conflict` 或 `recommendation` 字段。工具不替 LLM 判断,只负责把相关材料摆在它面前。
|
|
419
|
+
|
|
420
|
+
### 7.6 LLM 的判断 prompt
|
|
421
|
+
|
|
422
|
+
工具返回后,LLM 应该收到类似这样的提示:
|
|
423
|
+
|
|
424
|
+
```text
|
|
425
|
+
你计划执行:把 refresh token 存储在 localStorage
|
|
426
|
+
|
|
427
|
+
相关历史决策:
|
|
428
|
+
- memory/decisions/auth-flow.md: "refresh token 不得存储在前端" (relevance: 0.94)
|
|
429
|
+
|
|
430
|
+
相关历史讨论:
|
|
431
|
+
- cluster-3 (auth-flow): "确定 JWT + httpOnly cookie 的 Auth 方案" (relevance: 0.91)
|
|
432
|
+
|
|
433
|
+
请判断:
|
|
434
|
+
1. 这些材料中是否有与你当前计划冲突的决策?
|
|
435
|
+
2. 如果有,请引用来源并说明冲突点。
|
|
436
|
+
3. 如果没有,请说明可以继续执行。
|
|
437
|
+
4. 如果旧决策的前提已经变化,请说明原因并建议更新决策。
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 九、更诚实的定位
|
|
443
|
+
|
|
444
|
+
决策守卫不应该被描述为一个已经确定的原生强制机制,而应该被理解为:
|
|
445
|
+
|
|
446
|
+
> **一组按侵入性排序的可选机制,用于帮助 LLM 在意识层记起历史决策。**
|
|
447
|
+
|
|
448
|
+
最理想的形态是 LLM 自发地、习惯性地检查历史决策。当自觉性不足时,系统可以在任务层面预加载决策。对于核心架构决策,才考虑更高侵入性的执行前检查。
|
|
449
|
+
|
|
450
|
+
**核心原则**:
|
|
451
|
+
- 决策守卫的目标不是禁止变化
|
|
452
|
+
- 而是确保**变化被看见、被评估、被记录**
|
|
453
|
+
- 系统负责把决策送到 LLM 面前
|
|
454
|
+
- LLM 负责基于决策做判断
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
## 十、与主题检索基础设施的关系
|
|
459
|
+
|
|
460
|
+
主题检索基础设施化让决策守卫变得更可行,因为它提供了:
|
|
461
|
+
|
|
462
|
+
- **结构化的决策单元**:theme 中的 `decision: true` clusters
|
|
463
|
+
- **低成本的语义匹配**:native semantic analysis 可以快速判断当前讨论/动作与哪些决策相关
|
|
464
|
+
- **决策演进的时间线**:每个决策 cluster 都有关联 turns 和历史上下文
|
|
465
|
+
|
|
466
|
+
但主题基础设施解决的是"决策如何被存储和检索",不是"如何强制 LLM 遵守决策"。后者仍然是一个开放的认知问题。
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## 十一、设计建议
|
|
471
|
+
|
|
472
|
+
1. **首选 TodoList 第零项**:对于 coding todo list,当长度和复杂度超过阈值时,自动插入 `decision_guard` 作为第零项。这是目前最干净、最不侵入的形态。
|
|
473
|
+
2. **信任 agent 的正常性**:如果 agent 跳过第零项,不强制拦截。agent 直接划掉 guard 本身说明该计划可能不需要守卫。
|
|
474
|
+
3. **从软到硬逐步引入**:先提供工具和任务层注入,再探索更强机制
|
|
475
|
+
4. **可配置性优先**:不同 theme、不同动作类型可以配置不同的守卫强度
|
|
476
|
+
5. **避免误杀**:实验目录、prototype、spike 应该默认低强度
|
|
477
|
+
6. **演进通道**:不是简单阻断,而是提供"更新决策"的路径
|
|
478
|
+
7. **反馈循环**:当 LLM 违反决策时,把冲突信息返回给 LLM,帮助其形成检查习惯
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
## 十二、结论
|
|
483
|
+
|
|
484
|
+
决策守卫是一个重要但棘手的问题。
|
|
485
|
+
|
|
486
|
+
它不是靠一个"原生强制 checkpoint"就能干净解决的。真正的解决方案更可能是:**让检查历史决策成为 LLM 最自然、成本最低的行为选择**,而不是靠外部系统强制控制。
|
|
487
|
+
|
|
488
|
+
当前最推荐的形态是 **TodoList 第零项**:当 agent 创建较长的 coding todo list 时,系统自动插入 `decision_guard` 作为第零项。agent 可以选择执行或跳过,这种设计既提供了强提醒,又尊重了 agent 的自主性。
|
|
489
|
+
|
|
490
|
+
主题检索基础设施化是必要条件,但不是充分条件。充分的解决方案需要:
|
|
491
|
+
- 更好的上下文设计
|
|
492
|
+
- 更好用的检查工具
|
|
493
|
+
- 更自然的反馈循环
|
|
494
|
+
- 以及承认有些场景下只能依赖 LLM 自觉
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
*文档性质:设计思考 / 讨论稿*
|
|
499
|
+
*生成时间:2026-06-23*
|
|
500
|
+
*与任何具体项目无关*
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -67,7 +67,7 @@ This document explains how Kimi Code Memory MCP Server is structured, how data f
|
|
|
67
67
|
| `src/server.ts` | MCP server entry, registers tools, starts stdio transport. |
|
|
68
68
|
| `src/config.ts` | Default paths, environment variable handling (`MEMORY_STORE_ROOT`, `MEMORY_SESSIONS_ROOT`, `KIMI_CODE_HOME`). |
|
|
69
69
|
| `src/tools/index.ts` | Tool schemas, validation, and dispatch. |
|
|
70
|
-
| `src/tools/memory-tools.ts` | `remember`, `recall`, `
|
|
70
|
+
| `src/tools/memory-tools.ts` | `remember`, `recall`, `search`, `list`, `list_tags`, `delete`, `move`. |
|
|
71
71
|
| `src/tools/context-tools.ts` | `load_workspace_context`, `load_more_context`, `search_context`, `load_turn_context`. |
|
|
72
72
|
| `src/tools/theme-tools.ts` | `tag_theme`, `trace_theme`, `list_themes`, `refine_session_turns`. |
|
|
73
73
|
| `src/tools/system-tools.ts` | `organize_memories`, `sync_workspace_index`, `bootstrap_workspace`, `get_current_workspace`. |
|
|
@@ -115,7 +115,7 @@ This document explains how Kimi Code Memory MCP Server is structured, how data f
|
|
|
115
115
|
|
|
116
116
|
1. **Capture** — Agent writes a memory via `remember`.
|
|
117
117
|
2. **Index** — `IndexDao` updates `index.json` and writes the `.md` file.
|
|
118
|
-
3. **Recall** — Agent uses `search`, `recall`, or `
|
|
118
|
+
3. **Recall** — Agent uses `search`, `recall`, or `list` to retrieve memories.
|
|
119
119
|
4. **Distill** — `organize_memories` condenses `memory/` into `essence/essence.md` (≤15 KB).
|
|
120
120
|
5. **Trace** — `tag_theme` and `trace_theme` connect memories and conversation turns into evolving themes.
|
|
121
121
|
6. **Archive/Move** — `move` renames or relocates a memory; `delete` removes it.
|