dsh-engram 0.7.2 → 0.7.4
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 +11 -1
- package/README.zh.md +7 -1
- package/docs/RELEASE-NOTES-v0.7.3.md +30 -0
- package/docs/RELEASE-NOTES-v0.7.4.md +71 -0
- package/lib/capture.js +2 -1
- package/lib/client.js +1760 -1758
- package/lib/episode.js +10 -5
- package/lib/index-block.js +10 -4
- package/lib/index.js +19 -5
- package/lib/preference.js +2 -1
- package/lib/session-events.js +126 -0
- package/lib/todo-sink.js +3 -2
- package/lib/tools.js +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -605,7 +605,17 @@ After restart, inside the **native** DSH settings surface:
|
|
|
605
605
|
session events. Per-tool counts + a 14-day daily rollup are shown too.
|
|
606
606
|
Numbers are real, from real sessions — lift ESR proactivity by watching
|
|
607
607
|
this panel and tuning the injected prompt.
|
|
608
|
-
- **Settings →
|
|
608
|
+
- **Settings → Engram Memory → 设置 tab** — the config card, expanded by default
|
|
609
|
+
(DSH 0.2.1 dropped the `settings.plugin.item` slot, so the old
|
|
610
|
+
Settings → Plugins → Plugin configuration seat no longer renders). Same card,
|
|
611
|
+
same transport: title + one-line description + chevron, its ~12 options under
|
|
612
|
+
four groups — Capture & Search / Index / Lifecycle & GC / Security. Changes
|
|
613
|
+
apply to new sessions (frozen blocks stay stable); Discard / Save with an
|
|
614
|
+
"unsaved" badge on the header. It drives the namespace through the
|
|
615
|
+
plugin's own `/api/dsh-engram/settings` route (not the isLoopback-gated
|
|
616
|
+
scope), so it stays editable even through an operator-authorized tunnel.
|
|
617
|
+
- **Settings → Plugins → Plugin configuration → dsh-engram** (DSH ≤ 0.2.0 only,
|
|
618
|
+
legacy `settings.plugin.item` seat) — a collapsible
|
|
609
619
|
config card in the same style as the built-in "Shell / Agent loop / Web
|
|
610
620
|
search" cards: title + one-line description + chevron, collapsed by default,
|
|
611
621
|
click to expand/collapse. Open, its ~12 options render under four groups —
|
package/README.zh.md
CHANGED
|
@@ -404,7 +404,13 @@ node scripts/setup-links.mjs # 把 @deepseek-ai 工作区包软链进 node_m
|
|
|
404
404
|
**平均命中/查询**;**detail 转化** = 命中召回后很快跟一次 engram_detail 的比例(会话内 8 事件窗口);失败数按工具记。
|
|
405
405
|
面板同时列出各工具调用计数与最近 14 天逐日滚动。这些是真实会话的真实数字——想提升 ESR 主动性,
|
|
406
406
|
就观察面板上 esr 占比并调整注入提示。
|
|
407
|
-
- **设置 →
|
|
407
|
+
- **设置 → Engram 记忆 → 「设置」tab** — 配置卡默认展开(DSH 0.2.1 去掉了
|
|
408
|
+
`settings.plugin.item` 槽位,旧的「插件 → 插件配置」位置不再渲染)。同一张卡、同一套传输:
|
|
409
|
+
标题 + 一行说明 + chevron,展开后 ~12 个选项分四组——捕获与检索 / 索引 / 生命周期与 GC /
|
|
410
|
+
安全。改动对新会话生效(已冻结的块保持不变);Discard / Save,标题栏带「未保存」徽标。
|
|
411
|
+
卡片走插件**自有** `/api/dsh-engram/settings` 路由(不经过 isLoopback 围栏),
|
|
412
|
+
经授权隧道访问 GUI 时也能改。
|
|
413
|
+
- **设置 → 插件 → 插件配置 → dsh-engram**(仅 DSH ≤ 0.2.0,旧 `settings.plugin.item` 座位)— 与内置「终端 / Agent 循环 / 网页搜索」同款的
|
|
408
414
|
**默认折叠卡片**:标题 + 一行描述 + 箭头,点击展开/收起;展开后常用 11 项 + 高级分组按
|
|
409
415
|
「捕获与检索 / 索引 / 生命周期与 GC / 安全」四个分组展示。改动对新建会话即时生效
|
|
410
416
|
(已冻结的块保持稳定);支持放弃修改 / 保存,有未保存改动时标题上出现「未保存」徽标。
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# dsh-engram v0.7.3
|
|
2
|
+
|
|
3
|
+
自 v0.7.2 以来:**设置卡搬到「Engram 记忆 → 设置」tab**——DSH 0.2.1 删掉了
|
|
4
|
+
`settings.plugin.item` 槽位,旧位置不再渲染,卡片在 GUI 里彻底不可见(宿主 API
|
|
5
|
+
`/api/dsh-engram/settings` 一直正常,只是没有挂载点)。
|
|
6
|
+
|
|
7
|
+
## 根因
|
|
8
|
+
|
|
9
|
+
`settings.plugin.item` 是 DSH ≤0.2.0 时代「插件 → 插件配置」tab 的插槽;`0.2.1-rc.2`
|
|
10
|
+
把插件配置改成按 entry-id 的通用表单(插件管理页里的行详情),旧插槽在运行时不再声明
|
|
11
|
+
(只剩 `dsh-client-ui-settings-models` 里的一份类型声明)。插件把卡片注册进这个槽位,
|
|
12
|
+
`ctx.slots.inject` 因此在浏览器里静默失败,卡片从未挂载——用户看到的
|
|
13
|
+
「Engram 记忆」页只有 记忆 / ESR / 注入预览 / 遥测 四个 tab。
|
|
14
|
+
|
|
15
|
+
## 改动
|
|
16
|
+
|
|
17
|
+
- 「Engram 记忆」页新增 **「设置」tab**,直接渲染同一张 `EngramConfigCard`(默认展开);
|
|
18
|
+
共享 `EngramScopeImpl`(`/api/dsh-engram/settings`)传输,读写落在同一份 DSH 设置文档,
|
|
19
|
+
写回后 loader 提交 volatile ref → 插件热同步 `resolved`(与之前完全一致)。
|
|
20
|
+
- `EngramConfigCard` 新增 `defaultOpen`:设置页里展开,旧槽位里保持折叠的旧行为。
|
|
21
|
+
- 保留 `settings.plugin.item` 注册(DSH ≤0.2.0 上仍可见),失败仍只 `console.warn`。
|
|
22
|
+
- 设置 tab 下隐藏顶部「工作区」筛选(该 view 与工作区无关)。
|
|
23
|
+
- 文档:README 中英改为「设置 → Engram 记忆 → 设置 tab」,并注明旧座位仅 DSH ≤0.2.0。
|
|
24
|
+
|
|
25
|
+
## 验证
|
|
26
|
+
|
|
27
|
+
`npm run typecheck` 干净;`npm test` 406/406;`npm run build:client` 重新产出
|
|
28
|
+
`lib/client.js`(设置 tab、`setView("config")`、`defaultOpen` 均在产物中);
|
|
29
|
+
`/api/dsh-engram/settings` 实测返回 `autoWebCompaction=true · gcReplacesCompaction=true ·
|
|
30
|
+
gcNarrative=true`(与 profile patch 一致,无「卡片说 false、实际 true」的分裂)。
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# dsh-engram v0.7.4
|
|
2
|
+
|
|
3
|
+
自 v0.7.3 以来:**修复「推送腿」在 DSH 0.2.x 上整条静默失效**。`[RECALL]` 启动召回、
|
|
4
|
+
会话 episode、`[RESUME]` 恢复简报、会话结束 todo 沉淀——四个 v0.6/v0.7 的招牌机制,
|
|
5
|
+
在真机上**一次都没有触发过**,而它们的单测全绿。
|
|
6
|
+
|
|
7
|
+
## 根因(宿主 API 漂移 + 静默归零,第二次)
|
|
8
|
+
|
|
9
|
+
DSH ≤0.1.x 把会话日志暴露成 `session.events`(一个冻结数组)。**DSH 0.2.x 删掉了这个
|
|
10
|
+
getter**——`Session.prototype` 现在只有 `eventAt` / `snapshotEvents` / `ownEvents` /
|
|
11
|
+
`deriveEventMessage`,宿主内部的同步全量读已被标记 deprecated,官方路径是
|
|
12
|
+
`ctx.sessionQuery.live(session)` 租约。
|
|
13
|
+
|
|
14
|
+
插件里 6 处 `Array.isArray(session.events)` 因此全部拿到 `[]`:
|
|
15
|
+
|
|
16
|
+
| 位置 | 后果 |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `index-block.firstUserMessageText` | 取不到首条用户消息 → 查询串为空 → `[RECALL]` 永不渲染 |
|
|
19
|
+
| 同上(`pendingRecall` 分支) | 每轮都「等下一轮再试」→ `[ENGRAM]` 块**永不缓存**,每轮重渲染;注入体积也不进账本(净收益被高估) |
|
|
20
|
+
| `episode.buildEpisode` | 永远返回 `null` → 0 条 episode → `[RESUME]` 永不触发 |
|
|
21
|
+
| `todo-sink.pendingTodosFromSession` | 永远读不到 `todo/write` → 会话结束不沉淀任何 ESR draft |
|
|
22
|
+
| `capture` / `tools` / `preference` 的 `seq` 戳 | 溯源恒为 `seq: 0`(可审计性的最小字段失效) |
|
|
23
|
+
|
|
24
|
+
真机数据(本机 store,286 条记忆):`kind` 分布里 **0 条 `episode`**、**0 条
|
|
25
|
+
`preference`**、只有 4 条带锚点——与「机制存在 ≠ 机制被调用」的旧教训完全一致。
|
|
26
|
+
单测之所以没发现:它们都 mock 了 `{ events: [...] }`,测的是旧宿主的形状。
|
|
27
|
+
|
|
28
|
+
## 修复
|
|
29
|
+
|
|
30
|
+
- 新增 **`lib/session-events.js`**:跨代际读取会话日志,按顺序取第一个可用路径
|
|
31
|
+
1. `session.events`(≤0.1.x 与所有单测替身)→ 2. `ctx.sessionQuery.live()` 租约
|
|
32
|
+
(≥0.2.x 官方路径,读完立即 dispose)→ 3. `session.snapshotEvents(0, seq)`
|
|
33
|
+
(无 ctx 时的兜底)→ 4. `[]`。
|
|
34
|
+
同时导出 `sessionEventsSource()`(`legacy` / `sessionQuery` / `snapshotEvents` /
|
|
35
|
+
`none`)与 `sessionSeq()`(溯源 seq,优先 `session.seq`)。
|
|
36
|
+
- 6 处读点全部改接:`firstUserMessageText`、`buildEpisode`、`pendingTodosFromSession`、
|
|
37
|
+
`episode` 写入的 seq、`capture` / `tools` / `preference` 的 seq。
|
|
38
|
+
- **不再无限重试**:`[RECALL]` 的 `pendingRecall` 现在只在「日志可读但首条用户消息还没
|
|
39
|
+
落地」时重试;日志彻底不可读时只告警一次并照常缓存 `[ENGRAM]` 块——恢复前缀稳定性,
|
|
40
|
+
也避免每轮重渲染。
|
|
41
|
+
- 新增一次性告警:`engram: this host exposes no readable session event log … —
|
|
42
|
+
[RECALL] / episode / todo-sink stay dormant`(把静默降级改成可观测)。
|
|
43
|
+
|
|
44
|
+
## 验证
|
|
45
|
+
|
|
46
|
+
- `test/session-events.test.mjs` 10 例:所有用例的 session 替身**故意不暴露 `.events`**
|
|
47
|
+
(只给 `seq` / `eventAt` / `snapshotEvents`,与 0.2.x 原型一致),覆盖 legacy /
|
|
48
|
+
lease(含 dispose 断言)/ 兜底 / lease 抛错 / 完全不可读 / seq 取值,以及
|
|
49
|
+
`[RECALL]` 取词、`buildEpisode`、`pendingTodosFromSession` 三条端到端回归。
|
|
50
|
+
一旦有人改回 `session.events`,这组用例会红而不是静默归零。
|
|
51
|
+
- `npm test` 416/416;`npm run typecheck` 干净。
|
|
52
|
+
- 交叉核对真机形状:`Session.prototype` 仅含 `eventAt/snapshotEvents/ownEvents/
|
|
53
|
+
deriveEventMessage`;真实会话文件里的 `user/message` 事件形状与读取逻辑一致
|
|
54
|
+
(`data.content[].text`)、`todo/write` 仍存在于 0.2.1。
|
|
55
|
+
- **未做实机重启验证**:修复要重启 `dsh web` 才生效,而本次修复是在同一进程里做的
|
|
56
|
+
(重启会终结当前会话)。验证方式:重启后新会话的系统提示里应出现 `[RECALL]`,
|
|
57
|
+
且 `/stats` 的 `recallInjection` 计数开始增长。
|
|
58
|
+
|
|
59
|
+
## 升级步骤
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# 插件走 file: 链接,改完代码重启 web 面即可
|
|
63
|
+
# (设置文档不需要迁移)
|
|
64
|
+
dsh web # 或在你原来的终端里 Ctrl-C 后重新 dsh --profile web
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 由此改变的产品判断
|
|
68
|
+
|
|
69
|
+
本提案「拉取式被证伪」的实测(store 123 / recall 24 / detail 8)**有一部分是假的**:
|
|
70
|
+
推送腿当时根本没接线。重启后 1–2 周的账本与激活漏斗,才是「推送 vs 拉取」的第一份
|
|
71
|
+
干净数据——在它出来之前,不应据此再加新机制。
|
package/lib/capture.js
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
23
|
import { workspaceKey as workspaceKeyOf } from "./util.js";
|
|
24
|
+
import { sessionSeq } from "./session-events.js";
|
|
24
25
|
|
|
25
26
|
const GIT_MILESTONE_SIGNAL = 0.5;
|
|
26
27
|
const GIT_COMMIT_SIGNAL = 0.55;
|
|
@@ -226,7 +227,7 @@ export function makeCaptureHandler(store, config, log, stats) {
|
|
|
226
227
|
signal: entry.signal,
|
|
227
228
|
filePath: entry.filePath ?? null,
|
|
228
229
|
sessionId,
|
|
229
|
-
seq: agent.session
|
|
230
|
+
seq: sessionSeq(agent.session),
|
|
230
231
|
},
|
|
231
232
|
config,
|
|
232
233
|
)
|