@neus117/dsh-anchor 0.6.0 → 0.6.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/CHANGELOG.md +6 -0
- package/README.md +48 -84
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -1,113 +1,77 @@
|
|
|
1
1
|
# dsh-anchor
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
上下文被压缩后,把你自己写的「锚点」重新塞回模型的上下文;三行「下一步」还可以在会话里用表单让人填。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|---|---|---|
|
|
7
|
-
| **注入** | 会话出现 `compaction/end` 后,把锚点原文追加回上下文(`user/message`,`source.kind=runtime-context`) | `inject.enabled` |
|
|
8
|
-
| **表单** | 工具 `anchor_form`:让**人在会话里**填三行(做什么 / 为什么 / 还没验证 / 问我),写回同一份锚点 | `form.enabled` |
|
|
5
|
+
## 它能做什么
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
## 为什么合并
|
|
13
|
-
|
|
14
|
-
两个包各有一份 `writeJudgment`,`$&` 那个写盘 bug 只长在其中一份里(另一份是安全的);两份 `anchorFile`
|
|
15
|
-
配置还可以指向不同文件,于是"人填的"喂不到"压缩后读取的"。合并后:写盘规则、锚点路径解析、三行文案、
|
|
16
|
-
配置都只有一份,**表单和注入在结构上就不可能写到不同文件**。
|
|
17
|
-
|
|
18
|
-
## 配置
|
|
19
|
-
|
|
20
|
-
```yaml
|
|
21
|
-
- id: dsh-anchor
|
|
22
|
-
name: dsh-anchor
|
|
23
|
-
config:
|
|
24
|
-
anchorFile: '' # 留空 = 按会话分文件
|
|
25
|
-
anchorDir: 'D:\Coding\DeepSeek 开发经验\projects\anchors' # <cwd目录名>\<会话短id>-anchor.md
|
|
26
|
-
|
|
27
|
-
createIfMissing: true
|
|
28
|
-
maxChars: 6000
|
|
29
|
-
protectedFiles: []
|
|
30
|
-
traceFile: ''
|
|
31
|
-
inject:
|
|
32
|
-
enabled: true
|
|
33
|
-
onceSession: ''
|
|
34
|
-
onceOnLoad: false
|
|
35
|
-
judge: { enabled: true, mode: model, minIntervalMs: 1800000 }
|
|
36
|
-
form:
|
|
37
|
-
enabled: true
|
|
38
|
-
intro: ''
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
| 字段 | 作用 |
|
|
7
|
+
| 注入 | 表单 |
|
|
42
8
|
|---|---|
|
|
43
|
-
| `
|
|
44
|
-
|
|
|
45
|
-
| `
|
|
46
|
-
| `traceFile` | 填路径就记 apply / 注入 / 提问 / 写入状态;留空完全不写盘。**排查先看它**。 |
|
|
47
|
-
| `inject.*` | 注入半边:`judge.mode=model` 让模型补三行;`ask` 在宿主侧不可用(见下);`onceOnLoad` 是测试通道。 |
|
|
48
|
-
| `form.*` | 表单半边:`intro` 是第一栏开头的说明句,写 `''` 关掉。 |
|
|
9
|
+
| 每次上下文压缩后,自动把锚点文件原文追加回上下文,并声明「这不是用户指令」 | 智能体调 `anchor_form` 时,弹出四个空——**做什么 / 为什么 / 还没验证 / 问我** |
|
|
10
|
+
| 触发:`compaction/end` | 触发:智能体主动调用 |
|
|
11
|
+
| 开关:`inject.enabled` | 开关:`form.enabled` |
|
|
49
12
|
|
|
50
|
-
|
|
13
|
+
压缩能保住事实,保不住判断。判断得由人写——表单就是把「让人写」搬进会话里;写回的文件和压缩后注入的是**同一个**。
|
|
51
14
|
|
|
52
|
-
|
|
53
|
-
2. **可点候选**:取本会话最近两条真实原话、最近两条失败调用做成选项。label 只负责指路
|
|
54
|
-
(`刚才说的第 1 条` / `上一轮报错 1`),原文在说明里,**选中后写进锚点的是完整原文**;
|
|
55
|
-
3. **打回重填**:`做什么` 只写「继续推进」这类通用动词、或 `为什么` 不带判据 → 打回一次,
|
|
56
|
-
卡片上写明打回理由;仍不合格才放行(`why` 追加 `[判据缺失]`);
|
|
57
|
-
4. **初见说明**:第一栏开头说明「压缩后我只看得见这个文件」,`form.intro` 可覆盖。
|
|
15
|
+
## 锚点长什么样
|
|
58
16
|
|
|
59
|
-
|
|
17
|
+
一份普通 Markdown,关键是这三行:
|
|
60
18
|
|
|
61
|
-
|
|
62
|
-
|
|
19
|
+
```markdown
|
|
20
|
+
## 下一步(做什么 + 为什么)
|
|
21
|
+
- 做什么:把 anchor_form 挂进预设并调一次验收
|
|
22
|
+
- 为什么:跑 test\run.mjs 得到 34 passed
|
|
23
|
+
- 还没验证:真实压缩后的注入还没触发过
|
|
24
|
+
```
|
|
63
25
|
|
|
64
|
-
|
|
26
|
+
只改 `## 下一步` 段:有 `[待填]` 空位就原位替换,已有这三行就原位更新,手写锚点则插在标题之后——其它段一个字节不动。
|
|
65
27
|
|
|
66
|
-
|
|
67
|
-
判断段还是空位时,额外指路:**调 `anchor_form` 让用户填,不要自己编**,并点出本文件路径让它核对配置。
|
|
28
|
+
## 安装
|
|
68
29
|
|
|
69
|
-
|
|
30
|
+
```powershell
|
|
31
|
+
npm i @neus117/dsh-anchor
|
|
32
|
+
```
|
|
70
33
|
|
|
71
|
-
|
|
72
|
-
工具执行上下文里的 `exec.agent` 才是唯一入口——所以问人这件事只存在于 `anchor_form` 里。
|
|
34
|
+
挂载一行即可(两个半边可以分别关):
|
|
73
35
|
|
|
74
|
-
|
|
36
|
+
```yaml
|
|
37
|
+
- id: dsh-anchor
|
|
38
|
+
name: '@neus117/dsh-anchor'
|
|
39
|
+
config:
|
|
40
|
+
anchorFile: '' # 留空 = 按会话分文件
|
|
41
|
+
anchorDir: 'D:\Coding\DeepSeek 开发经验\projects\anchors'
|
|
42
|
+
inject: { enabled: true }
|
|
43
|
+
form: { enabled: true }
|
|
44
|
+
```
|
|
75
45
|
|
|
76
|
-
|
|
46
|
+
## 锚点写到哪
|
|
77
47
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
color: var(--dsw-alias-label-tertiary) !important; /* 强制:内置样式会压过普通声明 */
|
|
82
|
-
}
|
|
83
|
-
.wnLwla_card .wnLwla_detail, .wnLwla_detail {
|
|
84
|
-
margin-top: 8px !important; /* 与标题之间再拉开一点;左右沿用内置 24px */
|
|
85
|
-
}
|
|
86
|
-
```
|
|
48
|
+
- `anchorFile` 留空时按会话分:`<anchorDir>\<工作目录名>\<会话短id>-anchor.md`,**任何会话都不会读到别的项目的锚点**。
|
|
49
|
+
- 文件不存在时自动落一份模板骨架(表单第一次用也会落)。
|
|
50
|
+
- 想固定一份共享锚点:把 `anchorFile` 写成那个路径。
|
|
87
51
|
|
|
88
|
-
|
|
52
|
+
## 填的时候
|
|
89
53
|
|
|
90
|
-
-
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
|
|
94
|
-
- 类名带构建期 hash(`wnLwla_`),升级后选择器失效会退回原样;`test/compat.mjs` 每次升级后跑一次。
|
|
95
|
-
- **factory id 必须等于包名 `dsh-anchor`**(2026-11-06 曾因写成别的名字触发 web boot 致命失败)。
|
|
54
|
+
- **可点候选**:本会话最近两条原话、最近两条失败调用做成选项,选中就写入完整原文。
|
|
55
|
+
- **打回重填**:「做什么」只写「继续推进」这类通用动词、或「为什么」不带判据 → 打回一次,卡片上写明理由。
|
|
56
|
+
- **第四栏「问我」**:写的话不写进锚点,原样回到会话,智能体按问题范围翻历史回答。
|
|
57
|
+
- 判断段还空着时,压缩注入里会指路「调 `anchor_form` 让用户填,别自己编」。
|
|
96
58
|
|
|
97
59
|
## 边界
|
|
98
60
|
|
|
61
|
+
- 问人只在**工具执行上下文**里成立;宿主侧拿不到可用的 agent 载体,所以没有"自动弹表单"。
|
|
99
62
|
- `ask` 没有超时:没人回答就一直等,直到会话结束。
|
|
100
|
-
- 一次调用最多 5 张卡(4 栏 + 2 次打回)。
|
|
101
|
-
-
|
|
102
|
-
- 注入只在 `compaction/end` 后发生一次;压缩失败也会发这个事件(验收时别把"失败也注入"当成"压缩成功")。
|
|
63
|
+
- 一次调用最多 5 张卡(4 栏 + 最多 2 次打回)。
|
|
64
|
+
- 压缩失败也会发 `compaction/end`——注入发生了不等于压缩成功了。
|
|
103
65
|
|
|
104
66
|
## 开发
|
|
105
67
|
|
|
106
68
|
```powershell
|
|
107
69
|
$env:ELECTRON_RUN_AS_NODE=1
|
|
108
70
|
$exe = "D:\Coding\DeepSeek Harness\DeepSeek Harness.exe"
|
|
109
|
-
& $exe "
|
|
110
|
-
& $exe "
|
|
111
|
-
& $exe "
|
|
112
|
-
& $exe "
|
|
71
|
+
& $exe "…\dsh-anchor\test\run.mjs" # 表单 / 写盘 / 健壮性
|
|
72
|
+
& $exe "…\dsh-anchor\test\inject.mjs" # 注入 / 判断层 / 指路
|
|
73
|
+
& $exe "…\dsh-anchor\test\client.mjs" # 客户端半边
|
|
74
|
+
& $exe "…\dsh-anchor\test\compat.mjs" # 升级自检:钉死宿主内部标识
|
|
113
75
|
```
|
|
76
|
+
|
|
77
|
+
变更记录见 [CHANGELOG.md](./CHANGELOG.md)。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neus117/dsh-anchor",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Anchor system in one plugin: re-inject your anchor after a context compaction, and let the user fill its three next-step lines from inside the session.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|