@a9i5k4/dsh-auto-memory 2.4.1 → 2.4.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/docs/internal/NEXT-VERSION-TODO.md +67 -0
- package/docs/internal/RELEASE-PROCESS.md +83 -0
- package/lib/client.js +8 -1
- package/lib/index.js +6 -2
- package/package.json +1 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 下一版待改(用户 2026-09-10 19:0x 指定)
|
|
2
|
+
|
|
3
|
+
> 来源:用户实机观察 —— 「自动接续又触发了,而且确实才刚过半,太浪费;你现在依靠那个 max output 来算,但官方压缩也是等到上下文真正占到 80% 才开始;新窗口依旧没有按正确序号排序。接续流程我已经关掉了,只要记着下一版怎么改就行。」
|
|
4
|
+
> 状态:**已记录,未开工**(当前 v2.4.1;用户已手动关闭自动接续以免浪费 token)。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 改点 1 · 水位判据口径:不要把「预留输出」当成分母
|
|
9
|
+
|
|
10
|
+
### 现状(取证到行)
|
|
11
|
+
| 位置 | 事实 |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| `lib/index.js:1884-1886` | `win = sessModel.contextWindow`(官方声明窗口,本机 deepseek-flash = 1,048,576) |
|
|
14
|
+
| `lib/index.js:1899` | `reserve = sessModel.maxTokens`(该路由预留输出,实测 384,000) |
|
|
15
|
+
| `lib/index.js:1900` | `effectiveWin = (reserve > 0 && reserve < win*0.9) ? win - reserve : win` → 本机 **664,576** |
|
|
16
|
+
| `lib/index.js:1967` | `waterLevelRing = estTokens / win`(声明窗口口径) |
|
|
17
|
+
| `lib/index.js:1971` | `waterLevelWall = max(0, hardWin − reserve)`(距硬墙余量) |
|
|
18
|
+
| 触发判据 | 走**可用额度口径**(`estTokens / effectiveWin`):实测阈值落在 ≈46 万 token,而**官方压缩要等到约 80% ≈ 83.9 万**才动手 → **早触发约 45%** |
|
|
19
|
+
|
|
20
|
+
### 根因
|
|
21
|
+
把「单次请求的最大可用额度」(`win − reserve`)当成了水位分母。它确实是**单请求硬失败**的边界,但不是**官方压缩**的坐标系 —— 于是水位数被系统性放大,接续在"刚过半"时就触发。
|
|
22
|
+
|
|
23
|
+
### 下一版改法(两条线并行,别只改一半)
|
|
24
|
+
1. **正常接续触发线与官方压缩同坐标系**:分母改用**官方声明窗口 `win`**(或 provider 自报硬限 `hardWin`,取能得到的最小可信值),阈值默认 **0.75–0.78**(略早于官方 0.80,好在压缩丢细节之前完成一次干净交接)。
|
|
25
|
+
2. **保留硬墙保护,但降级为"真会失败才触发"**:仅当 `estTokens + reserve > min(win, hardWin)`(下一次请求就会被拒)时才硬触发。**不要把 reserve 从分母里扣掉** —— reserve 只用于"距硬墙余量"展示与这条硬判据。
|
|
26
|
+
3. **展示与判据解耦**:面板继续显示双口径(本会话水位 / 官方小圈读数 / 距硬墙余量),但**触发只认第 1 条的坐标**;`CONTEXT_WINDOW_EXCEEDED` 与 compaction 事件继续作硬触发(不变)。
|
|
27
|
+
4. 迁移注意:老配置里已落盘的 `autoContinueThreshold`(0.75)在新坐标系下语义等价于"窗口的 75% ≈ 78.6 万",正好落在合理位置;**不需要强制迁移**,但要在设置页 hint 里改口径说明("按官方窗口计,官方在 80% 压缩")。
|
|
28
|
+
|
|
29
|
+
### 验收
|
|
30
|
+
- 本机 deepseek-flash 路由:阈值 0.75 时,触发点 ≈ 78.6 万 token(而非 46 万);`waterLevelRing` 与触发比例**同分母**。
|
|
31
|
+
- 单请求硬失败保护仍在:构造一条 `estTokens + reserve > win` 的场景,应走硬触发而不是等到比例线。
|
|
32
|
+
- 回归:`water-window-pre` / `water-hard-trigger` / `autocont-host` / `water-step` 四个套件全绿(含新增"不得把 reserve 计入分母"的反向锁)。
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 改点 2 · 接续序号(新窗口没按正确序号)
|
|
37
|
+
|
|
38
|
+
### 现状(取证到行)
|
|
39
|
+
| 位置 | 事实 |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| `lib/index.js:2646-2648` | `contSeq = (handoff 目录里 /^prev-session-.*\.md$/ 的文件数) + 1` |
|
|
42
|
+
| `lib/index.js:2533` | 转写包落盘名:`prev-session-<sid8>-<stamp>.md` |
|
|
43
|
+
| `lib/index.js:2182-2187` | 宿主兜底路径补的 `sc.rename({sessionId, title: '接续 #' + contSeq + ' · ' + wsBase})`(2026-09-10 才补,此前只有浏览器路径有) |
|
|
44
|
+
|
|
45
|
+
### 疑似根因(下版按序排除)
|
|
46
|
+
1. **计数来源不稳**:序号来自**文件枚举**,而包是"接续时/之后"才落盘的 → 落盘失败、被清理、或写到**别的工作区的 handoffDir**(`p.handoffDir` 是按工作区解析的)时,计数不递增或**跨工作区重复**。
|
|
47
|
+
2. **取数时机**:`contSeq` 在 `buildContinueCarry` 里算,若该次 carry 复用了缓存/旧 pack,`contSeq` 可能为空 → `if (d.contSeq ...)` 不成立 → **不 rename**,标题退回自动生成的"接续上一会话的任务。材料已…"(此现象早前出现过一次)。
|
|
48
|
+
3. **路径覆盖不全**:三条入口(面板一键接续 / 宿主兜底接续 / 重启后接续)是否都拿到了 `contSeq` 并成功 rename,需逐一核对 diag 日志。
|
|
49
|
+
|
|
50
|
+
### 下一版改法
|
|
51
|
+
1. **序号改持久计数器**:`handoff/cont-seq.json`(键 = workspaceId,值 = 已发出的最大序号),取数即 `++`;若文件缺失则回退为"从现有 `接续 #N` 标题/`prev-session-*` 包名里解析最大值 + 1"(兼容老数据)。
|
|
52
|
+
2. **rename 兜底**:把 `contSeq` 为空的情况改为"用持久计数器兜底值"而不是跳过;rename 失败写 diag(现状只有 catch 里一条 diag,需确认两条入口都写)。
|
|
53
|
+
3. **会话列表排序依据**:若侧栏排序仍不按序号,检查是否需要在 rename 后同步排序字段(sequence/title 排序键),不要只改标题。
|
|
54
|
+
4. **落盘顺序**:确认"写包 → 算序号"还是"算序号 → 写包",把序号分配与包落盘做成**同一次事务的顺序**(先分配序号、再写包、失败回滚计数器)。
|
|
55
|
+
|
|
56
|
+
### 验收
|
|
57
|
+
- 连续接续 3 次:标题依次为 `接续 #N`、`#N+1`、`#N+2`;换到另一个工作区接续**不重复**已有序号。
|
|
58
|
+
- 三条入口各测一次,diag 里都能看到 rename 成功记录。
|
|
59
|
+
- 新增 smoke:计数器持久化 + 跨工作区不重复 + 包落盘失败时不跳号。
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 关联现状(改这两个点之前要知道)
|
|
64
|
+
|
|
65
|
+
- 用户**已手动关闭自动接续**(`autoContinueEnabled = false`)以免浪费 token;改完需用户自行开启并重启 dsh web 验证。
|
|
66
|
+
- `v2.4.1` 已含「已接续闩锁」(`~/.dsh/memory/auto-continue-done.json`),本次"又触发"是在**该闩锁之前就已 arm 的会话**上发生的,不代表闩锁失效;下版验证时要区分"闩锁没拦住"与"口径太早"。
|
|
67
|
+
- 相关 diag:`~/.dsh/dsh-auto-memory-pre-diagnose.log`(`auto-continue armed / deferred / deadline reached / rejected at edge / host-executed` 全在这条线上)。
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# 发版固定流程(dsh-auto-memory)
|
|
2
|
+
|
|
3
|
+
> 2026-09-10 固化。本文件是发版的唯一检查表;`tools/release.mjs` 已内置**版本标识一致性闸门**(缺任一项即拒绝构建),所以下面第 2、3 步不是"记得做",而是"不做就发不出去"。
|
|
4
|
+
|
|
5
|
+
## 0. 前置门(不满足不许开工)
|
|
6
|
+
|
|
7
|
+
- [ ] 全量回归:`cd D:\dsh-auto-memory; Get-ChildItem tests\smoke -File -Filter *.mjs | ForEach-Object { node $_.FullName }` → **0 失败**
|
|
8
|
+
- [ ] `node --check lib/index.js` 与 `lib/client.js` 通过;改动文件无 BOM
|
|
9
|
+
- [ ] **脏树范围核实**:`git status --short` 里只有本次要发布的文件(`release.mjs` 的源就是工作区,脏树会整体进包且不可回溯)
|
|
10
|
+
|
|
11
|
+
## 1. 定版本号
|
|
12
|
+
|
|
13
|
+
- 纯修复 → patch;有新行为/新键 → minor。写在 `CHANGELOG.md` 与下文各处。
|
|
14
|
+
|
|
15
|
+
## 2. 必改 CHANGELOG(第 1 笔)
|
|
16
|
+
|
|
17
|
+
- [ ] `CHANGELOG.md` 顶部新增 `## [<ver>] — <日期> · <一句话主题>` 小节,含:覆盖范围 / 缺陷修复 / 内部重构(若有)/ 流程(若有)/ 验证
|
|
18
|
+
- 闸门校验:文件里必须出现 `## [<ver>]`,否则 `release.mjs` 拒绝构建
|
|
19
|
+
|
|
20
|
+
## 3. 必同步软件内版本标识(第 2 笔)
|
|
21
|
+
|
|
22
|
+
- [ ] **应用内更新说明字典**:`lib/client.js` 的 `var CHANGELOG = { ... }` 顶部新增 `'<ver>': { zh: [...], en: [...] }`(这是弹窗里的"更新说明",缺了用户升级后看不到本版说明)
|
|
23
|
+
- [ ] **界面指纹行**:`lib/client.js` 第 10 行 `console.log('[dsh-auto-memory] client v<ver> fingerprint: ...')`
|
|
24
|
+
- [ ] `package.json.version`:**由 `release.mjs` 自动回写开发树**(面板徽标与「检测更新」读的就是它),构建后复核输出里有 `开发树版本回写: x.y.z → <ver>`
|
|
25
|
+
- 闸门校验:以上三项任一与新版本号不一致 → **拒绝构建**(防止检测更新一直拿旧版本号去比对)
|
|
26
|
+
|
|
27
|
+
## 4. pre 线提交
|
|
28
|
+
|
|
29
|
+
```powershell
|
|
30
|
+
cd D:\dsh-auto-memory
|
|
31
|
+
git add lib tests CHANGELOG.md tools/release.mjs
|
|
32
|
+
git -c user.name="Aik358" -c user.email="aik358@users.noreply.github.com" commit -m "v<ver>: <一句话>"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 5. 先 dry-run 验闸门
|
|
36
|
+
|
|
37
|
+
```powershell
|
|
38
|
+
node tools\release.mjs <ver> --dry-run # 走临时 staging,不碰发布基座
|
|
39
|
+
```
|
|
40
|
+
期望看到:`版本标识一致性: OK(CHANGELOG / 应用内更新说明 / 界面指纹行)` + `语法 ✓ BOM ✓ 无 pre/dev 残留 ✓` + `python/ 运行时完整 ✓ bench 已排除 ✓`
|
|
41
|
+
|
|
42
|
+
## 6. 真构建
|
|
43
|
+
|
|
44
|
+
```powershell
|
|
45
|
+
node tools\release.mjs <ver> # 写 D:\dsh_debug\_publish_dsh-auto-memory + 回写开发树版本
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 7. REL 提交 + 打 tag
|
|
49
|
+
|
|
50
|
+
```powershell
|
|
51
|
+
cd D:\dsh_debug\_publish_dsh-auto-memory
|
|
52
|
+
git add -A
|
|
53
|
+
git -c user.name="Aik358" -c user.email="aik358@users.noreply.github.com" commit -m "v<ver>: <一句话>"
|
|
54
|
+
git tag -f v<ver>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 8. push(必须带 PAT 行内 URL)
|
|
58
|
+
|
|
59
|
+
```powershell
|
|
60
|
+
git -c credential.helper= push https://x-access-token:<PAT>@github.com/Aik358/dsh-auto-memory.git main --tags --force
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 9. npm publish(单向门,最后一步)
|
|
64
|
+
|
|
65
|
+
```powershell
|
|
66
|
+
cd D:\dsh_debug\_publish_dsh-auto-memory
|
|
67
|
+
npm publish . --registry=https://registry.npmjs.org/ --//registry.npmjs.org/:_authToken=<token> --access public
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 10. 三处复核(缺一不算发完)
|
|
71
|
+
|
|
72
|
+
```powershell
|
|
73
|
+
npm view @a9i5k4/dsh-auto-memory version --registry=https://registry.npmjs.org # 必须显式指定官方 registry
|
|
74
|
+
git ls-remote https://github.com/Aik358/dsh-auto-memory.git refs/heads/main
|
|
75
|
+
git ls-remote https://github.com/Aik358/dsh-auto-memory.git refs/tags/v<ver>
|
|
76
|
+
```
|
|
77
|
+
三处 sha/版本必须一致。
|
|
78
|
+
|
|
79
|
+
## 纪律
|
|
80
|
+
|
|
81
|
+
- **凭据只走行内 URL / 环境变量,严禁写进任何会上传 GitHub 或 npm 的文件**(本文件亦不写)。
|
|
82
|
+
- 本机 `~/.npmrc` 指向 npmmirror → 查询与发布都必须显式 `--registry=https://registry.npmjs.org`,否则会查到旧版本、误判发布失败。
|
|
83
|
+
- 发布后实机生效:宿主 `lib/index.js` 需重启;界面半边刷新页面即可。`update-check` 有落盘缓存(`~/.dsh/memory/update-check-pre.json`),需要时用「检查更新」强制刷新。
|
package/lib/client.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* 3. settings.section — 自动记忆设置页(存储位置、注入、反思风格)
|
|
8
8
|
* Data flows over /api/dsh-auto-memory/* (loopback-only host routes).
|
|
9
9
|
*/
|
|
10
|
-
console.log('[dsh-auto-memory] client v2.4.
|
|
10
|
+
console.log('[dsh-auto-memory] client v2.4.2 fingerprint: drawer-summary-ok')
|
|
11
11
|
window.__ModuleLoader__.load({
|
|
12
12
|
id: '@a9i5k4/dsh-auto-memory',
|
|
13
13
|
factory: (require) => {
|
|
@@ -567,6 +567,13 @@ window.__ModuleLoader__.load({
|
|
|
567
567
|
|
|
568
568
|
// ───────────────────────── 更新弹窗 / 首次指导 ─────────────────────────
|
|
569
569
|
var CHANGELOG = {
|
|
570
|
+
'2.4.2': { zh: [
|
|
571
|
+
'变更:自动接续改为**出厂默认关闭**(老用户已落盘的显式设置不受影响)。原因:现有水位判据把「预留输出」从分母里扣掉,实测在上下文刚过半时就触发接续,与官方「约 80% 才压缩」相差约 45%,对不熟悉的人就是白烧 token —— 先默认关,等判据改成与官方压缩同一坐标系后再评估翻回。',
|
|
572
|
+
'想用的人可以在「白板 / 接续」页签里手动打开(开关一直没动,只是默认值变了)。',
|
|
573
|
+
], en: [
|
|
574
|
+
'Change: auto-continue is now OFF by default (explicit values already saved by existing users are unaffected). Reason: the current water-level ratio subtracts the route\'s reserved output from the denominator, so it fired when the context was barely half full — about 45% earlier than the official compaction point (~80%). Defaulting off stops burning tokens until the ratio is aligned with the official coordinate system.',
|
|
575
|
+
'You can still turn it on yourself from the Whiteboard / Handoff tab; only the default changed.',
|
|
576
|
+
] },
|
|
570
577
|
'2.4.1': { zh: [
|
|
571
578
|
'修复:已接续过的会话会被再次触发接续(重复建窗口)。新增「已接续闩锁」并落盘(session id 为键、重启有效):宿主路径在交接材料投料成功后落闩,浏览器路径在新会话真建成后落闩,失败不落闩以便重试。',
|
|
572
579
|
'修复:宿主已完成接续后,确认卡仍停在「同意接续/拒绝」并与「已自动接续到新会话」并存;arm 状态改为按会话过滤,不再在其他窗口弹「本会话水位已达」。',
|
package/lib/index.js
CHANGED
|
@@ -266,8 +266,12 @@ const DEFAULT_CONFIG = {
|
|
|
266
266
|
waterLevelAdvisory: true,
|
|
267
267
|
/** 水位越阈时自动写一篇系统骨架账本(每会话一次;模型仍应自己写正式交接)。 */
|
|
268
268
|
waterLevelAutoHandoff: true,
|
|
269
|
-
/** 自动接续(
|
|
270
|
-
|
|
269
|
+
/** 自动接续(默认关):水位≥阈值 且 harness 权威 running==false(轮次边界,取代旧"两轮水位持平")时弹确认卡。 */
|
|
270
|
+
// 2026-09-10 改为默认关。原因:现有触发口径把「预留输出」从分母里扣掉(effectiveWin = win − reserve),
|
|
271
|
+
// 实测在本机路由下「上下文刚过半」就触发,与官方「约 80% 才压缩」相差约 45%,对公开用户是纯浪费。
|
|
272
|
+
// 待口径改为与官方压缩同坐标系后再评估是否翻回(见 docs/internal/NEXT-VERSION-TODO.md)。
|
|
273
|
+
// 注:老用户已落盘的显式值不受影响,只有新装用户吃这个默认。
|
|
274
|
+
autoContinueEnabled: false,
|
|
271
275
|
/** 自动接续水位阈值(0.5-0.95);2026-09-08 与 waterLevelThreshold 同步下调到 0.75(官方自动压缩阈值 80%,必须留余量)。 */
|
|
272
276
|
autoContinueThreshold: 0.75,
|
|
273
277
|
/** 确认卡倒计时秒数(30-40s 无操作 = 挂机 → 自动接续兜底)。 */
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@a9i5k4/dsh-auto-memory",
|
|
3
3
|
"description": "Proactive associative memory for DSH: zero-prompt recall injected before the model speaks, three-layer auto-consolidation, skill crystallization, and Astra-style context management - handoff ledgers, PLAN whiteboard, water-level sensing. Local-first, model-agnostic, zero deps. 主动联想记忆+Astra 式上下文管理:自动唤回/自动沉淀/技能固化/交接账本与白板跨窗口续命/水位感知。",
|
|
4
|
-
"version": "2.4.
|
|
4
|
+
"version": "2.4.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"exports": {
|