dsh-ledger-memory 0.0.0-stage → 0.1.1
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/LICENSE +21 -0
- package/README.md +135 -2
- package/cordis.patch.yml +12 -0
- package/lib/client.js +596 -0
- package/lib/index.js +8750 -0
- package/package.json +59 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 陈黛华
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,136 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-ledger-memory(台账记忆)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> 一个 **DSH(DeepSeek Harness)宿主侧插件**:让 AI 用可复现的方式,把项目里的工作**记住**。
|
|
4
|
+
|
|
5
|
+
它管的不是聊天记录,而是一个**项目自己的记忆载体 —— 台账**:
|
|
6
|
+
可回溯、可追查、只追加、按周归档。围绕它还有活动日志、上下文压缩与跨会话交接。
|
|
7
|
+
|
|
8
|
+
**不预设任何模板** —— 台账的文件名、分几个文件、有哪些字段,全部由 AI 在初始化时
|
|
9
|
+
按项目类型自己决定;插件只做**检测 / 注入 / 回写 / 归档 / Git 配合**这些流程性工作。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 它解决什么问题
|
|
14
|
+
|
|
15
|
+
| 问题 | 它怎么做 |
|
|
16
|
+
|---|---|
|
|
17
|
+
| 换个会话就"忘了这个项目干到哪" | 会话开始把**活跃台账全文**注入上下文;内容没变则不重复注入(防打烂 prompt 缓存) |
|
|
18
|
+
| AI 走完一轮,成果没落地 | 回合末把「完成了什么 / 卡在哪 / 下一步」写回活跃台账 |
|
|
19
|
+
| 台账越来越长,读不完 | 超阈值时把**最旧的已完成条目**移进 `归档目录/YYYY-MM/weekN`,**只追加不删除** |
|
|
20
|
+
| 细节被上下文压缩抹掉 | 压缩**之前**把用户原话、报错原文、改过哪些文件落盘成一份**逐字胶囊**;压缩后与台账一起注回 |
|
|
21
|
+
| 新会话接不上旧会话 | 写一份**交接单**,并把指针推进新会话的**第一轮注入**(不是等你来问) |
|
|
22
|
+
| 想查"谁什么时候改过这份台账" | 台账末尾自动维护一张变更登记;完整历史在只追加的活动日志里 |
|
|
23
|
+
| 只是一次性排查,不是项目 | `ledger_note` 写一份**问题记录**(现象 → 根因 → 结论 → 做了什么),不建台账 |
|
|
24
|
+
|
|
25
|
+
## 三层上下文压缩
|
|
26
|
+
|
|
27
|
+
| 层 | 触发 | 做什么 |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| ① 常态 · 增量 | 水位比上次压缩涨约 **20 点** | 只压**最旧一段**,保留最近约 10 点不动 |
|
|
30
|
+
| ② 兜底 · 全量 | 水位到 **70%**(内核默认是 80%) | 全量压缩,但保留**指向所需内容的指针**:用户原话 / 报错原文 / 改过哪些文件 / 去哪重读 |
|
|
31
|
+
| ③ 终局 · 交接 | 你要换会话时 | 交接单让新对话无缝接上 |
|
|
32
|
+
|
|
33
|
+
围绕这三层有一条铁律:**先记台账,再压缩**。水位提醒发出的那一刻,插件会记住
|
|
34
|
+
「**已经要求它写台账了**」,在它写完之前**不压缩** —— 否则压掉的正是这一轮唯一的那份进展。
|
|
35
|
+
|
|
36
|
+
## 安装
|
|
37
|
+
|
|
38
|
+
需要 **Node.js ≥ 22.19**。
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# 走 npm
|
|
42
|
+
npm install dsh-ledger-memory
|
|
43
|
+
|
|
44
|
+
# 或走 DSH 自己的插件命令
|
|
45
|
+
dsh plugin add dsh-ledger-memory
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
装完**重启客户端**才生效 —— 内核对已加载的插件不会因文件改动自动重载。
|
|
49
|
+
|
|
50
|
+
## 用法
|
|
51
|
+
|
|
52
|
+
不用配置什么。打开一个项目目录开始工作,插件会:
|
|
53
|
+
|
|
54
|
+
1. 发现这里**还没有台账** ⇒ 注入一句提示,让 AI **来问你**要不要初始化(它不会自己动手);
|
|
55
|
+
2. 你同意后,AI 按这个项目的类型**设计一套台账结构**并登记;
|
|
56
|
+
3. 之后每个会话自动加载、每轮结束自动回写、超长自动归档。
|
|
57
|
+
|
|
58
|
+
### 手动命令
|
|
59
|
+
|
|
60
|
+
在对话里敲 `/ledger`(不带参数会弹一张可点的卡片),或用子命令:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
/ledger status 看状态(有没有台账、用的哪个文件、几行、Git、日志开关)
|
|
64
|
+
/ledger show 把当前活跃台账全文打出来
|
|
65
|
+
/ledger init 初始化台账(由 AI 为这个项目设计一套结构)
|
|
66
|
+
/ledger update 让 AI 把本次会话的进展写回台账
|
|
67
|
+
/ledger archive 把最旧的已完成条目移进归档目录
|
|
68
|
+
/ledger compact 立刻做一次全量压缩(保留指针)
|
|
69
|
+
/ledger light 轻量压缩
|
|
70
|
+
/ledger log 查活动日志
|
|
71
|
+
/ledger handoff 写一份交接单
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 设置面板
|
|
75
|
+
|
|
76
|
+
**设置 → 项目台账(台账 / 压缩 / 日志)**,可调十二项:回合末卡片开关、高保真压缩水位、
|
|
77
|
+
增量压缩的涨幅与保留量、活动日志五档开关、活跃台账行数上限、变更登记条数、水位提醒档位等。
|
|
78
|
+
|
|
79
|
+
> 一条要知道的语义:`maxActiveLines` / `changeRegisterMax` / `logLevels` **以每个项目
|
|
80
|
+
> 自己清单里的值为准**(日志是只追加的证据,全局设置改不动它)。
|
|
81
|
+
> 面板里这三项是**新项目初始化时写进去的默认值**。
|
|
82
|
+
|
|
83
|
+
## 十二个工具
|
|
84
|
+
|
|
85
|
+
AI 在对话里调用,你也可以让它调用:
|
|
86
|
+
|
|
87
|
+
| 工具 | 作用 |
|
|
88
|
+
|---|---|
|
|
89
|
+
| `ledger_status` | 报告这个项目的台账状态(只读) |
|
|
90
|
+
| `ledger_read` | 读台账 / 决策记录 / 归档 |
|
|
91
|
+
| `ledger_write` | 写活跃台账或决策记录 |
|
|
92
|
+
| `ledger_init` | 登记台账结构(四条硬约束:一个活跃台账 / 一份独立决策记录 / 一个只追加归档目录 / 行数上限) |
|
|
93
|
+
| `ledger_archive` | 把旧条目移进只追加的归档 |
|
|
94
|
+
| `ledger_conform` | 检查一个既有项目的台账是否符合预期,能修的**只做加法** |
|
|
95
|
+
| `ledger_note` | 写一份**问题记录**(非项目场景,有终点的那种) |
|
|
96
|
+
| `ledger_log` | 查活动日志(五档,**从不注入上下文**) |
|
|
97
|
+
| `ledger_log_write` | 追加一条回合小结 |
|
|
98
|
+
| `ledger_handoff` | 写交接单,供下一个会话接手 |
|
|
99
|
+
| `ledger_compact` | 请求一次高保真压缩 |
|
|
100
|
+
| `ledger_checkpoint` | 把这一刻的选择交给用户(记台账 / 记+压缩 / 记+交接 / 跳过) |
|
|
101
|
+
|
|
102
|
+
## 活动日志(五档)
|
|
103
|
+
|
|
104
|
+
挂在你为项目登记的日志目录下,**只追加、永不改写**,且**从不注入上下文**(按需查):
|
|
105
|
+
|
|
106
|
+
| 档 | 内容 |
|
|
107
|
+
|---|---|
|
|
108
|
+
| L0 | 台账变更的里程碑 |
|
|
109
|
+
| L1 | 回合小结(带会话编号) |
|
|
110
|
+
| L2 | 文件流向 |
|
|
111
|
+
| L3 | 工具调用流水(默认关) |
|
|
112
|
+
| L4 | **逐字存档你说过的每一句话**(带会话编号与时间) |
|
|
113
|
+
|
|
114
|
+
> 采集类档位只认**会话的工作目录**,不会去猜子项目。
|
|
115
|
+
> 在一个装着多个项目的目录里开会话时,采集类档位写不出东西 —— 这是刻意的。
|
|
116
|
+
|
|
117
|
+
## 依赖与许可
|
|
118
|
+
|
|
119
|
+
- **零运行时依赖**(`dependencies` 为空)
|
|
120
|
+
- 唯一 peer 依赖:`@deepseek-ai/cordis`
|
|
121
|
+
- 许可:**MIT**
|
|
122
|
+
|
|
123
|
+
## 自检
|
|
124
|
+
|
|
125
|
+
仓库里带一套离线自检,不需要网络、不需要装 DSH:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npm test
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 已知边界
|
|
132
|
+
|
|
133
|
+
- 注入走 `agent/pre-step`(可替换本轮消息),不是 `systemPrompt.context`。
|
|
134
|
+
- 改代码后**必须重启客户端**,内核对已加载插件不会热重载。
|
|
135
|
+
- 采集类日志档位在"容器工作区"(装着多个项目的目录)里写不出东西。
|
|
136
|
+
- 压缩服务只能经 `agentPresets.serviceFor(agent, "compaction")` 取到,`ctx.get("compaction")` 恒为 `undefined`。
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# dsh-ledger-memory —— 项目台账自动管理
|
|
2
|
+
#
|
|
3
|
+
# 这个文件是「profile bundle patch」:内核组合 profile 时会把它插进插件树。
|
|
4
|
+
# ★ 两条实测教训(改动前必读):
|
|
5
|
+
# 1. package.json 里必须同时有 dsh.bundle.patch 和(如果带浏览器半边)dsh.client,
|
|
6
|
+
# 只写 dsh.client 会让内核直接失败:
|
|
7
|
+
# profile bundle "..." declares no dsh.bundle in its package.json
|
|
8
|
+
# 2. id 一律用包名,别自创短名。
|
|
9
|
+
|
|
10
|
+
- insert:
|
|
11
|
+
- id: dsh-ledger-memory
|
|
12
|
+
name: dsh-ledger-memory
|