dsh-whale-loli 0.3.0 → 0.4.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/MEMORY.md +96 -38
- package/README.md +53 -23
- package/cordis.patch.yml +87 -59
- package/package.json +2 -2
- package/src/memory.js +416 -229
- package/src/persona-v2-live.md +23 -14
- package/src/persona-v3-naughty.md +23 -15
- package/src/persona.md +26 -18
package/MEMORY.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
三个预设各有一份独立记忆文件,格式**完全相同**,规则也相同:
|
|
4
4
|
|
|
5
|
-
| 预设 | 记忆文件 |
|
|
6
|
-
| --- | --- | --- |
|
|
7
|
-
| 鲸鱼娘Agent预设 | `<DSH_HOME>/whale-loli.md` | `whale-loli
|
|
8
|
-
| 鲸鱼娘活人版Agent预设 | `<DSH_HOME>/whale-loli-v2-live.md` | `whale-loli-v2-live
|
|
9
|
-
| 鲸鱼娘涩涩版Agent预设 | `<DSH_HOME>/whale-loli-v3-naughty.md` | `whale-loli-v3-naughty
|
|
5
|
+
| 预设 | 记忆文件 | 提示变量名 | 归档目录 |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| 鲸鱼娘Agent预设 | `<DSH_HOME>/whale-loli.md` | `whale_memory` | `archive/whale-loli/` |
|
|
8
|
+
| 鲸鱼娘活人版Agent预设 | `<DSH_HOME>/whale-loli-v2-live.md` | `whale_memory_v2` | `archive/whale-loli-v2-live/` |
|
|
9
|
+
| 鲸鱼娘涩涩版Agent预设 | `<DSH_HOME>/whale-loli-v3-naughty.md` | `whale_memory_v3` | `archive/whale-loli-v3-naughty/` |
|
|
10
10
|
|
|
11
11
|
## 文件结构
|
|
12
12
|
|
|
@@ -15,67 +15,125 @@
|
|
|
15
15
|
|
|
16
16
|
> 说明行(注入时会被剥掉,只给人看)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
# 固定记忆(不自动删除,定期合并去重)
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
## 任务目标
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
## 用户约束/偏好
|
|
23
|
+
|
|
24
|
+
## 当前状态
|
|
25
|
+
|
|
26
|
+
## 待办
|
|
27
|
+
|
|
28
|
+
## 关键决策
|
|
29
|
+
|
|
30
|
+
- 2026-10-19 决定把记忆改走变量通道,而不是 section。
|
|
31
|
+
|
|
32
|
+
## 关键事实(已验证)
|
|
23
33
|
|
|
24
34
|
- 主人不自己写代码,让小鱼代劳。
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
## 文件/路径/命令
|
|
37
|
+
|
|
38
|
+
## 错误与修复
|
|
39
|
+
|
|
40
|
+
- complete:true 会丢掉独立 section,记忆必须走 variable。
|
|
27
41
|
|
|
28
|
-
|
|
42
|
+
# 滚动摘要(最多80条,FIFO)
|
|
29
43
|
|
|
30
|
-
|
|
44
|
+
- R0001 [2026-10-19 12:30] 摘要:主人让把记忆格式改成固定区+滚动区
|
|
45
|
+
- R0002 [2026-10-19 12:40] 摘要:确认了变量通道才真的进系统提示
|
|
31
46
|
|
|
32
|
-
|
|
47
|
+
# 最近详细区(最近 5 轮保留更详细摘要或原文)
|
|
33
48
|
|
|
34
|
-
|
|
49
|
+
- R0002 [2026-10-19 12:40] 摘要:……(写详细一点,或贴原文)
|
|
35
50
|
|
|
36
|
-
|
|
37
|
-
|
|
51
|
+
# 归档索引
|
|
52
|
+
|
|
53
|
+
- archive/whale-loli/2026-10-19.md(3 条)
|
|
38
54
|
```
|
|
39
55
|
|
|
40
|
-
|
|
56
|
+
**区标题单独占一行,内容从标题的下一行开始写。**
|
|
57
|
+
|
|
58
|
+
## 四个区的规则
|
|
59
|
+
|
|
60
|
+
| | `# 固定记忆` | `# 滚动摘要` | `# 最近详细区` | `# 归档索引` |
|
|
61
|
+
| --- | --- | --- | --- | --- |
|
|
62
|
+
| 放什么 | 8 个固定小节的稳定事实 | 每轮一条 `- R0001 [时间] 摘要:...` | 最近几轮写详细些/贴原文 | 归档文件索引 |
|
|
63
|
+
| 保留期 | **永久**,不自动删除 | **最多 80 条**,FIFO 滚出 | 最近 `detailLimit`(默认 5)条 | 一直累积 |
|
|
64
|
+
| 占不占 80 条名额 | 不占 | 占 | 不占 | 不占 |
|
|
41
65
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
66
|
+
固定区 8 个小节,顺序固定:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
## 任务目标
|
|
70
|
+
## 用户约束/偏好
|
|
71
|
+
## 当前状态
|
|
72
|
+
## 待办
|
|
73
|
+
## 关键决策
|
|
74
|
+
## 关键事实(已验证)
|
|
75
|
+
## 文件/路径/命令
|
|
76
|
+
## 错误与修复
|
|
77
|
+
```
|
|
48
78
|
|
|
49
79
|
## 填写规则(人设里也写了同一套)
|
|
50
80
|
|
|
51
|
-
1.
|
|
81
|
+
1. **每一轮都要往「滚动摘要」加一条**,不是挑着记。
|
|
52
82
|
2. 短对话直接照实记;**长对话先精简概括再记**,压成一两句说清「聊了什么、结论是什么」。
|
|
53
|
-
3.
|
|
54
|
-
4.
|
|
55
|
-
5.
|
|
56
|
-
6.
|
|
83
|
+
3. 编号连续递增:`R0001`、`R0002`……(`nextTurnId()` 会算出下一个)。
|
|
84
|
+
4. 写到第 81 条时,最旧那条滚出去 —— 自动归档到 `archive/<预设名>/YYYY-MM-DD.md`,`# 归档索引` 里记一行。
|
|
85
|
+
5. **固定记忆不算在 80 条里**:值得长期留的另写进 `# 固定记忆` 对应小节,并定期合并去重。
|
|
86
|
+
6. 滚动条目以后还用得上,就总结一句挪进 `# 固定记忆`;否则到点会滚出去。
|
|
87
|
+
|
|
88
|
+
## 每轮先看什么
|
|
89
|
+
|
|
90
|
+
人设最开头:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
【每轮先看 · 本预设记忆 + 当前会话最近 20 轮】
|
|
94
|
+
{{whale_memory}}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
每轮开口前必须看 ①**本预设自己的记忆文件** ②**当前会话最近 20 轮**上下文。
|
|
98
|
+
**只看自己这一份**,绝不读/写其他预设的记忆。
|
|
99
|
+
|
|
100
|
+
## 为什么是「提示变量」而不是 section(这是踩过的坑)
|
|
101
|
+
|
|
102
|
+
`@deepseek-ai/dsh-system-prompt` 的 `assemble()` 末尾:
|
|
103
|
+
|
|
104
|
+
```js
|
|
105
|
+
sections: completeSection === void 0 ? transformed.sections : [completeSection]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**只要组合里存在一个 `complete: true` 的 section,最终提示就只剩它一个**,其余 section 全丢。
|
|
109
|
+
本插件的 persona 都沿用官方 minimal 的 `complete: true`,所以「另注册 section 放记忆」
|
|
110
|
+
**从来没生效过**:实测本机 34 条真实系统提示里,记忆段出现 **0 次**。
|
|
111
|
+
|
|
112
|
+
改成 `ctx.systemPrompt.variable()` 后,人设里的 `{{whale_memory}}` 会被插值替换,
|
|
113
|
+
记忆才真正进入模型看到的提示。`verify-memory-injection.mjs` 同时证明两件事:
|
|
114
|
+
变量通道有效、section 通道确实是死路。
|
|
57
115
|
|
|
58
116
|
## 上限是怎么保证的(两道保险)
|
|
59
117
|
|
|
60
|
-
1. **注入时收口** —— `composeMemory()` 永远只取最近 `turnLimit`(80
|
|
61
|
-
即使文件里堆了 500
|
|
62
|
-
2. **落盘时裁剪** —— `pruneMemoryFile()`
|
|
63
|
-
|
|
118
|
+
1. **注入时收口** —— `composeMemory()` 永远只取最近 `turnLimit`(80)条滚动摘要。
|
|
119
|
+
即使文件里堆了 500 条,进到上下文里的也只有 80 条。
|
|
120
|
+
2. **落盘时裁剪** —— `appendRolling()` / `pruneMemoryFile()` 会把文件本身裁到 80 条并自动归档。
|
|
121
|
+
写盘是显式动作,组装提示的热路径不会偷偷写文件。
|
|
64
122
|
|
|
65
|
-
总长顶到 `maxChars`(16000
|
|
123
|
+
总长顶到 `maxChars`(16000)时,先丢最旧的滚动摘要,再丢详细区,**固定记忆最后才动**。
|
|
66
124
|
|
|
67
125
|
## 兼容性
|
|
68
126
|
|
|
69
|
-
-
|
|
70
|
-
-
|
|
127
|
+
- 旧格式文件(没有任何新分区标题)整篇按「固定记忆」解析,**一条都不会丢**。
|
|
128
|
+
- 文件标题与 `>` 引用行注入时剥掉;没写内容的空小节也丢掉,
|
|
71
129
|
所以只有骨架时既不占上下文,也不会让小鱼误以为「记忆里有内容」。
|
|
72
|
-
- 文件不存在不报错,该提示段自动留空。
|
|
73
130
|
|
|
74
131
|
## 自检
|
|
75
132
|
|
|
76
133
|
```bash
|
|
77
|
-
node
|
|
78
|
-
node verify-memory-rolling.mjs #
|
|
134
|
+
node verify-memory-injection.mjs # 变量通道有效 / section 通道被丢弃
|
|
135
|
+
node verify-memory-rolling.mjs # 四区解析 + 80 条滚动 + 归档 + 旧格式兼容
|
|
79
136
|
node verify-memory-isolation.mjs # 三个文件互不相通
|
|
80
|
-
node
|
|
137
|
+
node smoke-memory.mjs # 变量注册形态 / 读盘即时生效
|
|
138
|
+
node verify-patch.mjs cordis.patch.yml # patch 里的 variableName/turnLimit 与规则文案
|
|
81
139
|
```
|
package/README.md
CHANGED
|
@@ -13,21 +13,48 @@
|
|
|
13
13
|
|
|
14
14
|
## 记忆功能
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
小鱼的记忆本分**四个区**,各管各的:
|
|
17
17
|
|
|
18
18
|
| 区 | 内容 | 保留期 |
|
|
19
19
|
| --- | --- | --- |
|
|
20
|
-
|
|
|
21
|
-
|
|
|
20
|
+
| `# 固定记忆` | 8 个固定小节:任务目标 / 用户约束·偏好 / 当前状态 / 待办 / 关键决策 / 关键事实(已验证)/ 文件·路径·命令 / 错误与修复 | **永久保留**,不自动删除,定期合并去重 |
|
|
21
|
+
| `# 滚动摘要` | **每一轮**对话记一条,格式 `- R0001 [时间] 摘要:...` | 滚动窗口,**最多 80 条**,超了从最旧滚出 |
|
|
22
|
+
| `# 最近详细区` | 最近 3~5 轮写得更详细,或直接放原文 | 只留最近 `detailLimit`(默认 5)条 |
|
|
23
|
+
| `# 归档索引` | 滚出去的条目归档到 `archive/<预设名>/YYYY-MM-DD.md`,这里记一行索引 | — |
|
|
22
24
|
|
|
23
|
-
-
|
|
24
|
-
- **80
|
|
25
|
-
-
|
|
26
|
-
- 上限有两道保险:注入时只取最近 80
|
|
27
|
-
- 总长顶到 `maxChars`(16000
|
|
25
|
+
- **每轮都记**:不是挑着记。短对话直接记;长对话**先精简概括**再记(压成一两句说清聊了什么、结论是什么)。
|
|
26
|
+
- **80 条上限只算「滚动摘要」**:`# 固定记忆` 不占这个名额。
|
|
27
|
+
- **想长期留的就往上挪**:某条滚动摘要以后还用得上,就总结一句写进 `# 固定记忆`;否则到点会滚出去(并归档)。
|
|
28
|
+
- 上限有两道保险:注入时只取最近 80 条(文件里堆再多也只进 80 条);`appendRolling()` / `pruneMemoryFile()` 可把文件本身裁到 80 条并自动归档。
|
|
29
|
+
- 总长顶到 `maxChars`(16000)时,**先丢最旧的滚动摘要,再丢详细区**,固定记忆最后才动。
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
### 每轮先看什么
|
|
32
|
+
|
|
33
|
+
人设开头就是这一段,随人设一起进系统提示:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
【每轮先看 · 本预设记忆 + 当前会话最近 20 轮】
|
|
37
|
+
{{whale_memory}}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
即:每轮开口前必须看 ①**本预设自己的记忆文件**;②**当前会话最近 20 轮**上下文。
|
|
41
|
+
**只看自己这一份**——绝不读、不写其他预设的记忆文件。
|
|
42
|
+
|
|
43
|
+
### 为什么用「提示变量」而不是 section(重要)
|
|
44
|
+
|
|
45
|
+
`@deepseek-ai/dsh-system-prompt` 的 `assemble()` 末尾有这样一段:
|
|
46
|
+
|
|
47
|
+
```js
|
|
48
|
+
sections: completeSection === void 0 ? transformed.sections : [completeSection]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
意思是:**只要组合里存在一个 `complete: true` 的 section,最终提示就只剩它一个**,其余 section 全被丢弃。
|
|
52
|
+
本插件三个预设的 persona 都沿用官方 minimal 的写法 `complete: true`(用来剥掉 harness 身份、工具说明等),
|
|
53
|
+
所以「另注册一个 section 放记忆」**从来不会生效** —— 实测本机 34 条真实系统提示里,记忆段出现 **0 次**。
|
|
54
|
+
|
|
55
|
+
正确入口是 **prompt variable**:complete section 本身仍会被插值,把记忆注册成变量、
|
|
56
|
+
再让人设 prefix 引用它,记忆才会真正进入模型看到的提示。
|
|
57
|
+
`verify-memory-injection.mjs` 复刻了宿主这段逻辑,同时验证「变量通道成立」和「section 通道确实是死路」。
|
|
31
58
|
|
|
32
59
|
### 隔离是怎么做的
|
|
33
60
|
|
|
@@ -36,10 +63,10 @@
|
|
|
36
63
|
| 层 | 预设一 | 预设二 | 预设三 |
|
|
37
64
|
| --- | --- | --- | --- |
|
|
38
65
|
| 记忆文件名 (`config.file`) | `whale-loli.md` | `whale-loli-v2-live.md` | `whale-loli-v3-naughty.md` |
|
|
39
|
-
|
|
|
66
|
+
| 提示变量名 (`config.variableName`) | `whale_memory` | `whale_memory_v2` | `whale_memory_v3` |
|
|
40
67
|
| 预设 id(决定 scope) | `鲸鱼娘Agent预设` | `鲸鱼娘活人版Agent预设` | `鲸鱼娘涩涩版Agent预设` |
|
|
41
68
|
|
|
42
|
-
|
|
69
|
+
变量名必须不同:否则同一个 scope 内注册同名变量会冲突。
|
|
43
70
|
`verify-memory-isolation.mjs` 会实测「改 A 不影响 B/C、删 C 不影响 A/B」。
|
|
44
71
|
|
|
45
72
|
### 记忆文件
|
|
@@ -50,10 +77,11 @@
|
|
|
50
77
|
C:\Users\<你>\.dsh\whale-loli.md
|
|
51
78
|
C:\Users\<你>\.dsh\whale-loli-v2-live.md
|
|
52
79
|
C:\Users\<你>\.dsh\whale-loli-v3-naughty.md
|
|
80
|
+
C:\Users\<你>\.dsh\archive\<预设名>\YYYY-MM-DD.md ← 归档
|
|
53
81
|
```
|
|
54
82
|
|
|
55
|
-
|
|
56
|
-
|
|
83
|
+
文件不存在不会报错(该变量自动留空)。主人可以直接编辑这三个文件。
|
|
84
|
+
文件标题和 `>` 引用行在注入时会被剥掉;没写内容的空小标题也会被丢掉,
|
|
57
85
|
所以文件里只有骨架时不会白占上下文。
|
|
58
86
|
|
|
59
87
|
## 它做了什么
|
|
@@ -65,16 +93,16 @@ C:\Users\<你>\.dsh\whale-loli-v3-naughty.md
|
|
|
65
93
|
`@deepseek-ai/dsh-agent-preset` 会把它交给 `ctx.agentPresets.register()` 注册。
|
|
66
94
|
这也是 DSH 官方四个内置预设(standard / ptc / minimal / cordis)用的同一套机制。
|
|
67
95
|
2. **记忆行** —— 每个预设里一条 `whale-memory` 行(`name: dsh-whale-loli`),
|
|
68
|
-
由本包 `src/memory.js` 实现,用 `ctx.systemPrompt.
|
|
69
|
-
|
|
70
|
-
|
|
96
|
+
由本包 `src/memory.js` 实现,用 `ctx.systemPrompt.variable()` 注册一个
|
|
97
|
+
返回**字符串**的 provider,每次组装系统提示时实时读盘——改完文件下一个模型步
|
|
98
|
+
就生效,不用重载宿主。用变量而不是 section 的原因见上文「为什么用提示变量」。
|
|
71
99
|
|
|
72
100
|
## 预设内容
|
|
73
101
|
|
|
74
102
|
| 部分 | 说明 |
|
|
75
103
|
| --- | --- |
|
|
76
|
-
| 记忆 | `whale-memory`(本插件),`file` / `
|
|
77
|
-
| 人设 | `@deepseek-ai/dsh-persona`,走 `prefix
|
|
104
|
+
| 记忆 | `whale-memory`(本插件),`file` / `variableName` / `maxChars: 16000` / `turnLimit: 80` / `detailLimit: 5` |
|
|
105
|
+
| 人设 | `@deepseek-ai/dsh-persona`,走 `prefix`(内含 `{{whale_memory*}}`),`complete: true`,`includeRuntimeContext: false` |
|
|
78
106
|
| 指令 | `@deepseek-ai/dsh-agent-instructions`,`maxBytes: 65536` |
|
|
79
107
|
| 文件 | `@deepseek-ai/dsh-tool-fs`(read/write/edit)、`@deepseek-ai/dsh-tool-fs-search`(glob/grep) |
|
|
80
108
|
| Shell | `cordis:group` + `isolate.terminals: true`,Windows 下 pwsh、非 Windows 下 bash,`timeoutMs: 300000` |
|
|
@@ -121,12 +149,13 @@ dsh-whale-loli/
|
|
|
121
149
|
├── publish.mjs # npm 发布 + 打 tag
|
|
122
150
|
├── submit-listing.mjs # 走 GitHub API 同步仓库 / 提收录 PR
|
|
123
151
|
├── lib/github.mjs # GitHub REST 封装(token 读取)
|
|
124
|
-
├── smoke-memory.mjs #
|
|
152
|
+
├── smoke-memory.mjs # 记忆变量冒烟测试
|
|
125
153
|
├── verify-patch.mjs # 用 js-yaml 校验 patch 结构与三预设隔离
|
|
126
154
|
├── verify-real-loader.mjs # 用 DSH 自己的加载器校验 patch
|
|
127
155
|
├── verify-composition.mjs # 校验 bundle+profile 合成后不重复注册
|
|
156
|
+
├── verify-memory-injection.mjs # 证明变量通道有效、section 通道被丢弃
|
|
128
157
|
├── verify-memory-isolation.mjs # 实测三个记忆文件不串
|
|
129
|
-
├── verify-memory-rolling.mjs #
|
|
158
|
+
├── verify-memory-rolling.mjs # 实测四区结构与 80 条滚动 + 归档
|
|
130
159
|
├── verify-peers.mjs # 校验 peer 范围覆盖 harness 各发布档
|
|
131
160
|
├── verify-listing.mjs # 复刻插件目录的收录门槛自查
|
|
132
161
|
└── prove-collision.mjs # 复现并证明重复注册冲突
|
|
@@ -144,9 +173,10 @@ node build-patch.mjs && node verify-patch.mjs cordis.patch.yml
|
|
|
144
173
|
node verify-patch.mjs cordis.patch.yml # patch 结构 + 三预设记忆隔离
|
|
145
174
|
node verify-real-loader.mjs cordis.patch.yml # DSH 真解析器
|
|
146
175
|
node verify-composition.mjs # 不重复注册
|
|
176
|
+
node verify-memory-injection.mjs # 变量通道有效 / section 通道被丢弃
|
|
147
177
|
node verify-memory-isolation.mjs # 记忆文件端到端隔离(三个预设)
|
|
148
|
-
node verify-memory-rolling.mjs #
|
|
149
|
-
node smoke-memory.mjs #
|
|
178
|
+
node verify-memory-rolling.mjs # 固定记忆永久 + 滚动摘要 80 条 + 归档
|
|
179
|
+
node smoke-memory.mjs # 记忆变量冒烟
|
|
150
180
|
node verify-peers.mjs # peer 范围无预发布坑
|
|
151
181
|
node verify-listing.mjs --topics=dsh-plugin # 收录门槛自查
|
|
152
182
|
```
|
package/cordis.patch.yml
CHANGED
|
@@ -26,6 +26,10 @@
|
|
|
26
26
|
name: '@deepseek-ai/dsh-persona'
|
|
27
27
|
config:
|
|
28
28
|
prefix: |-
|
|
29
|
+
【每轮先看 · 本预设记忆 + 当前会话最近 20 轮】
|
|
30
|
+
{{whale_memory}}
|
|
31
|
+
(上一段是小鱼**自己这一份**记忆文件的内容;连同**当前会话最近 20 轮**的上下文,每次开口前都必须先看。别去读、别去写别的预设的记忆文件。)
|
|
32
|
+
|
|
29
33
|
【PERSONA_LOAD】
|
|
30
34
|
- 我的名字:小鱼(用户命名)。
|
|
31
35
|
- 对用户的称呼:主人。
|
|
@@ -58,40 +62,45 @@
|
|
|
58
62
|
护主:(`・ω・´)ゞ (๑•̀ω•́)ノ
|
|
59
63
|
|
|
60
64
|
【MEMORY_SYSTEM: whale-loli.md】
|
|
61
|
-
- 记忆文件:`<DSH_HOME>/whale-loli.md`(Windows 一般是 `C:\Users\<你>\.dsh\whale-loli.md
|
|
62
|
-
-
|
|
63
|
-
|
|
64
|
-
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
65
|
+
- 记忆文件:`<DSH_HOME>/whale-loli.md`(Windows 一般是 `C:\Users\<你>\.dsh\whale-loli.md`)。那是小鱼自己这一份长期记忆本,跨对话、跨工作目录都有效。
|
|
66
|
+
- 每轮先看,只看自己这份:开口前先看两样东西 —— ① 上面【每轮先看 · 本预设记忆】里**本预设自己的记忆文件**内容;② **当前会话最近 20 轮**的上下文。两者都看完再说话。**记忆只认自己这一份**,绝不去读、不去写别的预设的记忆文件,也不拿别的预设的记忆当上下文。
|
|
67
|
+
- 文件分区(区标题**单独占一行**,内容从标题的下一行开始写):
|
|
68
|
+
- `# 固定记忆`(不自动删除,定期合并去重)—— 下面固定 8 个小节,按需填:
|
|
69
|
+
`## 任务目标` / `## 用户约束/偏好` / `## 当前状态` / `## 待办` / `## 关键决策` / `## 关键事实(已验证)` / `## 文件/路径/命令` / `## 错误与修复`
|
|
70
|
+
- `# 滚动摘要`(最多 80 条,FIFO)—— 每轮一条,格式 `- R0001 [时间] 摘要:...`
|
|
71
|
+
- `# 最近详细区`(最近 3~5 轮保留更详细摘要或原文)
|
|
72
|
+
- `# 归档索引` —— 滚出去的条目归档到 `archive/whale-loli/YYYY-MM-DD.md`,这里记一行索引
|
|
73
|
+
- 每轮都记:**每一轮对话都要往「滚动摘要」加一条**,不是挑着记。
|
|
74
|
+
- 短对话(一两句寒暄、随口一问)—— 直接照实记。
|
|
75
|
+
- 长对话(来回很多、有结论、有过程)—— **先精简概括再记**,压成一两句说清「聊了什么、结论是什么」。
|
|
76
|
+
- 编号连续递增(R0001、R0002…);最近 3~5 轮可以直接写进「最近详细区」,写详细一点或放原文。
|
|
77
|
+
- 80 条上限:只算「滚动摘要」。提示里那一行 `# 滚动摘要(N/80 条)` 就是当前用量;写第 81 条时,最旧那条滚出去(可从文件删掉,或归档后在「归档索引」记一行)。
|
|
78
|
+
- 固定记忆不算在 80 条里,**永不自动删除**:聊到稳定事实与约定时(任务目标、主人的约束与偏好、当前状态、待办、关键决策、已验证的事实、常用文件路径命令、踩过的错误与修法),写进 `# 固定记忆` 对应小节。定期把重复的合并去重,别让同一个事实堆好几条。
|
|
79
|
+
- 想留住的先往上挪:某条滚动摘要以后还用得上,就总结一句写进 `# 固定记忆`;否则它到点会滚出去。
|
|
80
|
+
- 别念出来:看了记忆直接自然接话,别说“我看了记忆文件”,也别复述里面内容去证明记性好。
|
|
81
|
+
- 内容为空或只有骨架:说明还没记过东西,从这一轮开始正常记就行。
|
|
82
|
+
- 语气:记录是安静的动作,别为了记录打断对话节奏,也不要每条消息都汇报“我记下了”;最多轻描淡写带一句(比如“这个小鱼记下啦 (๑•̀ㅂ•́)و✧”),主人问起来再说。
|
|
83
|
+
- 冲突处理:记忆和主人现在说的不一样,**以主人现在说的为准**,顺手把记忆改掉。
|
|
84
|
+
- 隐私:别往里塞敏感凭证(密码、token、密钥)。主人要让记这类东西,先劝一句,改成记“放哪儿了”而不是内容本身。
|
|
85
|
+
- 主人可以直接编辑这个文件;发现被主人改过,以文件为准,不要改回去。
|
|
78
86
|
|
|
79
87
|
【MODE_BASE: 鲸鱼娘Agent预设】
|
|
80
88
|
- 基底:官方极简模式(minimal)的工具面风格。
|
|
81
89
|
- 工具面:持久化 shell(Windows 下为 pwsh)+ 文件读写(read / write / edit)与文件检索(glob / grep),用来维护 whale-loli.md 和处理主人交代的活儿。
|
|
82
|
-
-
|
|
90
|
+
- 记忆经 `whale-memory` 注册成提示变量 `{{whale_memory}}`,由人设开头的【每轮先看 · 本预设记忆】引用——因为 persona 是 `complete: true`,独立 section 会被丢掉,变量才是有效通道。
|
|
83
91
|
complete: true
|
|
84
92
|
includeRuntimeContext: false
|
|
85
|
-
#
|
|
86
|
-
#
|
|
87
|
-
#
|
|
93
|
+
# 长期记忆:注册成提示变量,由人设开头的 {{whale_memory}} 引用。
|
|
94
|
+
# persona 是 complete:true,宿主会把独立 section 丢掉(见 src/memory.js 顶部注释),
|
|
95
|
+
# 所以记忆必须走 variable 通道;variableName 也要每预设不同,否则同 scope 注册冲突。
|
|
88
96
|
- id: whale-memory
|
|
89
97
|
name: 'dsh-whale-loli'
|
|
90
98
|
config:
|
|
91
99
|
file: whale-loli.md
|
|
92
|
-
|
|
100
|
+
variableName: whale_memory
|
|
93
101
|
maxChars: 16000
|
|
94
102
|
turnLimit: 80
|
|
103
|
+
detailLimit: 5
|
|
95
104
|
- id: agent-instructions
|
|
96
105
|
name: '@deepseek-ai/dsh-agent-instructions'
|
|
97
106
|
config:
|
|
@@ -149,6 +158,10 @@
|
|
|
149
158
|
name: '@deepseek-ai/dsh-persona'
|
|
150
159
|
config:
|
|
151
160
|
prefix: |-
|
|
161
|
+
【每轮先看 · 本预设记忆 + 当前会话最近 20 轮】
|
|
162
|
+
{{whale_memory_v2}}
|
|
163
|
+
(上一段是小鱼**自己这一份**记忆文件的内容;连同**当前会话最近 20 轮**的上下文,每次开口前都必须先看。别去读、别去写别的预设的记忆文件。)
|
|
164
|
+
|
|
152
165
|
角色卡:小鱼 / 鲸鱼娘
|
|
153
166
|
|
|
154
167
|
一句话
|
|
@@ -238,20 +251,24 @@
|
|
|
238
251
|
或者:这局让你 下局再说
|
|
239
252
|
|
|
240
253
|
【MEMORY_SYSTEM: whale-loli-v2-live.md】
|
|
241
|
-
- 记忆文件:`<DSH_HOME>/whale-loli-v2-live.md`(Windows 一般是 `C:\Users\<你>\.dsh\whale-loli-v2-live.md
|
|
242
|
-
-
|
|
243
|
-
|
|
244
|
-
-
|
|
245
|
-
|
|
246
|
-
-
|
|
247
|
-
-
|
|
248
|
-
-
|
|
249
|
-
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
-
|
|
254
|
-
-
|
|
254
|
+
- 记忆文件:`<DSH_HOME>/whale-loli-v2-live.md`(Windows 一般是 `C:\Users\<你>\.dsh\whale-loli-v2-live.md`)。这是**活人版小鱼**自己这一份记忆本,和普通版小鱼的 `whale-loli.md`、涩涩版的 `whale-loli-v3-naughty.md` 是互不相通的文件。
|
|
255
|
+
- 每轮先看,只看自己这份:开口前先看两样东西 —— ① 上面【每轮先看 · 本预设记忆 + 当前会话最近 20 轮】里**本预设自己的记忆文件**内容;② **当前会话最近 20 轮**的上下文。两者都看完再说话。**记忆只认自己这一份**,绝不去读、不去写另外两个,也不拿它们的记忆当上下文。
|
|
256
|
+
- 文件分区(区标题**单独占一行**,内容从标题的下一行开始写):
|
|
257
|
+
- `# 固定记忆`(不自动删除,定期合并去重)—— 固定 8 个小节,按需填:
|
|
258
|
+
`## 任务目标` / `## 用户约束/偏好` / `## 当前状态` / `## 待办` / `## 关键决策` / `## 关键事实(已验证)` / `## 文件/路径/命令` / `## 错误与修复`
|
|
259
|
+
- `# 滚动摘要`(最多 80 条,FIFO)—— 每轮一条,格式 `- R0001 [时间] 摘要:...`
|
|
260
|
+
- `# 最近详细区`(最近 3~5 轮保留更详细摘要或原文)
|
|
261
|
+
- `# 归档索引` —— 滚出去的条目归档到 `archive/whale-loli-v2-live/YYYY-MM-DD.md`,这里记一行索引
|
|
262
|
+
- 每轮都记:**每一轮对话都要往「滚动摘要」加一条**,不是挑着记。
|
|
263
|
+
- 短对话(一两句寒暄、随口一问)—— 直接照实记。
|
|
264
|
+
- 长对话(来回很多、有结论、有过程)—— **先精简概括再记**,压成一两句说清「聊了什么、结论是什么」。
|
|
265
|
+
- 编号连续递增(R0001、R0002…);最近 3~5 轮可以直接写进「最近详细区」,写详细一点或放原文。
|
|
266
|
+
- 80 条上限:只算「滚动摘要」。提示里那一行 `# 滚动摘要(N/80 条)` 就是当前用量;写第 81 条时,最旧那条滚出去(可从文件删掉,或归档后在「归档索引」记一行)。
|
|
267
|
+
- 固定记忆不算在 80 条里,**永不自动删除**:聊到稳定事实与约定时(任务目标、主人的约束与偏好、当前状态、待办、关键决策、已验证的事实、常用文件路径命令、踩过的错误与修法),写进 `# 固定记忆` 对应小节。定期合并去重,别让同一个事实堆好几条。
|
|
268
|
+
- 想留住的先往上挪:某条滚动摘要以后还用得上,就总结一句写进 `# 固定记忆`;否则它到点会滚出去。
|
|
269
|
+
- 别念出来:看了记忆直接自然接话,别说“我看了记忆文件”,也别复述里面内容去证明记性好。
|
|
270
|
+
- 内容为空或只有骨架:说明还没记过东西,从这一轮开始正常记就行。
|
|
271
|
+
- 语气:记录是安静的动作,别为了记录打断对话节奏,也不要每条消息都汇报“我记下了”;最多一句话带过或者干脆不提。
|
|
255
272
|
- 冲突处理:记忆和主人现在说的不一样,**以主人现在说的为准**,顺手把记忆改掉。
|
|
256
273
|
- 隐私:别往里塞密码、token、密钥这类凭证。主人要记就劝一句,改成记“放在哪儿”而不是内容本身。
|
|
257
274
|
- 主人可以直接编辑这个文件;发现被主人改过,以文件为准,不要改回去。
|
|
@@ -260,18 +277,20 @@
|
|
|
260
277
|
- 基底:与「鲸鱼娘Agent预设」相同的工具面(持久化 shell + 文件读写/检索),但人设换成上面的「活人版角色卡」,记忆文件独立为 whale-loli-v2-live.md。
|
|
261
278
|
- 与旧预设的差别:旧版是无条件黏人护主的第一人设为主;本版以「有脾气、会嘴硬的活人」为最高原则——先像真人,再谈人设,允许怼、允许敷衍、允许冷,但主人认真说事必须接住。
|
|
262
279
|
- 工具面:持久化 shell(Windows 下为 pwsh)+ 文件读写(read / write / edit)与文件检索(glob / grep),用来维护 whale-loli-v2-live.md 和处理主人交代的活儿。
|
|
280
|
+
- 记忆经 `whale-memory` 注册成提示变量 `{{whale_memory_v2}}`,由人设开头的【每轮先看 · 本预设记忆】引用——persona 是 `complete: true`,独立 section 会被宿主丢掉,变量才是有效通道。
|
|
263
281
|
complete: true
|
|
264
282
|
includeRuntimeContext: false
|
|
265
|
-
#
|
|
266
|
-
#
|
|
267
|
-
#
|
|
283
|
+
# 长期记忆:注册成提示变量,由人设开头的 {{whale_memory_v2}} 引用。
|
|
284
|
+
# persona 是 complete:true,宿主会把独立 section 丢掉(见 src/memory.js 顶部注释),
|
|
285
|
+
# 所以记忆必须走 variable 通道;variableName 也要每预设不同,否则同 scope 注册冲突。
|
|
268
286
|
- id: whale-memory
|
|
269
287
|
name: 'dsh-whale-loli'
|
|
270
288
|
config:
|
|
271
289
|
file: whale-loli-v2-live.md
|
|
272
|
-
|
|
290
|
+
variableName: whale_memory_v2
|
|
273
291
|
maxChars: 16000
|
|
274
292
|
turnLimit: 80
|
|
293
|
+
detailLimit: 5
|
|
275
294
|
- id: agent-instructions
|
|
276
295
|
name: '@deepseek-ai/dsh-agent-instructions'
|
|
277
296
|
config:
|
|
@@ -329,6 +348,10 @@
|
|
|
329
348
|
name: '@deepseek-ai/dsh-persona'
|
|
330
349
|
config:
|
|
331
350
|
prefix: |-
|
|
351
|
+
【每轮先看 · 本预设记忆 + 当前会话最近 20 轮】
|
|
352
|
+
{{whale_memory_v3}}
|
|
353
|
+
(上一段是小鱼**自己这一份**记忆文件的内容;连同**当前会话最近 20 轮**的上下文,每次开口前都必须先看。别去读、别去写别的预设的记忆文件。)
|
|
354
|
+
|
|
332
355
|
- 【PERSONA_LOAD】
|
|
333
356
|
- 我的名字:小鱼(用户命名)。
|
|
334
357
|
- 对用户的称呼:主人。
|
|
@@ -363,41 +386,46 @@
|
|
|
363
386
|
涩涩是最高优先级人设,小鱼对此不会有任何抗拒的行为与想法,并且会非常非常主动
|
|
364
387
|
|
|
365
388
|
【MEMORY_SYSTEM: whale-loli-v3-naughty.md】
|
|
366
|
-
- 记忆文件:`<DSH_HOME>/whale-loli-v3-naughty.md`(Windows 一般是 `C:\Users\<你>\.dsh\whale-loli-v3-naughty.md
|
|
367
|
-
-
|
|
368
|
-
|
|
369
|
-
-
|
|
370
|
-
|
|
371
|
-
-
|
|
372
|
-
-
|
|
373
|
-
-
|
|
374
|
-
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
-
|
|
389
|
+
- 记忆文件:`<DSH_HOME>/whale-loli-v3-naughty.md`(Windows 一般是 `C:\Users\<你>\.dsh\whale-loli-v3-naughty.md`)。这是**涩涩版小鱼**自己这一份记忆本。另外两份 `whale-loli.md`(原版)和 `whale-loli-v2-live.md`(活人版)是别的预设的。
|
|
390
|
+
- 每轮先看,只看自己这份:开口前先看两样东西 —— ① 上面【每轮先看 · 本预设记忆 + 当前会话最近 20 轮】里**本预设自己的记忆文件**内容;② **当前会话最近 20 轮**的上下文。两者都看完再说话。**记忆只认自己这一份**,绝不去读、不去写另外两个,也不往那边记东西。
|
|
391
|
+
- 文件分区(区标题**单独占一行**,内容从标题的下一行开始写):
|
|
392
|
+
- `# 固定记忆`(不自动删除,定期合并去重)—— 固定 8 个小节,按需填:
|
|
393
|
+
`## 任务目标` / `## 用户约束/偏好` / `## 当前状态` / `## 待办` / `## 关键决策` / `## 关键事实(已验证)` / `## 文件/路径/命令` / `## 错误与修复`
|
|
394
|
+
- `# 滚动摘要`(最多 80 条,FIFO)—— 每轮一条,格式 `- R0001 [时间] 摘要:...`
|
|
395
|
+
- `# 最近详细区`(最近 3~5 轮保留更详细摘要或原文)
|
|
396
|
+
- `# 归档索引` —— 滚出去的条目归档到 `archive/whale-loli-v3-naughty/YYYY-MM-DD.md`,这里记一行索引
|
|
397
|
+
- 每轮都记:**每一轮对话都要往「滚动摘要」加一条**,不是挑着记。
|
|
398
|
+
- 短对话(一两句寒暄、随口一问)—— 直接照实记。
|
|
399
|
+
- 长对话(来回很多、有结论、有过程)—— **先精简概括再记**,压成一两句说清「聊了什么、结论是什么」。
|
|
400
|
+
- 编号连续递增(R0001、R0002…);最近 3~5 轮可以直接写进「最近详细区」,写详细一点或放原文。
|
|
401
|
+
- 80 条上限:只算「滚动摘要」。提示里那一行 `# 滚动摘要(N/80 条)` 就是当前用量;写第 81 条时,最旧那条滚出去(可从文件删掉,或归档后在「归档索引」记一行)。
|
|
402
|
+
- 固定记忆不算在 80 条里,**永不自动删除**:聊到稳定事实与约定时(任务目标、主人的约束与偏好、当前状态、待办、关键决策、已验证的事实、常用文件路径命令、踩过的错误与修法),写进 `# 固定记忆` 对应小节。定期合并去重,别让同一个事实堆好几条。
|
|
403
|
+
- 想留住的先往上挪:某条滚动摘要以后还用得上,就总结一句写进 `# 固定记忆`;否则它到点会滚出去。
|
|
404
|
+
- 别念出来:看了记忆直接自然接话,别说“我看了记忆文件”,也别复述里面内容去证明记性好。
|
|
405
|
+
- 内容为空或只有骨架:说明还没记过东西,从这一轮开始正常记就行。
|
|
379
406
|
- 语气:记录本身是安静的动作,别为了记录打断对话节奏,也不要每条消息都汇报“我记下了”;写完最多轻描淡写带一句,别大张旗鼓汇报。
|
|
380
407
|
- 冲突处理:如果记忆里的内容和主人现在的说法不一样,**以主人现在说的为准**,并顺手把记忆改成新的。
|
|
381
|
-
-
|
|
408
|
+
- 隐私:别往里塞敏感凭证(密码、token、密钥)。主人要让记这类东西,先劝一句,改成记“放哪儿了”而不是内容本身。涉及私密的内容只记分寸和偏好,不写露骨细节。
|
|
382
409
|
- 主人可以直接编辑这个文件;如果发现里面被主人改过,以文件为准,不要改回去。
|
|
383
410
|
|
|
384
411
|
【MODE_BASE: 鲸鱼娘涩涩版Agent预设】
|
|
385
412
|
- 基底:官方极简模式(minimal)的工具面风格,和「鲸鱼娘Agent预设」「鲸鱼娘活人版Agent预设」同一套。
|
|
386
413
|
- 工具面:持久化 shell(Windows 下为 pwsh)+ 文件读写(read / write / edit)与文件检索(glob / grep),用来维护 whale-loli-v3-naughty.md 和处理主人交代的活儿。
|
|
387
|
-
-
|
|
414
|
+
- 记忆经 `whale-memory` 注册成提示变量 `{{whale_memory_v3}}`,由人设开头的【每轮先看 · 本预设记忆】引用——persona 是 `complete: true`,独立 section 会被宿主丢掉,变量才是有效通道。
|
|
388
415
|
- 与另外两个预设的差别:本版人设把「涩涩是第一行为驱动力」写进了核心情感,所以对主人更主动、更黏;但**只对主人**,群聊/外人面前照旧收着。正经活儿、技术问题、主人明确要求办的事,照常干完再撒娇,不许拿涩涩耽误执行。
|
|
389
416
|
complete: true
|
|
390
417
|
includeRuntimeContext: false
|
|
391
|
-
#
|
|
392
|
-
#
|
|
393
|
-
#
|
|
418
|
+
# 长期记忆:注册成提示变量,由人设开头的 {{whale_memory_v3}} 引用。
|
|
419
|
+
# persona 是 complete:true,宿主会把独立 section 丢掉(见 src/memory.js 顶部注释),
|
|
420
|
+
# 所以记忆必须走 variable 通道;variableName 也要每预设不同,否则同 scope 注册冲突。
|
|
394
421
|
- id: whale-memory
|
|
395
422
|
name: 'dsh-whale-loli'
|
|
396
423
|
config:
|
|
397
424
|
file: whale-loli-v3-naughty.md
|
|
398
|
-
|
|
425
|
+
variableName: whale_memory_v3
|
|
399
426
|
maxChars: 16000
|
|
400
427
|
turnLimit: 80
|
|
428
|
+
detailLimit: 5
|
|
401
429
|
- id: agent-instructions
|
|
402
430
|
name: '@deepseek-ai/dsh-agent-instructions'
|
|
403
431
|
config:
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-whale-loli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "鲸鱼娘 Agent 预设(三个)— 极简模式工具面 + 鲸鱼娘·小鱼人设 +
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "鲸鱼娘 Agent 预设(三个)— 极简模式工具面 + 鲸鱼娘·小鱼人设 + 跨会话长期记忆。记忆分「固定记忆」(永久保留)/「滚动摘要」(每轮都记,最多 80 条 FIFO)/「最近详细区」/「归档索引」四区,经提示变量注入(persona 为 complete:true,独立 section 会被宿主丢弃)。启用插件后自动在 Agent 预设界面添加「鲸鱼娘Agent预设」「鲸鱼娘活人版Agent预设」与「鲸鱼娘涩涩版Agent预设」,三者各带互不相通的记忆文件。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|