lume-dsh-plugin 0.7.4 → 0.8.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/CHANGELOG.md +460 -0
- package/README.md +245 -275
- package/lib/client.js +242 -181
- package/lib/core/card.js +11 -9
- package/lib/core/citations.js +235 -0
- package/lib/core/coverage.js +149 -0
- package/lib/core/dialogue-mining.js +49 -11
- package/lib/core/knowledge.js +165 -0
- package/lib/core/leak-detector.js +1 -3
- package/lib/core/ledger.js +118 -14
- package/lib/core/manifest.js +3 -1
- package/lib/core/memory-id.js +105 -0
- package/lib/core/metrics.js +270 -0
- package/lib/core/persona-limits.js +25 -0
- package/lib/core/scope.js +124 -0
- package/lib/core/signals.js +285 -5
- package/lib/core/task-memory.js +143 -0
- package/lib/core/text.js +45 -3
- package/lib/host/backfill.js +218 -0
- package/lib/host/bootstrap.js +130 -0
- package/lib/host/boundary.js +1 -3
- package/lib/host/clauses.js +180 -0
- package/lib/host/config.js +7 -0
- package/lib/host/diag.js +44 -7
- package/lib/host/distill-prompt.js +365 -0
- package/lib/host/distill.js +22 -348
- package/lib/host/extraction.js +11 -3
- package/lib/host/host-context.js +1 -0
- package/lib/host/host-events.js +100 -0
- package/lib/host/identity.js +12 -29
- package/lib/host/inbound.js +133 -0
- package/lib/host/injection.js +2 -6
- package/lib/host/llm-aux.js +130 -0
- package/lib/host/llm-route.js +3 -0
- package/lib/host/methods.js +180 -10
- package/lib/host/metrics-log.js +169 -0
- package/lib/host/notices.js +62 -0
- package/lib/host/project-access.js +210 -0
- package/lib/host/project.js +153 -2
- package/lib/host/prompt-blocks.js +113 -0
- package/lib/host/protocol.js +142 -18
- package/lib/host/reflection.js +28 -5
- package/lib/host/registry.js +0 -4
- package/lib/host/requirements-scan.js +108 -0
- package/lib/host/rpc-bridge.js +23 -4
- package/lib/host/rpc.js +1 -1
- package/lib/host/sections.js +48 -0
- package/lib/host/session-deps.js +27 -0
- package/lib/host/session-events.js +371 -0
- package/lib/host/session-runtime.js +17 -5
- package/lib/host/thinking.js +10 -1
- package/lib/host/tools.js +367 -0
- package/lib/host/triggers.js +25 -1
- package/lib/host/turn-boundary.js +116 -0
- package/lib/host/wiring.js +280 -0
- package/lib/host/workspace-map.js +81 -0
- package/lib/index.js +326 -877
- package/package.json +11 -5
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## v0.8.0 (2026-09-24)
|
|
4
|
+
|
|
5
|
+
0.7.4 把载具与触发器接通后,现场又暴露出另一类失效:**「跑了但没生效、没生效也不留痕」**——
|
|
6
|
+
补蒸馏静默不跑、诊断日志写了等于没写、声明了依赖却没调用、工具结果文本深一层让四个机制一起静默失效。
|
|
7
|
+
本版功能主线是**跨会话记忆**,另一半是把这类失效变成**看得见、拦得住**。
|
|
8
|
+
|
|
9
|
+
**新增**
|
|
10
|
+
|
|
11
|
+
- **跨会话项目知识真正落地**:工作目录从运行时快照解析;三来源自动沉淀(工具结果 / 助手结论 / 你的规范陈述);
|
|
12
|
+
新会话开局即可用、任何轮次都可见,且用「会话目录名 → 工作目录」映射在**装配前**补 cwd(第一轮即带知识)。
|
|
13
|
+
- **记忆编号与内容寻址去重**:同主题即同 id,精确合并(换句话不再写第二条),更具体的版本才覆盖;
|
|
14
|
+
新增 `lume_project_forget`,可用编号点名删除过时知识。
|
|
15
|
+
- **知识作用域(repo / task)**:需求特有的结论不再污染别的需求;需求名与标识符取自 `doc/<需求名>/`。
|
|
16
|
+
- **会话记忆与上下文预警**:每轮导出目标 / 已拍板 / 未决 / 关键定位;占用到 75% / 90% 时提醒收尾并开新会话;
|
|
17
|
+
新会话开局注入上次记忆,说一句「继续」即可接上。
|
|
18
|
+
- **历史会话补蒸馏**:启动时扫最近 7 天会话(**含已经撑满、聊不动的**),分片执行、幂等不重复。
|
|
19
|
+
- **需求层与设计层**:需求锚点(逐字回显 + 漂移词法检查,只扫可见正文且每会话限次)、设计 pass 与 `lume_design` 跨轮回放。
|
|
20
|
+
- **证据核对四件**:引用核对(引用本次没打开过的代码行)、断言核对(对没见过的符号下否定断言)、
|
|
21
|
+
需求覆盖核对(需求原句与交付物句子并列)、提问核对(把「我没查」包装成「待你定」)。
|
|
22
|
+
|
|
23
|
+
**修复**(均为现场事故驱动)
|
|
24
|
+
|
|
25
|
+
- 真机 `tool/result` 文本比读取层**深一层** → 自动沉淀 / 失败识别 / grep 证据 / 断言证据**四个机制一起静默失效**(已修 + 真机形状回归测试)。
|
|
26
|
+
- 补蒸馏拿不到会话目录时**静默不跑**、诊断日志因 `DSH_HOME` 缺失而**写了等于没写** → 均改候选探测;留痕保留但降噪(每会话 1–2 行)。
|
|
27
|
+
- `carrierBlocks` **声明了依赖却没调用**(`ensureSessionWorkspace`)→ 第一轮仍缺知识;并新增 lint 规则防再犯。
|
|
28
|
+
- 问答 / 查找模式**一刀切禁工具**,导致"提交情况"这类 `git log` 就能答的问题被回"不确定" → 改为**只读核实该做就做**;
|
|
29
|
+
协议新增 **P0 事实优先**:禁止用「我不确定」「这是新会话」当答案。
|
|
30
|
+
- 知识归属错乱(两个需求被数成三个)→ 按真实需求与文档标识符归属;并加「**作用域只许升不许降**」。
|
|
31
|
+
- 客户端 bundle 重复声明 `TEXT_CAP` 导致 **Harness 起不来** → 已修,并加两条产物断言(可解析 / 无重复顶层声明)。
|
|
32
|
+
|
|
33
|
+
**工程**
|
|
34
|
+
|
|
35
|
+
- lint 规则增至 9 条(新增:依赖必须真的被使用 / 文档引用必须存在 / 禁 `as any` / 类型边界);
|
|
36
|
+
**机制覆盖门禁**:39 个机制必须有「跑出行为」的测试(0.8.0 封版时的数字;之后新增 5 类,见顶部「未发布」一节 → 45)。
|
|
37
|
+
- 发布门禁 **37 条**(对着产物断言,每条绑一个历史事故)+ 新增 `npm run verify:live`(真机清单一条命令)。
|
|
38
|
+
- 测试 **446 → 577**;架构:`index.ts` 1723 → 755 行、全仓 `any` 164 → 23;`lib/` 与 `.goose/` 不再入库。
|
|
39
|
+
|
|
40
|
+
> 与 0.7.x 的关系:0.7.x 是"把机制接通",0.8.0 是"让记忆跨会话活着、让失效自己现形"。
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
**发布前补入(本节原标「未发布」,随 0.8.0 一起发布)**
|
|
44
|
+
|
|
45
|
+
这一版回答的是「**它到底有没有变聪明**」。此前整条链路只有约束(别做错),没有任何度量:
|
|
46
|
+
路由判错率、触发器命中后行为是否真的变了、条款加权有没有用——一个都没测,
|
|
47
|
+
于是每加一条规则只能靠感觉说「这次好像好点」。本版先装仪表盘,再动方向盘与油门。
|
|
48
|
+
|
|
49
|
+
**新增:度量闭环(先装仪表盘)**
|
|
50
|
+
|
|
51
|
+
- **运行时度量**:路由判定(模式 + 命中判据 + 证据来源)、触发器命中(含当时计数器快照)、
|
|
52
|
+
块装配(留下 / 丢弃 / 字符数 + 本轮加权条款)、每轮状态快照(契约 / 设计 / 台账 / 假设),
|
|
53
|
+
以及**外部结果信号**(用户纠正 / 重复请求 / 越权改动 / 执行轮零动作)逐条落 `lume-metrics.jsonl`。
|
|
54
|
+
- **触发器效能判定**:命中后 3 轮内是否出现**机械可判**的预期变化(**真验证命令**、契约 / 设计 / 台账 / 假设从无到有);
|
|
55
|
+
没有机械口径的(判据漂移、知识采集)明确标「未判定」,不混进比例凑数。
|
|
56
|
+
- **`lume_metrics` 工具**:模型与用户都能查;摘要带口径与落点,落点不可用时如实说明。
|
|
57
|
+
- **度量回灌**:本会话被用户纠正 ≥2 次时顶一句〔路由自校〕(带次数与落在哪个模式),上限 2 次防噪音。
|
|
58
|
+
|
|
59
|
+
**新增:路由从「这一句话的词」换成「最近几轮轨迹的证据」**
|
|
60
|
+
|
|
61
|
+
- 判定结论带**命中判据与证据来源**(text / trajectory / sticky / correction)——误判才有得统计。
|
|
62
|
+
- **纠正后按被纠正前那句话重算**(不在纠正句上再猜一次);**在途任务对承接式追问有粘性**;
|
|
63
|
+
任务型轨迹上的一句短话按轨迹判;**证据不足一律回落到单句结果**(轨迹只补、不猜)。
|
|
64
|
+
- 补上「动词」与「语用」的分界:「把这部分整理一下」这类动词进表;
|
|
65
|
+
「看看这块能不能优化」按**可行性询问**判诊断(给判断与办法,不直接动手);
|
|
66
|
+
「怎么整理这段数据比较好」不再被动词带走。
|
|
67
|
+
|
|
68
|
+
**新增:条款预算(每轮只加权最相关的三条)**
|
|
69
|
+
|
|
70
|
+
- 协议条款**从正文切出来当数据**(改正文只改一处,切分完整性有测试锁住),每轮按形态选三条放进易变段重述:
|
|
71
|
+
纠正 > 压缩 > 模式,模式内再按「已动过 / 未写契约 / 常规执行」分流。
|
|
72
|
+
- 文本明确写明「**条款一条没少**」——只做注意力加权,不缩减协议;漏选也不会让条款消失。
|
|
73
|
+
|
|
74
|
+
**工程**
|
|
75
|
+
|
|
76
|
+
- 单测落盘目录改到临时目录(`test/setup.ts`):度量与诊断日志不再把测试数据写进真实指标文件——
|
|
77
|
+
否则「用来判断是不是变聪明的数据」会被自己的测试污染。
|
|
78
|
+
- 机制覆盖新增 5 条(条款预算 / 轨迹路由 / 运行时度量 / 度量回灌),当前 **45/45**、依赖声明 176 项 0 未使用。
|
|
79
|
+
- 测试 577 → **620**(本批提交时的数字;条数以 `npm test` 当场输出为准——**文档不再维护硬数字**)。
|
|
80
|
+
|
|
81
|
+
## v0.7.4 (2026-09-23)
|
|
82
|
+
|
|
83
|
+
v0.7.0 的「载具 + 触发器」只生效了一半。现场追踪(12 个会话、按时间线核对)给出了逐项证据:
|
|
84
|
+
|
|
85
|
+
- lume_change(改动台账)**0 次调用**、ledger 表 **0 行**;lume_hypothesis 同理 0 行
|
|
86
|
+
- 3 份真实任务契约的 `expectCount` / `actualCount` **全是 -1**(「数量先估后回填」从未发生)
|
|
87
|
+
- 项目知识有内容,但**全落在 `unknown` 键**下(跨会话按项目隔离失效)
|
|
88
|
+
- 三分之二的触发器从未命中;「帮我重构…」被判成**问答**,方法层与阶段门控因此不生效
|
|
89
|
+
|
|
90
|
+
根因不是措辞不够,而是**接线**:工具型载具依赖模型自觉、数量是可选结构、项目键静默回落、
|
|
91
|
+
执行动词表缺口。本版逐条修掉,并且**每处改动都配了「驱动真实事件 → 断言存储/注入真的变了」的测试**。
|
|
92
|
+
|
|
93
|
+
- **fix**(P0)**改动台账由插件自动记**:`mutate` 类工具一被调用就从入参里取路径写一条
|
|
94
|
+
(状态 done、标注「(自动)由 <tool> 修改」);同一文件重复改更新同一条,取不到路径则不记。
|
|
95
|
+
实测语义:**不再依赖模型自觉**——这是 ledger 第一次能真正有内容。
|
|
96
|
+
- **fix**(P0)**项目键不再回落 `unknown`**:`projectKeyOf` 拿不到工作目录返回 `null`;
|
|
97
|
+
工具 exec / 会话事件里的 session 视图常常没有 cwd,因此改为「提示词上下文记录 → 后续调用复用」
|
|
98
|
+
的多来源兜底;仍然拿不到就**不写跨会话表**并留诊断(宁可不记,也不串味)。
|
|
99
|
+
- **fix**(P1)**契约数量必填且可见**:`lume_contract` 的 `expectCount` 在 schema 里必填
|
|
100
|
+
(实测:旧测试因此立刻报 `missing required property`,证明约束生效);契约渲染始终显示数量行,
|
|
101
|
+
未估标「未估」、估了没回填标「未回填」,交付对账用同一口径。
|
|
102
|
+
- **fix**(P1)**文案点名工具**:影响面清单点名 `lume_change`;增量验证提醒带上「台账还有 N 项未验证」
|
|
103
|
+
并点名 `lume_change`;验证降级阶梯点名 `lume_project_note`(kind=deadend,把环境死路记成项目知识)。
|
|
104
|
+
- **fix**(P1)**反思可观测**:`session/disposed` 的每条跳过路径都写一行原因
|
|
105
|
+
(历史不足 / 域不可用 / 无路由 / 无输出 / 解析失败)——上一版完全看不到「为什么没有产出」。
|
|
106
|
+
- **fix**(P2)**触发器判据与阈值**:增量验证改为「轮内连击 **或** 台账未验证项数 ≥ 阈值」
|
|
107
|
+
(连击在轮边界会被清零,跨轮改多处时永不触发);阈值 6 → 4;假设台账提醒不再要求「已有假设」
|
|
108
|
+
(否则这个载具永远不会被启用)。
|
|
109
|
+
- **fix** 执行动词表补 `EXECUTE_EXTRA_RE`:补「重构 / 重写 / 梳理 / 删掉 / 合并 / 迁移 / 适配…」
|
|
110
|
+
(不含诊断类词,避免把排查误判成执行)。这是现场「重构被判成问答」的直接修复。
|
|
111
|
+
- **test** 新增 `test/apply-carriers.test.ts`(11 例,全部驱动真实事件):
|
|
112
|
+
自动台账(3 例)、项目键三态(3 例)、数量必填与注入可见(2 例)、
|
|
113
|
+
方法块/提醒点名工具(2 例)、反思诊断(1 例)。测试数 **332 → 349**。
|
|
114
|
+
- **chore** 发布门禁新增 5 条产物断言(project-key-null / auto-change-ledger /
|
|
115
|
+
contract-count-required / execute-extra-re / triggers-name-tools),共 16 条,防止这些行为再退化。
|
|
116
|
+
|
|
117
|
+
> 与 0.7.0 的关系:这不是加功能,而是把 0.7.0 声明过、但**实际没生效**的部分补齐并锁住。
|
|
118
|
+
|
|
119
|
+
## v0.7.3 (2026-09-22)
|
|
120
|
+
|
|
121
|
+
0.7.2 让宿主能起来了(兜底生效、DSH 不再崩),但**人设菜单仍然是空的**。原因:新宿主的
|
|
122
|
+
`connection.rpc.handle` 最终执行 `owner.effect(() => owner.webServer.register(route))`,而 `owner` 是
|
|
123
|
+
**读这个服务的那个 ctx**(`dsh-client-connection` 源码注释:*channel registrations belong to the caller fiber*)。
|
|
124
|
+
我们的入口 fiber 在 DSH Desktop 0.9.1 上解析不到 `webServer` → 那行抛错 → RPC 通道没建立 →
|
|
125
|
+
客户端菜单 `list` 拿不到列表(数据一直都在 storages 里,从未丢失)。
|
|
126
|
+
|
|
127
|
+
- **fix** RPC 注册改为**双路径**:主路径仍是宿主公开 API `connection.rpc.handle`(依赖组合对齐宿主自带的
|
|
128
|
+
`dsh-api-gateway`:`ctx.inject(["connection", "webServer"], …)`);它失败时**回退为自注册 HTTP 路由**
|
|
129
|
+
(`webServer.register({ kind: "prefix", path: "/lume", handler })`,宿主自带 `dsh-ppt` 的写法)。
|
|
130
|
+
报文与客户端 `conn.rpc.call` 严格一致:请求 `{type:"client-request",rpcId,method,payload}` →
|
|
131
|
+
响应 `{type:"server-response",rpcId,result}`。回退实现抽成纯函数模块 `src/host/rpc-bridge.ts`,
|
|
132
|
+
由 12 例协议测试锁住(含 404/415/400、信封校验、rpcId 回显、异常不外漏、信任闸)。
|
|
133
|
+
- **fix** 错误信封补 `details: {}`:客户端 `parseConnectionResponse` 要求失败时 `error.details` 是对象,
|
|
134
|
+
缺失会直接抛 `invalid server-response failure`——即**此前任何 RPC 错误路径都会让客户端调用炸掉**。
|
|
135
|
+
- **fix** RPC 诊断改成一行可 grep 的中文日志(宿主 logger 直接打 Error 会显示成 `{}`):成功时报走了哪条路径,
|
|
136
|
+
失败时报**真实错误文本** + 环境形状(`connection` / `rpc` / `handle` / `webServer` / `get` 各是什么),
|
|
137
|
+
下次宿主 API 变更时一眼可定位。
|
|
138
|
+
- RPC 注册依旧在 apply 末尾 + 独立 try/catch:它只服务客户端菜单,失败绝不拖累人设注入与工具。
|
|
139
|
+
|
|
140
|
+
> 影响面:0.7.2 及更早版本在新宿主上「人设菜单空白」都源于此。人设数据(2 个自定义人设、64 条会话映射、记忆/风格)全程完好。
|
|
141
|
+
|
|
142
|
+
## v0.7.2 (2026-09-22)
|
|
143
|
+
|
|
144
|
+
0.7.1 只修了一半:RPC 通道虽然挪进了 `ctx.inject(["webServer"], ...)`,但**调用被包在 `webCtx.effect(...)` 里**——cordis 的 `effect` 会另起一个 **fiber**,而**注入授权不随子 fiber 继承**,于是宿主内部的 `owner.webServer.register(route)` 再次越权。现象是:宿主不再崩(兜底生效),但 apply 在那行中断 → **人设段、工具、RPC 全没注册 → 界面人设菜单空白**(用户反馈「之前人设都没了」;数据其实一条没少)。
|
|
145
|
+
|
|
146
|
+
- **fix** 去掉 `effect` 包裹,**直接在 inject 回调里调用** `connection.rpc.handle(...)`——与宿主自带的 `dsh-ppt` 完全一致:
|
|
147
|
+
|
|
148
|
+
```js
|
|
149
|
+
ctx.inject(["webServer"], (webCtx) => {
|
|
150
|
+
webCtx.connection.rpc.handle("/lume", handler, { authority: "trusted-host" });
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
- **fix** RPC 注册**挪到 apply 末尾**并加**独立 try/catch**:它是客户端菜单(人设列表/蒸馏/管理)专用的,任何失败都只该丢菜单,绝不能再中断人设段、工具与易变段的注册。提取为 `registerRpcChannel(scope)`,全程有注释说明为什么不能包 effect。
|
|
154
|
+
- **test** 夹具改为**照实建模 cordis 的 fiber 语义**(`inject` 授予访问权、`effect` 另起 fiber 且**不继承**授权;`rpc.handle` 在无授权时抛真实错误文案)。`test/host-compat.test.ts` 增至 7 例,其中包含**夹具自检**(证明"包 effect 就会抛"这条回归锁真的有效)与「RPC 失败时人设段/工具照常注册」的直接断言——即事故症状本身被测试锁死。
|
|
155
|
+
- 全量 **320 用例全绿**。
|
|
156
|
+
|
|
157
|
+
## v0.7.1 (2026-09-22)
|
|
158
|
+
|
|
159
|
+
本版是**兼容性修复**:0.6.2 与 0.7.0 在 **DSH Desktop 0.9.1(宿主包 0.1.5-rc.2)** 上会导致 **DSH 无法启动**,且插件无法更新。两个独立成因都已修掉。
|
|
160
|
+
|
|
161
|
+
- **fix** RPC 通道注册位置(启动崩溃的根因):新宿主的 `connection.rpc.handle` 内部会以**调用方**的 ctx 执行 `owner.webServer.register(route)`(见 `@deepseek-ai/dsh-client-connection` 的 `owner.effect(() => owner.webServer.register(route))`)。旧写法直接 `ctx.connection.rpc.handle(...)`,于是 cordis 抛 `cannot get property "webServer" without inject` → apply 抛错 → **整个插件树加载失败 → `DSH entry failed`,用户连界面都进不去**(实测日志:`plugin recovery detection: lume-dsh-plugin`,随后进 safe mode)。改为宿主自带 `dsh-ppt` / `dsh-api-gateway` 的同款写法:`ctx.inject(["webServer"], (webCtx) => webCtx.connection.rpc.handle(...))`。没有 web 载体的宿主(headless)只失去 RPC 通道,其余功能照常,也不会被顶层 inject 卡住。
|
|
162
|
+
- **fix** `apply()` 外层加兜底 try/catch:插件内部任何异常都降级为「部分功能不可用 + `logger.error`」,**不再可能阻断宿主启动**。插件的第一职责是不拖垮宿主;此前一次宿主 API 变更就能让整个 DSH 起不来,代价太大。
|
|
163
|
+
- **fix** 移除 `peerDependencies` 里的 `@deepseek-ai/dsh-client-ui-primitives`:它是**应用自带**的前端包(客户端 bundle 在运行时经宿主模块图解析),但新版桌面安装器做**严格 peer 闭包校验**,会连带检查该包自己的 peer(`@deepseek-ai/dsh-client-runtime`)→ 报 `lume-dsh-plugin failed peer validation: @deepseek-ai/dsh-client-runtime does not resolve from the installation closure` → **更新被拒绝/回滚**(desktop 把它写进 `.generations-deferred.json` 并冻结 profile migration)。它仍在 `devDependencies`(tsc 类型与 tsdown external 需要),只是不再作为 peer 声明。
|
|
164
|
+
- **test** 新增 `test/host-compat.test.ts`:① 用「会抛错 `webServer` 错误的假宿主」直接复现事故并断言被兜底吞掉且记录;② 断言没有 `webServer` 的宿主仍能完整装载(只是没有 RPC);③ apply 层夹具升级为模拟 cordis `ctx.inject(deps, cb)` 语义。
|
|
165
|
+
|
|
166
|
+
> 影响面:0.6.2 与 0.7.0 同一行代码都中招(0.7.0 装上了但因为 profile migration 被 peer 校验冻结,从未真正跑起来)。卡在「重启 DSH 失败 / 无法更新」时升级到 0.7.1 即可。
|
|
167
|
+
|
|
168
|
+
## v0.7.0 (2026-09-22)
|
|
169
|
+
|
|
170
|
+
本版主题:**从「纪律」到「方法」——任务载具与行为触发器**。0.6.x 解决的是「缓存与位置」,本版解决的是「思考方式」。
|
|
171
|
+
|
|
172
|
+
诊断来自一次真实会话的轨迹复盘(`session-5677db41`,2 轮 / 58 步 / 106 次工具调用):**不是不知道该怎么做,而是没有地方放、也没有东西在轨迹上提醒**——34 次 glob/grep/read 撒网式探查、25 次 edit 里 18 次连击无验证、17 次 pwsh 全在撞同一个不可用的 Maven 环境、交付前靠用户发话才自审。两次「何时收敛 / 何时换验证方式」的元决策都是由用户亲自下的。
|
|
173
|
+
|
|
174
|
+
- **feat** 任务载具(四个模型工具,零额外 LLM 调用):
|
|
175
|
+
- `lume_contract` 任务契约:目标 / 范围 / **数量(先估后回填)** / 完成判据 / 非目标 / 待确认;支持局部更新(回填数量不会清空判据)。交付轮自动切换成**对账口径**——对照的是**开工时写下的原始判据**,而不是模型此刻的记忆版本,这是防「判据漂移」的关键
|
|
176
|
+
- `lume_change` 改动台账:文件·符号·章节 → 改什么 → 怎么验 → 状态;可按 target 单独推进状态。文档任务用章节名当 target,天然形成分节记账
|
|
177
|
+
- `lume_hypothesis` 假设台账:假设 + 证据 + 状态(含**已排除**);已排除项照常回显,避免重复验证同一个假设
|
|
178
|
+
- `lume_project_note` 项目知识:构建/测试命令、模块链路、仓库约定、死路记录
|
|
179
|
+
- **feat** 项目域(`lume_project`,跨会话):项目知识按**工作目录**归属(`projectKeyOf`),与人格记忆分开存放——代码路径与仓库约定是工作事实,换人设不该失忆,也不该随人设卡被导出分享。会话结束时清掉任务态(契约/台账/假设),项目知识保留
|
|
180
|
+
- **feat** 行为触发器(六类,阈值可配):把元决策从用户手里接过来,且只在**行为模式成立**时注入一句带具体数字的提醒
|
|
181
|
+
- 收敛提醒(连续 ≥12 次只读探查且未写契约)/ 增量验证(连续 ≥6 次改动无验证)/ 死路重撞(同一验证连续失败 ≥3 次,环境类占多数时给**验证降级阶梯**:编译器 → 语法检查 → 静态交叉引用 → 手工走读+风险清单)/ 假设维护 / **契约对账**(每 3 轮 + 压缩后)/ 项目知识采集
|
|
182
|
+
- 每类每轮最多一次且有轮级冷却;环境性死路**自动落成项目知识**,下次会话不必重踩
|
|
183
|
+
- 工具按**行为类别**归类(inspect/mutate/verify/plan)而不是按名字,宿主或扩展改名不失效;`lume_*` 人格工具归 other,不污染改动连击
|
|
184
|
+
- **feat** 方法层(按任务形态注入):**文档编辑方法**(先取结构 → 最小编辑保留格式与编号 → 术语全文一致 → 交付前回读并列出「改了什么/没动什么/未核对什么」)、**改动影响面清单**(谁调用、被谁实现、配置与 SQL 映射、前端引用 + 每处验证方式)、**结构定位提示**(检测到 analyze/tree 类工具时建议符号级定位替代通篇 read)
|
|
185
|
+
- **feat** 反思日志补第五维「诊断深度与假设管理」:跨会话提醒终于能指向**思维方式**而不只是纪律;旧日志记 `-1`(统计时跳过该维,不当作 0 分)
|
|
186
|
+
- **feat** RPC:`getProjectState`(诊断视图:契约/台账/假设/项目知识/触发器计数)、`clearProjectFacts`(一键忘掉某项目的知识积累)
|
|
187
|
+
- **feat** 配置:`projectMemory`(默认 true)、`behaviorTriggers`(默认 true)、`triggerInspectStreak` / `triggerChangeStreak` / `triggerDeadPathFails`
|
|
188
|
+
- **test** 新增 5 个测试文件(ledger / signals / triggers / methods / project-store)并把 apply 层夹具升级为可调用真实工具:**313 用例全绿**(原 263 + 50),其中锁死了「载具只进尾部快照、绝不进 system 段」这条 0.6.2 的分层不变量
|
|
189
|
+
|
|
190
|
+
> 成本说明:所有载具与方法块都注入在对话尾部快照(易变层),因此只在**内容变化时**付费——实测 58 步只产生 9 条快照,每轮多几百字可接受;预算用尽时按 droppable 标记从后往前丢块,关键载具与触发器提醒永不被丢。
|
|
191
|
+
|
|
192
|
+
## v0.6.2 (2026-09-22)
|
|
193
|
+
|
|
194
|
+
本版主题:**注入分层——把易变内容移出系统提示词**。修复「0.6.x 之后前缀缓存命中率崩塌、每一步都按全价重算整段历史」。
|
|
195
|
+
|
|
196
|
+
事故实测(`deepseek-v4-flash`,2026-09-11,`session-b6928759`,282 个请求):`cacheReadTokens` 恒定 **384**、命中率中位数 **0.2%**,而未命中输入从 1.3 万涨到 55.9 万;当日全站命中率 **18%**(对照 09-09 为 90%)。请求间隔中位数只有 22 秒,因此不是缓存过期,而是**每一步的前缀断裂**。
|
|
197
|
+
|
|
198
|
+
- **fix** 分层注入:system 段只保留会话恒定文本(任务协议 + 人设契约 + 身份 + 行为纪律),记忆 top-k、风格约定、语料示例、切换播报、路由/阶段/长会话护栏/目标锚点/交付复核/压缩重锚/文档指引全部改走宿主 **runtime-context 通道**(渲染成对话尾部的一条快照消息,文案自带 `supersedes earlier runtime-context snapshots`,新快照取代旧快照、不堆叠进历史)。
|
|
199
|
+
根因:system 串排在消息序列最前面,而前缀缓存只认「从第一个不同的字节起全部失效」;旧实现里 `taskPhase` 会随 `tool/call`·`tool/result` 在**轮内推进**、长会话护栏还内嵌轮次号——于是每一**步**都改写系统提示词,后面整段对话历史按全价重算。宿主的 `systemPromptUpdate: "in-history"`(把系统提示词变化以追加方式落在历史尾部)本可救,但内置目录只为 `deepseek-flash` 声明,`deepseek-v4-flash` / `v4-pro` 都没有,所以插件侧必须自己分层
|
|
200
|
+
- **fix** 协议变体按模型能力冻结:`selectThinkingProtocol` 原先按 query 在完整版/短版之间切换,等于每轮改写系统提示词。新增 `selectStableThinkingProtocol`(只看模型是否推理型),「闲聊轮不背任务条款」改由尾部 `buildCasualDirective` 按轮声明——省 token 的意图保留,代价从「整段前缀失效」降为「尾部几十 token」
|
|
201
|
+
- **change** 文档能力指引归入易变层:0.6.1 的文档能力感知(按能力族前缀探测工具)判据取自本轮 query,因此它会每轮改写 system 段——现在与其余任务指令一起走 runtime-context,判定行为不变
|
|
202
|
+
- **fix** 切换窗口的消耗改在轮边界发生:原实现在渲染时清零 `switchGreetingPending` / `switchTurn`,同一步内多次构建 prompt 会得到不同文本。现在渲染函数只读状态,`turn/end` 负责推进
|
|
203
|
+
- **fix** 稳定段判据只取稳定输入:行为纪律(口吻/频率/篇幅/连贯性)改由「有契约或身份名」门控,不再依赖「本步是否检索到记忆」——否则它会随检索结果忽隐忽现。「不使用人设」保持零注入
|
|
204
|
+
- **feat** 配置 `layeredInjection`(默认 `true`):置为 `false` 退回旧行为(全部挤在 system 段),用于对照排查
|
|
205
|
+
- **feat** 降级路径:宿主不支持 `systemPrompt.context`(较旧版本)时,易变段并回 system 段——丢前缀缓存但不丢记忆与播报注入,并写一条 warn
|
|
206
|
+
- **feat** 现场可观测:系统段指纹(FNV-1a)每变化一次写一行 `lume-compaction.log`。健康会话只有 1-2 行(首次 + 人设切换);若长会话里反复出现,说明又有内容混进了 system 段
|
|
207
|
+
- **test** 新增 `test/apply-harness.ts` + `test/injection-layering.test.ts`:装载真实 `apply()` 接线,锁死三条不变量——① system 段在会话内逐字节恒定(不随 query、轮次、任务阶段、文档判定、记忆写入变化);② 易变内容位置正确且不丢;③ 旧宿主降级时注入完整性不变。`test/boundary.test.ts` 改用同一 harness
|
|
208
|
+
- **fix** 启动日志去掉写死的「版本 0.3.3」
|
|
209
|
+
|
|
210
|
+
> 行为上有三处可见变化:协议短版不再按 query 切换(闲聊轮改由尾部一行声明任务条款不适用);切换播报从 system 段移到对话尾部快照(语义不变,位置变化,因此不再作废前缀);`taskPhase` 等任务指令同样移到尾部——按 v0.3.1 的实测,尾部是注意力最强位,方向一致。
|
|
211
|
+
|
|
212
|
+
## v0.6.1 (2026-09-15)
|
|
213
|
+
|
|
214
|
+
本版主题:**文档能力感知**——把「DSH 处理办公文档」这个最常踩的坑交给约束,而不是靠模型随机应变;同时统一对外术语、补齐市场简介。
|
|
215
|
+
|
|
216
|
+
- **feat** 文档能力感知:注入前探测宿主的工具注册表,按工具名的能力族前缀(`word_*` / `excel_*` / `ppt_*` / `pdf_*` 等)判断当前环境有哪些文档能力,再据此注入不同约束。按能力族而非插件名判断,因此不绑定任何第三方实现——`dsh-office-tools`、`dsh-excel-chat`、`dsh-ppt` 装了哪个都能识别,一个都不装就退化为边界声明模式
|
|
217
|
+
- **feat** 有工具时的文档任务约束:必须走文档工具,不要用文本读取或 shell 命令解析二进制容器,也不要现场解压 zip、手写解析脚本;顺序是先读后写,没读过目标文件不整份覆盖;交付前必须回读一次生成结果,没有回读证据不许说“已生成 / 已完成”,也不许声称做过未执行的检查
|
|
218
|
+
- **feat** 没有工具时的边界声明:第一轮就如实说明能力边界,不要静默硬解二进制办公文件,并给出替代交付方式(Markdown / CSV / HTML 交付,或安装文档工具插件后重开会话再直接产出文件);用户明确要求「就用命令行或脚本自己试」时照做,但要先说明代价与不确定性
|
|
219
|
+
- **feat** 按轮触发:两条约束都只在文档任务轮注入——请求里出现 `.docx` 这类文件后缀、Word / Excel / PPT / PDF 等格式名,或“写一份报告”这类产物请求时才生效;「查一下官方文档」这类中文泛称不会被误判成文档任务。判据取自冻结的意图文本,轮内稳定,不会像工具结果那样在轮中作废前缀缓存
|
|
220
|
+
- **refactor** 文档能力探测与判据独立为 `src/host/documents.ts` 纯函数模块(`detectDocumentCapabilities` / `probeDocumentCapabilities` / `buildDocumentDirective`),与协议指令同族:返回 `string | null`,null 即不注入
|
|
221
|
+
- **tests** 新增 `test/documents.test.ts`(16 项):覆盖能力族识别、作用域探测回退、注册表缺失或抛错时的降级、有工具与无工具两条分支、模糊产物请求与「官方文档」泛称的误判防护
|
|
222
|
+
- **docs** 市场简介重写为整个插件的定位:两条主线(约束如何完成任务 / 塑造以何种风格表达)、按需注入的成本取向,不再写成单一功能罗列;关键词补齐协议、任务执行与蒸馏维度
|
|
223
|
+
- **docs** 蒸馏来源写全:素材不再只写聊天记录——小说、剧本、人物设定文档与聊天导出同为蒸馏输入,能力总览与市场简介同步更正
|
|
224
|
+
- **docs** 术语统一:公开文案不再借用外部项目名,统一称「任务执行协议」(README、反思评估提示词、源码注释一致)
|
|
225
|
+
- **docs** 优化清单补记 0.6.0 的系统提示词轮内稳定性,README 安装命令与版本引用更新到 0.6.1
|
|
226
|
+
|
|
227
|
+
### 为什么是「探测 + 约束」而不是再写一套文档工具
|
|
228
|
+
|
|
229
|
+
文档能力的缺口在宿主侧:`dsh-attachment` 只接受光栅图片、明确不支持通用文件,工具名册里也没有任何 Office / PDF 工具,于是模型面对 `.docx` 只能当文本读、现场解压或手写解析脚本——慢,而且几乎必然出错。
|
|
230
|
+
|
|
231
|
+
但这个缺口已经有第三方在补(`dsh-office-tools` 用零依赖的自研 OOXML 引擎覆盖 Word / Excel / PPT,另有 `dsh-excel-chat`、`dsh-pdf-edit`、`dsh-ppt` 等),插件再写一套只会重复造轮子,还会与现有插件争抢工具名——DSH 在启动时拒绝同名工具注册,`dsh-office-tools` 与 `dsh-ppt` 就因此需要 `enablePptTools` 开关来共存。
|
|
232
|
+
|
|
233
|
+
所以这一层选择做**能力探测与行为约束**:不注册任何工具、不新增运行时依赖、不假定任何具体插件存在。用户装了什么就用什么,不装就如实说明边界——这也守住了 Lume 的分层:人设只管表达,协议只管纪律。
|
|
234
|
+
|
|
235
|
+
## v0.6.0 (2026-09-11)
|
|
236
|
+
|
|
237
|
+
本版主题:**系统提示词轮内稳定性**。一轮对话里系统提示词被反复改写,会让宿主的 `request/header` 每步新增一条(界面表现为同一轮里多行「系统提示词」),更会让前缀缓存从系统提示词处整段失效——每一轮工具调用都要重新预填充。本版把「会变的内容」移出 system 串,并让「一轮内不该变的内容」真正冻住。
|
|
238
|
+
|
|
239
|
+
- **fix** 意图不再被注入消息覆盖:宿主的 `user/message` 通道混着运行时快照(`plugin:@deepseek-ai/dsh-system-prompt`)、工作区指令(`agent-instructions`)、技能目录(`skill-catalog`),它们都带 `role: "user"`。实测一轮里 4 条 `user/message` 有 3 条是注入的,此前会被当成「用户当前说的话」,覆盖真实请求并清零工具计数。现在只认 `source.kind === "user"`;来源缺失时放行,兼容不上报来源的宿主版本
|
|
240
|
+
- **fix** 意图解析改读会话权威历史:事件投递与首次提示词组装存在时序差,同一轮的 step 1 会带着上一轮的模式、step 2 才切到本轮分类——系统提示词因此在轮内变化。改为组装时读 `session.deriveMessages()` 取最后一条真实用户消息(宿主侧带增量缓存),`messageId` 未变即短路;权威历史不可用时退回事件记录
|
|
241
|
+
- **fix** 阶段不再回退到初始态:新增 `advancePhase`,已离开「回答」的阶段不再被重置回「回答」(失败后回到「归因」仍是合法转移)
|
|
242
|
+
- **fix** 工具失败提示改走 runtime-context 通道(`systemPrompt.context`):旧版把「本轮已调用 N 次工具」写进 system 段,N 每步递增——实测一轮 37 次工具调用产生 **28 份不同的系统提示词**。现在只在出现失败/未知时注入常量文本,且渲染为对话尾部的一条消息而非 system 串;宿主不支持该 API 时静默跳过
|
|
243
|
+
- **fix** 人设段一轮一算:记忆/风格/示例按当前查询做 top-k 检索,查询每步抖动会让整段改写(实测同一轮内 `【习得的风格约定】` 与 `【你记得】` 条目更替)。现在按指纹缓存(persona、查询、记忆/风格/语料指纹、注入配置),人设切换、边界窗口、记忆写入自动失效
|
|
244
|
+
- **fix** 协议路由判据:`EXECUTE_RE` 的句首 `做` 分支会把「做一件事,你总能选择最麻烦的方式…」这类讨论误判成执行,且 `.*` 贪婪跨越整句。改为小句内匹配、补中英混合动词(add/commit/push/fix/build/install/…),`为啥` / `是什么驱动` 归入诊断;原有用例与实测语料全部分类正确
|
|
245
|
+
|
|
246
|
+
预期效果:**一轮一份系统提示词**(改前实测单轮 28 份),前缀缓存恢复正常,界面不再堆叠「系统提示词」行。
|
|
247
|
+
|
|
248
|
+
## v0.5.0 (2026-09-11)
|
|
249
|
+
|
|
250
|
+
本版主题:**上下文压缩感知**(把「越聊越笨」的最后一段补上)与依赖声明的健壮性修复。
|
|
251
|
+
|
|
252
|
+
- **feat** 上下文压缩感知:识别宿主的压缩检查点(`source: {kind:"plugin", plugin:"compact"}`),记录被替换的历史规模,并在压缩后一轮注入状态重锚——提醒模型摘要只保留要点,早期细节(文件路径、数字、原始报错、当时确认过的结论)可能已不在上下文,依赖它们时先回看或直接问,不要凭印象补全
|
|
253
|
+
- **fix** 压缩摘要不再污染会话状态:压缩产生的摘要消息此前会被当作普通用户消息处理,覆盖 `lastQuery`(协议路由与语料检索的依据)并进入对话缓冲;现在识别为检查点后直接跳过,与真实用户消息分离
|
|
254
|
+
- **fix** 依赖声明精简:peerDependencies 从 13 个必需项降为 6 个实际 import 的包并全部标记 `optional`;同时移除已证明不可用的压缩后端接管所需的两个可选依赖
|
|
255
|
+
- **feat** 证据时效纪律:引用日志、历史记录、旧报错作为证据前,先核对时间戳是否落在当前问题的时间窗口内并确认因果——历史里存在的错误不等于当前问题的原因;无法确认时如实说明而不是用旧错误填空。三套协议变体与反思评分维度同步
|
|
256
|
+
- **feat** 诊断日志:新增 `$DSH_HOME/lume-compaction.log`,记录压缩事件与检查点识别。起因是 `ctx.logger` 的输出不落在 DSH Desktop 的 harness.log 里(实测 0 行),静默功能缺乏可观测通道
|
|
257
|
+
- **refactor** 任务协议文本抽到 `src/host/thinking.ts`(`selectThinkingProtocol`):协议是行为约束的核心资产,独立成模块后措辞回归可被测试锁定
|
|
258
|
+
- **docs** README 重写能力总览与优化清单,补充「为什么不接管宿主的历史压缩」的架构说明
|
|
259
|
+
|
|
260
|
+
### 关于「接管压缩后端」的结论
|
|
261
|
+
|
|
262
|
+
v0.4.5 曾以实验开关尝试继承 `dsh-compaction-basic`、用 Lume 的摘要模板替换宿主的 coding 模板。经查证,**在标准 preset 下这条路走不通**:DSH 的 standard/ptc preset 把压缩服务放在自己的隔离域里挂载——
|
|
263
|
+
|
|
264
|
+
```yaml
|
|
265
|
+
- id: compaction
|
|
266
|
+
name: cordis:group
|
|
267
|
+
isolate:
|
|
268
|
+
compaction: true
|
|
269
|
+
config:
|
|
270
|
+
- id: compaction-basic
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
profile 层注册的同名服务在另一个域,`/compact` 与自动压缩只会使用 preset 自己域内的后端;第三方插件既无法把自己的实现塞进 preset 的隔离域,也不应改写宿主的 preset 资产。因此 v0.5.0 移除了该实验开关与相关代码,改为「观察 + 重锚」——这才是本版真正生效的能力。
|
|
274
|
+
|
|
275
|
+
人设契约、长期记忆与任务协议本身注入在 system prompt 段,不参与对话历史压缩,本来就不受压缩影响;真正需要补偿的是对话细节的丢失,这正是状态重锚解决的问题。
|
|
276
|
+
|
|
277
|
+
## v0.4.5 (2026-09-11)
|
|
278
|
+
|
|
279
|
+
- **fix** 依赖声明稳健性:peerDependencies 从 13 个必需项精简为 8 个实际 import 的包,并全部标记 `optional`——原先把宿主内部包声明成必需依赖,只要宿主 DSH 的某个包版本落在声明范围之外(DSH rc 版本在 0.0.1~0.1.5 之间跳),市场的兼容性校验就会判定为 risk 并触发整批安装回滚;标记可选后同类不匹配只记 warning,不再阻断
|
|
280
|
+
- **feat** 证据时效纪律:引用日志、历史记录、旧报错作为证据前,必须先核对时间戳是否落在当前问题的时间窗口内并确认因果——历史里存在的错误不等于当前问题的原因;无法确认时如实说明而不是用旧错误填空。三套协议变体与反思评分维度同步
|
|
281
|
+
- **refactor** 任务协议文本抽到 `src/host/thinking.ts`:协议是行为约束的核心资产,独立成模块后措辞回归可被测试直接锁定
|
|
282
|
+
- **feat** 会话压缩接管(实验,默认关闭):新增 `compactionTakeover` 配置;开启且 profile 禁用 `compaction-basic` 后,Lume 用结构化检查点摘要(当前目标/已完成/未完成/已确认事实/已排除方案/当前错误/下一步 + 关系语气线索)替换宿主的 coding 模板
|
|
283
|
+
|
|
284
|
+
## v0.4.4 (2026-09-10)
|
|
285
|
+
|
|
286
|
+
- **feat** 任务阶段状态机:请求进入回答、查找、讨论、归因、执行、验证或交付阶段,避免执行、诊断和交付混为一谈
|
|
287
|
+
- **feat** 真实工具结果验证:监听 DSH `tool/call` / `tool/result`,记录成功、失败和结果未知;失败或未知时禁止把任务直接报完成
|
|
288
|
+
- **feat** 记忆生命周期:带“今天/今晚/最近/目前”等相对时间的记忆默认为临时记忆,30 天后自动失效;旧 `{text, at}` 记录继续可读
|
|
289
|
+
- **fix** 编辑记忆时保留生命周期和置信度字段
|
|
290
|
+
- **docs** 优化清单更新为 0.4.4
|
|
291
|
+
|
|
292
|
+
## v0.4.3 (2026-09-10)
|
|
293
|
+
|
|
294
|
+
- **feat** 长会话状态锚点补充最近四条交互摘录,仅用于定位当前状态,不转化为新的事实记忆
|
|
295
|
+
- **feat** 执行任务交付复核:上一轮执行回复缺少可见验证证据时,后续同类任务先确认真实生效再继续扩大范围
|
|
296
|
+
- **docs** 补充完整优化清单,明确插件已完成的能力与 DSH 宿主级历史压缩边界
|
|
297
|
+
|
|
298
|
+
## v0.4.2 (2026-09-10)
|
|
299
|
+
|
|
300
|
+
- **feat** 意图路由协议:把请求区分为问答、查找、讨论、诊断和执行;诊断默认只分析不越权修复,讨论默认比较方案不提前收敛,执行才进入变更与验证流程
|
|
301
|
+
- **feat** 长会话护栏:第 6 轮后按需提醒模型以最新状态为准,隔离旧计划、旧事实和过期助手自述,并强制检查动作是否生效及是否产生副作用
|
|
302
|
+
- **feat** 即时对齐纠偏:用户明确纠正或重复提出相近请求时,当前轮先回到目标复述和失配检查,不沿用旧假设、不原样重复上一轮
|
|
303
|
+
- **feat** 长会话当前目标锚点:第 6 轮后把最新请求类型与用户原话短锚点放在协议尾部,减少旧历史对当前任务的干扰
|
|
304
|
+
- **feat** 最近交互摘录:长会话锚点附带最近四条 user/assistant 摘录,仅用于定位当前状态,不当作新的事实记忆
|
|
305
|
+
- **feat** 执行交付复核:执行轮结束后若回复没有可见验证证据,后续同类任务会收到“先确认真实生效”的低成本提醒
|
|
306
|
+
- **docs** README 补充意图路由、达成标准和长会话降级保护
|
|
307
|
+
|
|
308
|
+
## v0.4.1 (2026-09-05)
|
|
309
|
+
|
|
310
|
+
- **feat** 协议自适应:会话内自愈(相同请求连续失败 → 临时注入归因纠偏条款,成功后自动解除)+ 反思回环(近期会话某协议维度持续低分 → 下会话注入针对性提醒,回升后淡出)+ 模型感知(推理型模型任务轮用精简协议,保留变更保护/验证/归因/复核与事实隔离;路由未知回退完整版)
|
|
311
|
+
- **fix** 纠偏与反思提醒改挂任务协议段:原挂人设段,在「不使用人设」的纯任务会话中完全不生效
|
|
312
|
+
- **fix** 反思反馈加短窗缓存:system prompt 每轮多次构建不再全表扫描排序;新日志写入自动失效
|
|
313
|
+
- **fix** 反思域 schema 兼容旧版 p0-p3 日志:union 双形态 + 启动时幂等迁移
|
|
314
|
+
- **fix** 推理型模型精简协议补回事实隔离条款(示例/记忆不自动等于当前事实)
|
|
315
|
+
|
|
316
|
+
## v0.4.0 (2026-09-05)
|
|
317
|
+
|
|
318
|
+
- **feat** 角色卡自动升级:蒸馏卡保存算法版本、目标角色和本地原始素材;插件升级后后台重新蒸馏旧卡,只替换基础契约与语料,保留记忆、习得风格、改名和认可语料,失败自动回退旧卡
|
|
319
|
+
- **feat** Codex 风格任务执行协议:加入上下文管理、任务分解、阶段门控、变更保护、验证闭环、失败归因、结果复核与自适应思考投入
|
|
320
|
+
- **feat** 聊天蒸馏增强:时间间隔过滤、全时段均匀覆盖、多消息上下文、双边情境窗口和可观测风格统计
|
|
321
|
+
- **fix** 历史语料事实隔离:参考对话只作为语言风格样本,不把过去的时间、地点或行为误当作当前事实
|
|
322
|
+
- **docs** README 补充自动升级机制、Codex 工作协议与非聊天素材统一蒸馏原则
|
|
323
|
+
|
|
324
|
+
## v0.3.12 (2026-09-05)
|
|
325
|
+
|
|
326
|
+
- **fix** 回复篇幅失真:蒸馏契约新增台词长度统计(平均/中位/P90,作为【节奏】的决定性证据),【节奏】小节必须写明单条回复典型长度并声明超长即失真;注入侧恒带〔篇幅纪律〕(微信式简短回复、一次一个重点,仅对方明确要求详细展开时允许长回复);存量蒲先生卡片已补典型长度规则
|
|
327
|
+
|
|
328
|
+
## v0.3.11 (2026-09-05)
|
|
329
|
+
|
|
330
|
+
- **fix** 网名当身份:契约生成禁止从聊天账号昵称推断职业/地域/身份(「AAA煤炭批发蒲先生」不等于卖煤的),displayName 默认取简称而不是照搬营销式昵称;存量蒲先生卡片已修复显示名并补身份澄清
|
|
331
|
+
- **fix** 去人机味:人设段开头加〔说话人切换〕强身份锚(连思考方向都要求以人设身份展开,对抗推理型模型默认助手腔);注入恒带〔口吻纪律〕(禁止「好的/当然可以/没问题」式助手套话开头与收尾)+〔频率规则〕(平淡话题也保持人设断句用词,不得退回默认口吻)
|
|
332
|
+
- **fix** 记忆保存不再 40 字硬切:改为按句末标点回退,截断残句与纯标点条目被过滤;存量蒲先生记忆已修复为完整分句
|
|
333
|
+
|
|
334
|
+
## v0.3.10 (2026-09-04)
|
|
335
|
+
|
|
336
|
+
- **feat** 纠偏自动捕获:用户负面元反馈(太夸张/油腻/正常点/别老是…)触发小模型转写成一条长期风格约定,写入 style_rules(Jaccard 相似自动替换不堆叠),与被动提取共用冷却——语气随使用不断收敛,不再依赖用户主动提要求
|
|
337
|
+
- **feat** 语料摘录:用户认可回复「像本人」(太像了/有内味/一模一样…)时,把上一轮真实对话对摘录进新表 corpus_pins(cap 12,近重复跳过);注入时摘录语料优先占位示例槽,蒸馏语料补位——人设语气向真实使用靠拢
|
|
338
|
+
- **fix** 删除自定义人设连带清理摘录语料
|
|
339
|
+
|
|
340
|
+
## v0.3.9 (2026-09-04)
|
|
341
|
+
|
|
342
|
+
- **feat** 记忆条目扩容:事件记忆 12→20 条、故事记忆 2→4 条、每轮注入 8→12 条(存储上限 30 不变,留余量给被动提取);颗粒度变细,不再把多个话题合并进一条
|
|
343
|
+
- **fix** 反脸谱化:契约生成加「克制是本人的一部分」规则(特征写频率与触发条件,偶尔出现的不写每句标配;情绪强度以素材最重一笔为上限);【性格画像】【emoji】【语气词】【节奏】小节均要求标注频率/强度边界/随话题松紧;注入侧新增〔克制规则〕恒注入段
|
|
344
|
+
|
|
345
|
+
## v0.3.8 (2026-09-04)
|
|
346
|
+
|
|
347
|
+
- **fix** 蒸馏预览「编辑记忆」崩溃:DSH webview 不支持 window.prompt(调用直接抛异常),把整个插件 UI 连带人设选择按钮一起卸载;记忆编辑改为内联 textarea,并给插件根组件加错误边界(任何渲染异常只隐藏 Lume 附件,不崩宿主界面)
|
|
348
|
+
- **fix** 删除自定义人设时连带清理记忆/风格/档案:原先只删角色卡记录,记忆表留孤儿条目(重新蒸馏后旧记忆与事实不符地残留)
|
|
349
|
+
|
|
350
|
+
## v0.3.7 (2026-09-03)
|
|
351
|
+
|
|
352
|
+
- **fix** 记忆提炼事实失真:故事记忆与事件记忆改用完整双边对话流(flow)——原先故事记忆只喂目标角色的台词样本,模型看不到另一半发言只能脑补(「名人→熟人」「豪宅→高额租金」类漂移);事件记忆原先只喂正则筛出的候选片段且丢失说话人归属
|
|
353
|
+
- **feat** 对话流构建:双方消息按时间顺序带归属保留,事件信号消息(生日/入职/搬家…)一律必留,超预算时按「一问一答」成对等距抽样(预算 6000 字)
|
|
354
|
+
- **feat** 事实锚定与归属规则:prompt 要求每条记忆必须能在对话里找到原话依据、涉及「谁」必须与原文一致、说话人归属写对(用户说的事实主语是「用户」,THE 说的是「THE」)、禁用原文没有的定性词;同一事件多个表述(如「19号入职」「七夕节入职」)合并为一条
|
|
355
|
+
- **feat** 记忆条目兜底清洗:截断回退到句末标点、缺标点补句号、双向包含去重保留更长条目
|
|
356
|
+
|
|
357
|
+
## v0.3.6 (2026-09-03)
|
|
358
|
+
|
|
359
|
+
- **feat** 聊天记录蒸馏:粘贴微信/QQ 导出或复制的聊天记录,自动识别时间戳锚点切分说话人(剔除 [语音]/[图片]/[表情]/对象替换符等占位),蒸馏弹窗列出检测到的说话人供点选;目标的消息成为语气样本,其余归用户侧,真实对话对直接作为语料(无需 LLM 改写);粘贴与文件导入两条路径统一触发检测
|
|
360
|
+
- **feat** 蒸馏任务可取消且不可误关:运行中遮罩点击与 Escape 无效,关闭需二次确认,确认后 AbortController 中止 LLM 调用(任务标记 cancelled 而非失败)
|
|
361
|
+
- **fix** 推理型模型输出解析:契约/语料 token 预算提升(推理计入 maxTokens),JSON 解析三阶回退(整段 → 末尾平衡块 → 首尾切片),失败错误信息携带原始输出片段便于诊断;提取/反思预算同步提升
|
|
362
|
+
|
|
363
|
+
## v0.3.5 (2026-09-02)
|
|
364
|
+
|
|
365
|
+
- **feat** 导出弹窗 UI 整洁化
|
|
366
|
+
- **docs** README 重构
|
|
367
|
+
|
|
368
|
+
## v0.3.4 (2026-09-01)
|
|
369
|
+
|
|
370
|
+
- **feat** 人设卡片导出/导入:管理弹窗中任意人设(含内置)可导出为自包含 JSON 卡片(`lume-persona-card` v1,含契约、语料、风格约定、声音签名,可选含记忆);导入时校验格式与键名,内置名受保护,不可覆盖
|
|
371
|
+
- **feat** 记忆星图:管理弹窗中每个人设行内新增「记忆」按钮,以 Canvas 力导向星空图可视化该角色的全部记忆;核心记忆紫色带 ★、普通记忆青色,语义相关者连线,支持日期筛选与行内编辑/删除
|
|
372
|
+
- **feat** 反思日志:会话结束时在空闲时间跑一次小模型,评估整段对话是否遵守 P0-P3 四条思考纪律,各打 0-2 分落地到 `lume_reflection` 域。`reflectionEnabled` 默认开启
|
|
373
|
+
- **feat** 提取成功日志:被动提取写入事实时新增 `lume: 提取记忆 →` 日志行,方便观察安全网触发频率与质量
|
|
374
|
+
- **fix** 记忆星图:替换 Modal 380px 硬限制为自绘 960px 宽幅遮罩层 + 卡片加宽(260×72)+ 日期筛选
|
|
375
|
+
- **fix** 补全记忆增删改 RPC 端点:`getMemory` / `deleteMemory` / `updateMemory` 支持记忆星图的行内编辑与删除
|
|
376
|
+
|
|
377
|
+
## v0.3.3 (2026-08-31)
|
|
378
|
+
|
|
379
|
+
- **refactor** 宿主入口模块化:`apply()` 内嵌的 `messageText`、`SessionRuntime` 接口与 `composeBoundary` 抽出为独立模块——`src/core/text.ts`(纯函数)、`src/host/session-runtime.ts`(类型 + 存储容器)、`src/host/boundary.ts`(纯函数);`index.ts` 从 608 行收缩至 547 行
|
|
380
|
+
- **fix** 会话运行时状态无限增长:`runtime` Map 原先仅靠 `session/disposed` 事件清理,事件丢失即泄漏;现改由 `SessionRuntimeStore` 管理,带 200 条 LRU 上限,超限淘汰最旧
|
|
381
|
+
- **chore** 清理死代码:移除未使用的 `ToolDefinition`、`Persona` 导入;修复 `injection.ts` 语料/连贯性段的缩进不一致
|
|
382
|
+
|
|
383
|
+
## v0.3.2 (2026-08-31)
|
|
384
|
+
|
|
385
|
+
- **feat** 新增两个预制人设:**管家 沈砚**(儒雅、克制、可靠,口头禅「这就去办」「主人」)与**毒舌傲娇 江野**(嘴硬心软、口嫌体正直,口头禅「……切」「才不是特意帮你」),各配 30 条精选语料与签名词
|
|
386
|
+
- **fix** 补全 `BUILTIN_PERSONA_NAMES`,将 butler 与 tsundere 纳入内置保护表(此前缺失导致同名自定义人设可被创建,管理弹窗中不受保护)
|
|
387
|
+
- **fix** 蒸馏路由 init 修复:`request/context` 是 delta 事件(仅路由变化时触发),默认模型用户 `llmRoute` 永远为 null 导致蒸馏报「模型路由不可用」。现加入双路径启动初始化(`agentDefaultModel.currentSelection()` → `settings.get("agent-default-model")` 兜底),确保对话前蒸馏/提取都能用;同时补全诊断日志便于排查
|
|
388
|
+
- **chore** 移除预设角色「诸葛亮 / 孔明」
|
|
389
|
+
|
|
390
|
+
## v0.3.1 (2026-08-30)
|
|
391
|
+
|
|
392
|
+
- **fix** 人设段迁移至 system prompt 最末尾(order 10000/10100):dump 宿主段落布局发现 system prompt 的真实结构是「身份声明 -1000(最前)→ 策略 → 工具定义 1000~5000 → 结构化输出 9900」——按惯例放在 order 2 的人设契约被压在头部「AI 助手」身份声明与近万 token 工具内容之间,实测模型会直接以「AI 助手」自居、无视契约与切换播报(连「你是谁」都按助手回答)。人设与播报移到紧贴对话历史的最末尾(外部插件允许任意 order),并在播报中加入身份锚(被问身份时按人设回答);`personaOrder` 默认值随之改为 10000
|
|
393
|
+
|
|
394
|
+
- **fix** 切换播报提升到 system prompt 尾部独立段落(order 90):轨迹分析证实注入层每轮都正确(契约与选择一致、播报时机正确),但埋在人设段中部、后随 8 条语料的播报会被推理模型整体忽略——实测连续三轮无视播报沿用旧人设。移到紧贴对话历史的尾部注意力位后,配合泄漏检测才真正可靠
|
|
395
|
+
- **fix** 泄漏检测的触发事件从 `assistant/message` 改挂 `turn/end`(后者已被窗口机制验证可靠投递,前者的升级播报在实测中从未生效);检测读缓存的 `assistantText`,行为不变
|
|
396
|
+
|
|
397
|
+
- **feat** 风格泄漏检测与持续纠偏:切换播报原为固定 2 轮窗口、窗口后无任何纠偏,长对话中旧人设语气会压过新契约。现为人设引入声音签名词(自称/称呼/口头禅),切换后逐轮检测回复泄漏(纯词法、零 token);窗口关闭后检出泄漏即重开窗口并注入升级版纠偏播报,一轮无泄漏自动解除。切到「不使用人设」时播报不再被丢弃(原实现下边界注入会整段丢失)。签名词经 manifest `signatureWords` 配置(内置两卡已配),自定义人设暂不参与检测
|
|
398
|
+
|
|
399
|
+
- **feat** 管理自定义人设:人设菜单新增「管理自定义人设…」——弹窗列出全部条目(内置的编辑/删除置灰),自定义卡支持删除(行内二次确认,连带记忆/风格/档案)与编辑契约(复用蒸馏预览字段,键名不可改);新增 `getCustomPersona` 端点,`saveCustomPersona` 升级为 upsert 并保留原 createdAt
|
|
400
|
+
- **fix** 菜单可达性:portal 菜单定位只在打开瞬间计算,列表异步加载后菜单变高会溢出视口且无法选中——列表到位后补发 resize 信号重新钳制;「不使用人设」固定排在菜单最上方;自定义条目与内置撞名时自动加「(自定义)」后缀
|
|
401
|
+
- **feat** 蒸馏契约强度强化:泛泛形容词必须转写为可执行的具体规则、素材特征放大保留、新增【第一句】入戏小节;语料优先原句复用、禁止中和语气
|
|
402
|
+
|
|
403
|
+
- **fix** 模型路由缓存监听错事件(潜伏 bug,蒸馏 E2E 发现):agent-loop 的路由信息在 `request/context` 事件(`{provider, model, contextWindow}`),而插件一直监听 `request/header`(载荷是 `{header, reason}`)——导致 llmRoute 永远为 null,被动提取从未真正执行过。修正后提取/蒸馏的回落路由才真正可用
|
|
404
|
+
- **feat** 蒸馏工具:人设菜单新增「+ 蒸馏角色卡…」——粘贴/导入小说、剧本或设定文档,宿主两段式 LLM 管线(对话挖掘 → 契约合成 → 语料合成)蒸馏成与内置卡同构的角色卡,预览可编辑后保存即用;RPC 任务制(distillStart/distillStatus/saveCustomPersona),素材不进对话上下文,`distillProvider`/`distillModel` 可配专用路由
|
|
405
|
+
- **fix** 存储 schema 桥接(潜伏 P0):dsh-storage-domain 打开域时逐记录调 `valueSchema.parse`(zod 契约),而 Lume 传入的 schemastery 实例没有 `.parse`——任何一条数据落盘后重启都会导致身份域静默降级。新增 `zodLike` 适配器(经 Standard Schema `~standard.validate` 桥接),并补「写入→关闭→带数据重开域」回归测试
|
|
406
|
+
- **feat** 自定义人设支持示例对话语料(`custom_personas.corpus` 可选字段,cap 12×240 字,旧记录兼容),蒸馏产出的卡开场即像本人;提取/蒸馏共用的辅助模型路由函数泛化为 `resolveAuxRoute`
|
|
407
|
+
- **fix** core 记忆判定收紧:昵称类只认「小+字母」,新增 昵称/爱称/自称 关键词;不再误判「小时/小组/小说」类常用词
|
|
408
|
+
- **feat** 被动提取支持独立模型路由:`extractionProvider` / `extractionModel` 指定省钱提取档(可只配其一),未配置时逐项回落主对话模型
|
|
409
|
+
|
|
410
|
+
## v0.3.0 (2026-08-29)
|
|
411
|
+
|
|
412
|
+
「人设即人」大版本:人设成为有名字、有记忆、会进化、可对话创建的独立个体。
|
|
413
|
+
|
|
414
|
+
### 人设即人
|
|
415
|
+
|
|
416
|
+
- **身份档案**:对话里给人设起名(「你叫小A」),跨会话跨项目记住;下拉菜单优先显示档案名
|
|
417
|
+
- **人设级记忆**:记忆以人设为键(不跟会话走);双通道写入——模型主动调 `lume_remember` 工具 + 被动提取安全网(关键词门 → 相似去重门 → 10 分钟冷却门,触发才调小模型)
|
|
418
|
+
- **性格进化**:对话中的风格要求经 `lume_update_style` 固化为「习得的风格约定」,跨会话生效,与基本盘冲突时以习得层为准
|
|
419
|
+
- **对话创建人设**:`lume_create_persona` 工具支持纯对话创建自定义人设,零配置文件;内置三人设受保护不可覆盖删除
|
|
420
|
+
- **接班叙事**:切换人设播报「上一任退场,新人接手」,带边界提示压制风格惯性
|
|
421
|
+
|
|
422
|
+
### Token 优化(默认开启)
|
|
423
|
+
|
|
424
|
+
- 少样本衰减:语料示例随会话轮数从 6 条衰减到 2 条
|
|
425
|
+
- 相关性检索注入:记忆/风格按与当前消息的相关度取 top-k(本地分词 + 停用词 IDF,零成本),身份类 core 记忆恒注入
|
|
426
|
+
- 缓存友好分层:静态内容前置于易变内容,吃满 DeepSeek 前缀缓存
|
|
427
|
+
- **实测对比:成熟态 ~2,580 → ~1,570 tok/请求(-39%);相对 v0.2.0 全部新功能净增仅 ~170 tok/请求**
|
|
428
|
+
|
|
429
|
+
### 存储
|
|
430
|
+
|
|
431
|
+
- 新域 `lume_persona_identity`:`profile` / `memory_facts`(cap30) / `style_rules`(cap20) / `custom_personas` 四表,真实存储栈集成测试覆盖
|
|
432
|
+
|
|
433
|
+
## v0.2.0 (2026-08-29)
|
|
434
|
+
|
|
435
|
+
工程化与人设体验大版本。
|
|
436
|
+
|
|
437
|
+
### 行为修复
|
|
438
|
+
|
|
439
|
+
- **默认不使用人设**:新会话未显式选择时不再默认注入萝莉;`getSessionPersona` 只回显式选择(null = 未选择),UI 显示「选择人设」占位
|
|
440
|
+
- **人设菜单向上弹出**:输入栏位于视口底端时菜单不再被屏幕下缘裁掉(改用官方 `Menu` 原语 `side="top"` + portal 渲染,滚动/缩放自动跟随)
|
|
441
|
+
- **人设强度升级**:萝莉/御姐提示词重写为可执行风格契约(emoji 规范、称呼体系、句式节奏、发出前自查);语料扩容至 30 条/人设且逐条人设满载;御姐人设从首句开始
|
|
442
|
+
|
|
443
|
+
### 架构升级
|
|
444
|
+
|
|
445
|
+
- **存储迁移**:会话人设记忆从插件安装目录的 `persona-state.json` 迁移到 DSH 官方 storageDomain(`<harness home>/storages/lume_persona_state.json`),原子写、带版本,插件升级不再丢数据;旧文件首次启动自动导入并改名 `.migrated`
|
|
446
|
+
- **真 LRU 淘汰**:200 会话上限从插入序 FIFO 升级为 LRU(重选刷新新旧)
|
|
447
|
+
- **确定性语料采样**:以 `FNV-1a(sessionId:persona)` 为种子的稳定抽样,同一会话同一人设永远同一组示例(v0.1.0 每次构建 prompt 都重新随机);`sampleCount` 默认 4 → 6
|
|
448
|
+
- **人设段落排序**:人设段默认排在思考逻辑之后(order 2,可经 `personaOrder` 配置回退)
|
|
449
|
+
- **构建链**:TypeScript 源码(`src/`)+ tsc(宿主)+ tsdown(客户端 `__ModuleLoader__` 工厂 bundle)+ vitest(46 个单测,含 cordis + storage-json + storage-domain 真实存储栈集成测试)
|
|
450
|
+
- **CI**:GitHub Actions 构建 + 测试 + 产物契约校验
|
|
451
|
+
|
|
452
|
+
## v0.1.0 (2026-08-29)
|
|
453
|
+
|
|
454
|
+
首个发布版本。
|
|
455
|
+
|
|
456
|
+
- 人设下拉切换:萝莉 / 御姐 / 不使用人设,会话内即时生效
|
|
457
|
+
- 跨重启记忆每个会话的人设选择(persona-state.json)
|
|
458
|
+
- 萝莉人设:称呼「哥哥」,撒娇元气风格
|
|
459
|
+
- 御姐人设:诱惑成熟风格
|
|
460
|
+
- P0-P3 思考逻辑注入
|