dsh-memory-palace 1.8.0 → 1.8.1-alpha.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/README.md +163 -155
- package/lib/api.mjs +9 -50
- package/lib/client.js +549 -830
- package/lib/common/logger.mjs +5 -5
- package/lib/common/paths.mjs +4 -4
- package/lib/common/planmode.mjs +10 -10
- package/lib/common/prompts.mjs +46 -96
- package/lib/common/records.mjs +7 -119
- package/lib/common/sections.mjs +7 -7
- package/lib/common/session.mjs +1 -1
- package/lib/common/text.mjs +7 -7
- package/lib/hybrid/index.mjs +4 -4
- package/lib/hybrid/prompts.mjs +4 -4
- package/lib/hybrid/subagent.mjs +446 -446
- package/lib/hybrid/tools.mjs +81 -25
- package/lib/index.js +693 -560
- package/lib/projection.mjs +198 -188
- package/lib/tools.mjs +16 -10
- package/package.json +2 -1
- package/lib/common/retry.mjs +0 -138
- package/lib/distill.mjs +0 -393
package/README.md
CHANGED
|
@@ -1,155 +1,163 @@
|
|
|
1
|
-
# dsh-memory-palace <img src="assets/memory-icon.svg" width="36" height="36" alt="dsh-memory-palace" />
|
|
2
|
-
|
|
3
|
-
把 WorkBuddy 的文件式记忆系统移植进 [DeepSeek Harness](https://www.deepseek.com/harness/) —— 为 Harness 提供**跨会话持久化、人类可直接编辑的 Markdown 记忆**。
|
|
4
|
-
|
|
5
|
-
[](./LICENSE) [](https://awesome-dsh-plugin.com) [](https://www.npmjs.com/package/dsh-memory-palace) [](https://github.com/deepseek-ai/deepseek-harness) [](#安装)
|
|
6
|
-
|
|
7
|
-
## 特性
|
|
8
|
-
|
|
9
|
-
- **人类可读的真源**:记忆以纯 Markdown 存储,任何编辑器都能直接修改,数据始终属于你。
|
|
10
|
-
- **双层记忆**:用户级(跨项目个人偏好)+ 工作区级(项目约定),互不干扰。
|
|
11
|
-
- **WorkBuddy / CodeBuddy 桥接**:项目已有对应记忆目录时直接读写,无需重复维护。
|
|
12
|
-
- **记忆工具**:AI 可主动写入、聚合读取、按内容删除(删除需人工确认),写入自带去重。
|
|
13
|
-
-
|
|
14
|
-
- **设置页集成**:全部配置均可在 DSH 设置面板中图形化调整(按板块折叠),无需改配置文件。
|
|
15
|
-
- **自定义指令**:不适合写进记忆的特殊指令可在设置页配置,插件经系统提示词注入。
|
|
16
|
-
- **记忆注入**:长期记忆与今日日志以「会话起始快照」常驻上下文、按文件身份各只注入一次 —— 既保证每个步骤都可见,又不破坏前缀缓存、不堆积冗余快照。
|
|
17
|
-
- **记忆写入(v1.8.0 起唯一模式)**:**记忆子代理**每轮自动整理今日日志并去重(章节化、标删),**长期记忆 `MEMORY.md` 由主 AI 主动维护**,兼顾自动化与可控性。
|
|
18
|
-
- v1.8.0 破坏性变更:原「主动记忆(插件模式)」与「智能模式」已整体移除。二者的能力已被覆盖——主动落档由分工指令引导主 AI 承担,逐轮摘要由记忆子代理写进日志承担。
|
|
19
|
-
- **标准插件包**:经官方插件机制一键安装,无需改动 harness。
|
|
20
|
-
|
|
21
|
-
## 记忆文件布局
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
~/.deepseek-harness/
|
|
25
|
-
└── MEMORY.md # 用户级记忆(跨项目个人偏好)
|
|
26
|
-
|
|
27
|
-
<项目根>/
|
|
28
|
-
├── .workbuddy/memory/ # 桥接 WorkBuddy 记忆(存在时优先写入)
|
|
29
|
-
│ ├── MEMORY.md # 项目级约定(buddy 目录保持嵌套,兼容 WB/CB 原生格式)
|
|
30
|
-
│ └── 2026-08-16.md # 每日工作日志
|
|
31
|
-
├── .codebuddy/memory/ # 桥接 CodeBuddy 记忆(存在时,结构同 .workbuddy)
|
|
32
|
-
└── .deepseek-harness/ # dsh 原生目录(读取恒在首位;无 buddy 时作为写入目标创建)
|
|
33
|
-
├── MEMORY.md # 项目级约定(长期记忆,与 memory/ 同级)
|
|
34
|
-
└── memory/
|
|
35
|
-
└── 2026-08-16.md # 每日工作日志
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## 工作原理
|
|
39
|
-
|
|
40
|
-
**读取(每轮对话)**——两条通道并行:
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
① 系统提示词(恒定):记忆分工指令 / 自定义指令等固定内容,前缀缓存友好
|
|
44
|
-
② 对话历史投影(易变):用户级 + 项目级长期记忆、今日日志——按文件身份各注入一次,压缩后自动重注最新版
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
|
65
|
-
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
68
|
-
| `
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
npm
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
dsh plugin --profile web add dsh-memory-palace
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
##
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
-
|
|
132
|
-
|
|
133
|
-
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
-
|
|
137
|
-
|
|
138
|
-
-
|
|
139
|
-
-
|
|
140
|
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
144
|
-
- **
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
-
|
|
151
|
-
- **
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
1
|
+
# dsh-memory-palace <img src="assets/memory-icon.svg" width="36" height="36" alt="dsh-memory-palace" />
|
|
2
|
+
|
|
3
|
+
把 WorkBuddy 的文件式记忆系统移植进 [DeepSeek Harness](https://www.deepseek.com/harness/) —— 为 Harness 提供**跨会话持久化、人类可直接编辑的 Markdown 记忆**。
|
|
4
|
+
|
|
5
|
+
[](./LICENSE) [](https://awesome-dsh-plugin.com) [](https://www.npmjs.com/package/dsh-memory-palace) [](https://github.com/deepseek-ai/deepseek-harness) [](#安装)
|
|
6
|
+
|
|
7
|
+
## 特性
|
|
8
|
+
|
|
9
|
+
- **人类可读的真源**:记忆以纯 Markdown 存储,任何编辑器都能直接修改,数据始终属于你。
|
|
10
|
+
- **双层记忆**:用户级(跨项目个人偏好)+ 工作区级(项目约定),互不干扰。
|
|
11
|
+
- **WorkBuddy / CodeBuddy 桥接**:项目已有对应记忆目录时直接读写,无需重复维护。
|
|
12
|
+
- **记忆工具**:AI 可主动写入、聚合读取、按内容删除(删除需人工确认),写入自带去重。
|
|
13
|
+
- **会话命令重整记忆**:手打 `/memory_reorganize` 触发项目记忆全量重整(沿用「超出注入预算 且 过冷却期」双门禁 + 原生确认,原文件自动整档备份);
|
|
14
|
+
- **设置页集成**:全部配置均可在 DSH 设置面板中图形化调整(按板块折叠),无需改配置文件。
|
|
15
|
+
- **自定义指令**:不适合写进记忆的特殊指令可在设置页配置,插件经系统提示词注入。
|
|
16
|
+
- **记忆注入**:长期记忆与今日日志以「会话起始快照」常驻上下文、按文件身份各只注入一次 —— 既保证每个步骤都可见,又不破坏前缀缓存、不堆积冗余快照。
|
|
17
|
+
- **记忆写入(v1.8.0 起唯一模式)**:**记忆子代理**每轮自动整理今日日志并去重(章节化、标删),**长期记忆 `MEMORY.md` 由主 AI 主动维护**,兼顾自动化与可控性。
|
|
18
|
+
- v1.8.0 破坏性变更:原「主动记忆(插件模式)」与「智能模式」已整体移除。二者的能力已被覆盖——主动落档由分工指令引导主 AI 承担,逐轮摘要由记忆子代理写进日志承担。
|
|
19
|
+
- **标准插件包**:经官方插件机制一键安装,无需改动 harness。
|
|
20
|
+
|
|
21
|
+
## 记忆文件布局
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
~/.deepseek-harness/
|
|
25
|
+
└── MEMORY.md # 用户级记忆(跨项目个人偏好)
|
|
26
|
+
|
|
27
|
+
<项目根>/
|
|
28
|
+
├── .workbuddy/memory/ # 桥接 WorkBuddy 记忆(存在时优先写入)
|
|
29
|
+
│ ├── MEMORY.md # 项目级约定(buddy 目录保持嵌套,兼容 WB/CB 原生格式)
|
|
30
|
+
│ └── 2026-08-16.md # 每日工作日志
|
|
31
|
+
├── .codebuddy/memory/ # 桥接 CodeBuddy 记忆(存在时,结构同 .workbuddy)
|
|
32
|
+
└── .deepseek-harness/ # dsh 原生目录(读取恒在首位;无 buddy 时作为写入目标创建)
|
|
33
|
+
├── MEMORY.md # 项目级约定(长期记忆,与 memory/ 同级)
|
|
34
|
+
└── memory/
|
|
35
|
+
└── 2026-08-16.md # 每日工作日志
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 工作原理
|
|
39
|
+
|
|
40
|
+
**读取(每轮对话)**——两条通道并行:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
① 系统提示词(恒定):记忆分工指令 / 自定义指令等固定内容,前缀缓存友好
|
|
44
|
+
② 对话历史投影(易变):用户级 + 项目级长期记忆、今日日志——按文件身份各注入一次,压缩后自动重注最新版
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**写入(每轮结束)**——交给记忆子代理异步处理:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
本轮结束 ──► 前置闸门:enabled / 计划模式 / 静默预设 / 有可用记忆目录 → 否则跳过
|
|
51
|
+
│
|
|
52
|
+
├─► 记忆子代理把本轮实质内容写成章节化条目 → 今日日志(重复/过时条目标删)
|
|
53
|
+
└─► 长期记忆由主 AI 按分工指令主动维护(memory_write / memory_update_section)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
日志文件头统一为日期标题,写入时自动补齐(历史文件不回填)。日志由子代理维护、**永不过期不删**(作为可追溯的证据层)。
|
|
57
|
+
|
|
58
|
+
**工具**——AI 在对话中按需调用:
|
|
59
|
+
|
|
60
|
+
| 工具 | 层级 | 作用 |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| `memory_note` | 项目级 | 把约定/偏好写入当前项目全部目标 `MEMORY.md`(去重) |
|
|
63
|
+
| `memory_note_user` | 用户级 | 把跨项目偏好写入 `~/.deepseek-harness/MEMORY.md`(去重) |
|
|
64
|
+
| `memory_read` | 按需 | 读取记忆。`scope` 默认 `memory`(用户级 + 项目级);可选 `project`(仅项目级,与 `memory_write` 的写侧 scope 同名)/ `today` / `yesterday` / `daily`(近三天日志)/ `all`(长期记忆 + 日志) |
|
|
65
|
+
| `memory_delete` | 用户级/项目级/每日级 | 按内容删除记忆条目(两阶段确认:先预览匹配位置与内容,用户确认后再删;删除动作经 harness 原生确认弹窗硬闸门,真人点允许才真正执行) |
|
|
66
|
+
| `memory_write` | 项目级/用户级 | 章节化写入:章节存在则末尾追加,不存在则新建章节(章节化格式规范) |
|
|
67
|
+
| `memory_update_section` | 项目级/用户级 | 整章节精确替换/单条标记删除:oldText 归一化精确匹配防 stale,失败拒绝并回显实际内容 |
|
|
68
|
+
| `memory_reorganize` | 仅项目级 | 全量重整 MEMORY.md:双门禁(超出注入预算 且 距上次重整 ≥ 冷却天数)机器校验,原子替换 + 时间戳注释,用户确认弹窗 |
|
|
69
|
+
|
|
70
|
+
## 安装
|
|
71
|
+
|
|
72
|
+
### CLI 版(`web` profile)
|
|
73
|
+
|
|
74
|
+
方式一:直接通过 GitHub 安装(推荐,`lib/` 构建产物已随仓库分发,装即用)
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
dsh plugin --profile web add github:lovezi0/dsh-memory-palace
|
|
78
|
+
# 锁定版本:dsh plugin --profile web add github:lovezi0/dsh-memory-palace#v1.8.0
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
方式二:clone 后本地安装(开发 / 修改源码场景)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
git clone https://github.com/lovezi0/dsh-memory-palace.git
|
|
85
|
+
cd dsh-memory-palace
|
|
86
|
+
npm install
|
|
87
|
+
npm run build # src/ → lib/(服务端递归复制 + 客户端零依赖拼接,无外部构建依赖)
|
|
88
|
+
dsh plugin --profile web add . # 装入 web profile(profile 名按你的实际配置调整)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
方式三:通过 npm 安装(已发布到 npm registry,可走镜像加速)
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# 直接由 dsh 从 npm 拉取并装入(本机若已配镜像会自动走镜像)
|
|
95
|
+
dsh plugin --profile web add dsh-memory-palace
|
|
96
|
+
|
|
97
|
+
# 或先手动用 npm 安装(显式指定镜像),再装入:
|
|
98
|
+
npm install dsh-memory-palace --registry=https://registry.npmmirror.com/
|
|
99
|
+
dsh plugin --profile web add dsh-memory-palace
|
|
100
|
+
```
|
|
101
|
+
### CLI 版卸载
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
dsh plugin --profile web remove dsh-memory-palace
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Desktop 版
|
|
108
|
+
- github: `github:lovezi0/dsh-memory-palace`
|
|
109
|
+
- npm: `dsh-memory-palace`
|
|
110
|
+
|
|
111
|
+
## 配置
|
|
112
|
+
*面板路径为 DSH 设置 →「记忆」*
|
|
113
|
+
所有配置项(核心 / 自定义指令 / 记忆写入 / 存储路径与预算 / 开发 五张卡片的字段、默认值与说明)已整理至 [CONFIG.md](./CONFIG.md)
|
|
114
|
+
|
|
115
|
+
## 开发
|
|
116
|
+
|
|
117
|
+
架构 / 构建 / 技术要点 / 蒸馏失败重试 见 [DEVELOPMENT.md](./DEVELOPMENT.md)。
|
|
118
|
+
提示词与重整命令(分工指令 / 子代理 prompt / `REORG_COMMAND_PROMPT`) 见 [PROMPTS.md](./PROMPTS.md)。
|
|
119
|
+
|
|
120
|
+
## 版本历史
|
|
121
|
+
|
|
122
|
+
- **1.8.1**
|
|
123
|
+
- **1.8.1-alpha.3**
|
|
124
|
+
- **1.8.1-alpha.2**
|
|
125
|
+
- 💥移除「蒸馏项目记忆」手动功能
|
|
126
|
+
- 💥移除 session header 记忆按钮
|
|
127
|
+
- 🔥增加会话命令 memory_reorganize *全量重整项目记忆*
|
|
128
|
+
- 💪优化 memory_write 工具 prompt
|
|
129
|
+
- 🐛修复 memory_reorganize 工具读取历史工作日志的问题
|
|
130
|
+
- **1.8.1-alpha.1**
|
|
131
|
+
- 💥移除「蒸馏会话」手动功能
|
|
132
|
+
- 💥配置项 summaryMaxTokens / feedbackEnabled 删除,旧值静默失效
|
|
133
|
+
- 💪优化 session header 记忆按钮样式
|
|
134
|
+
- **1.8.0**
|
|
135
|
+
- dsh peer [0.1.7 ... 0.2.0]
|
|
136
|
+
- npm publish
|
|
137
|
+
- **1.8.0-alpha.4**
|
|
138
|
+
- 💥移除 stderr log 输出
|
|
139
|
+
- 💪新增不同 profiles 场景下 log文件 *详情见 [DEVELOPMENT.md](./DEVELOPMENT.md#日志落盘)*
|
|
140
|
+
- **1.8.0-alpha.2**
|
|
141
|
+
- 🐛修复多会话并发导致写侧串台 @sunligh91
|
|
142
|
+
- 🐛删除会话分桶后遗留的三个全局状态死字段
|
|
143
|
+
- 🐛修复plan 模式禁写记忆串台导致其他会话也禁写记忆
|
|
144
|
+
- **1.8.0-alpha.1**
|
|
145
|
+
- 💥移除插件模式与智能模式,记忆写入统一为混合模式
|
|
146
|
+
- 💥配置项 memoryMode / autoCaptureErrors / dailyLogRetentionDays 删除(旧值静默失效)
|
|
147
|
+
- 💥移除记忆写入总开关
|
|
148
|
+
- 🐛memory文件格式错误时读取漂移的问题
|
|
149
|
+
- 💪适配deepseek harness 0.1.7-rc.2
|
|
150
|
+
- 💪适配deepseek harness desktop
|
|
151
|
+
- **v1.7.2-legacy** — dsh-memory-palace 从 v1.0.0 的基础记忆读写(防闲聊闸门、公民指令、删除工具)起步,逐步演进到 v1.7.2 的「混合模式 + 独立通道注入 + 自定义指令 + 记忆子 agent 蒸馏」,全程主线是不断增强记忆生成/注入方式,同时持续修复模式互串、工具串台、缓存堆积等稳定性缺陷。历史,见 [CHANGELOG.md](./CHANGELOG.md)
|
|
152
|
+
- **outdated(0.x)** — 双层 Markdown 记忆读写 / 设置页集成等 0.x 历史,见 [CHANGELOG.md](./CHANGELOG.md)
|
|
153
|
+
|
|
154
|
+
## 参考与致谢
|
|
155
|
+
|
|
156
|
+
本插件开发深度参考了以下两个开源项目(本包实现为各自机制的简化落地,不含其完整功能):
|
|
157
|
+
|
|
158
|
+
- **[dsh-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar)**
|
|
159
|
+
- **[dsh-sideband](https://github.com/ishuowang/dsh-sideband)**
|
|
160
|
+
|
|
161
|
+
## License
|
|
162
|
+
|
|
163
|
+
[MIT](./LICENSE)
|
package/lib/api.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// memory-palace 自有同源 route(/memory-palace/api
|
|
2
|
-
// 经 registerApi 注入 ctx/paths
|
|
3
|
-
//
|
|
1
|
+
// memory-palace 自有同源 route(/memory-palace/api):设置读写(真保存)。
|
|
2
|
+
// 经 registerApi 注入 ctx/paths/设置面;在 index.mjs 装配时调用一次。
|
|
3
|
+
// 机制:client 直接 fetch 本 route,handler 内走服务端 settings.replace → settings-file 持久化,
|
|
4
4
|
// 绕开 settingsScope(非 loopback 下 set() no-op)与 apiproxy allowlist 两层限制(参考 dsh-better-sidebar)。
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
// distill.project / distill.project.preview 两个 action 已随「蒸馏项目记忆」功能移除,
|
|
6
|
+
// 本 route 现仅剩设置读写(settings.get / settings.update)。
|
|
7
7
|
const API_MAX_BODY_BYTES = 1 << 20;
|
|
8
8
|
|
|
9
9
|
function apiHeader(headers, name) {
|
|
@@ -99,7 +99,7 @@ function apiWriteError(res, error) {
|
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
//
|
|
102
|
+
// 联动纯函数(可单测):distillDebugLog=true 时保证 distillLogLevel 存在(默认 info),
|
|
103
103
|
// false 时移除 distillLogLevel。distillLogLevel 是平铺键(不进 UI),由 settings.update 在此兜底。
|
|
104
104
|
export function applyDebugLogLinkage(section) {
|
|
105
105
|
if (section && typeof section === "object" && !Array.isArray(section)) {
|
|
@@ -113,9 +113,9 @@ export function applyDebugLogLinkage(section) {
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
/**
|
|
116
|
-
* @param {{ ctx: object,
|
|
116
|
+
* @param {{ ctx: object, getSettingsFace: () => object | null }} deps
|
|
117
117
|
*/
|
|
118
|
-
export function registerApi({ ctx,
|
|
118
|
+
export function registerApi({ ctx, getSettingsFace }) {
|
|
119
119
|
ctx.effect(
|
|
120
120
|
() =>
|
|
121
121
|
ctx.webServer.register({
|
|
@@ -149,7 +149,7 @@ export function registerApi({ ctx, paths, distill, getSettingsFace }) {
|
|
|
149
149
|
if (section === null || typeof section !== "object" || Array.isArray(section)) {
|
|
150
150
|
throw Object.assign(new Error("section must be a plain object"), { code: "bad-request", status: 400 });
|
|
151
151
|
}
|
|
152
|
-
//
|
|
152
|
+
// 联动:distillDebugLog=true 时保证 distillLogLevel 存在(默认 info,保证
|
|
153
153
|
// 服务端日志开启即输出元数据诊断);false 时移除 distillLogLevel(防止残留 debug
|
|
154
154
|
// 级别持续打印 LLM 原始响应文本)。distillLogLevel 是平铺键(不进 UI),在此统一兜底。
|
|
155
155
|
applyDebugLogLinkage(section);
|
|
@@ -160,47 +160,6 @@ export function registerApi({ ctx, paths, distill, getSettingsFace }) {
|
|
|
160
160
|
apiWriteOk(res, await face.replace(section, expectedRevision));
|
|
161
161
|
return;
|
|
162
162
|
}
|
|
163
|
-
// ---- v1.2.0 手动蒸馏(会话标题栏「记忆」按钮)----
|
|
164
|
-
if (method === "distill.session" || method === "distill.project" || method === "distill.project.preview") {
|
|
165
|
-
const sid = typeof payload?.sessionId === "string" ? payload.sessionId : "";
|
|
166
|
-
// sessions 服务不在顶层 inject(测试环境无此服务时插件仍应激活),route 内惰性解析。
|
|
167
|
-
let session = null;
|
|
168
|
-
try {
|
|
169
|
-
const store = ctx.get("sessions");
|
|
170
|
-
session = store && typeof store.get === "function" ? store.get(sid) : null;
|
|
171
|
-
} catch {
|
|
172
|
-
session = null;
|
|
173
|
-
}
|
|
174
|
-
if (!session) {
|
|
175
|
-
throw Object.assign(new Error(`session not found: ${sid || "(empty)"}`), { code: "not-found", status: 404 });
|
|
176
|
-
}
|
|
177
|
-
const cwd = session.header?.cwd ?? null;
|
|
178
|
-
if (!cwd) {
|
|
179
|
-
throw Object.assign(new Error("session has no cwd"), { code: "bad-request", status: 400 });
|
|
180
|
-
}
|
|
181
|
-
if (method === "distill.session") {
|
|
182
|
-
const dirs = paths.writeDirs(cwd);
|
|
183
|
-
if (!dirs.length) {
|
|
184
|
-
throw Object.assign(new Error("no memory dirs for this workspace"), { code: "bad-request", status: 400 });
|
|
185
|
-
}
|
|
186
|
-
// 整段会话全量蒸馏(fromSeq=0);allowDelete:true —— 手动按钮开放 delete 操作。
|
|
187
|
-
const r = await distill.distillSessionCore(session, dirs, 0, { allowDelete: true });
|
|
188
|
-
apiWriteOk(res, r);
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
if (method === "distill.project.preview") {
|
|
192
|
-
const dirs = paths.writeDirs(cwd);
|
|
193
|
-
if (!dirs.length) {
|
|
194
|
-
throw Object.assign(new Error("no memory dirs for this workspace"), { code: "bad-request", status: 400 });
|
|
195
|
-
}
|
|
196
|
-
const memFile = paths.memoryFileOf(dirs[0], cwd);
|
|
197
|
-
apiWriteOk(res, { size: readMdSync(memFile).length });
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
// distill.project
|
|
201
|
-
apiWriteOk(res, await distill.distillProjectMemory(cwd, session));
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
163
|
apiWriteError(res, Object.assign(new Error(`unknown memory-palace API method "${method}"`), { code: "not-found", status: 404 }));
|
|
205
164
|
} catch (error) {
|
|
206
165
|
apiWriteError(res, error);
|