dsh-lite-memory 0.18.1 → 0.18.19

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.
@@ -0,0 +1,27 @@
1
+ # 0.18.12:点开更新过的记忆不再说「已删除」
2
+
3
+ ## 按标题能读到正文
4
+
5
+ 0.18.10 把引用行的可见句柄从编号换成标题,界面点开时只传标题、层和版本。
6
+ 但引用文件里一直只存身份(`id`、层、位置),不存标题;服务端却拿请求里的标题去比
7
+ 引用行上并不存在的 `title` 字段,于是每条引用点开都落进 `gone`。这一版先按当前索引
8
+ 解析出标题再比,更新过的引用也能读到最新正文,版本对不上时仍回落到同一标题的现行条目。
9
+ 点开时带上的层也参与筛选:全局和项目各有一条同名记忆时,点哪层读哪层,不按引用先后猜。
10
+
11
+ 回归:`test/contract.test.mjs` 增加按标题打开引用的用例;引用已删、跨会话、跨目录
12
+ 仍然只回 `gone`,不带正文。
13
+
14
+ ## 会话里的引用行只标层
15
+
16
+ `约定 · 全局 · 你记的` 这类拼法把类型、层、来源挤在一行,最该看的层反而不显眼。
17
+ 现在只留层标记:`[全局]`、`[项目]`,学习流程整理出来的再加 `[自进化]`。
18
+ 类型(偏好、约定、流程……)仍存着,供检索和面板使用,不再上会话引用行。
19
+
20
+ ## 两个刷新写法都能想起同一条规则
21
+
22
+ `dsh-unlag` 那条全局规则补了触发词 `Cmd+R`、`⌘R`、`刷新页面`、`热重载`。
23
+ 用户打哪一种写法,都会命中同一条规则,不会再被当成「没说过这个快捷键」。
24
+
25
+ ## 验证
26
+
27
+ `npm test` 全绿;客户端引用行断言覆盖 `[全局]`、`[项目]`、`[全局][自进化]`。
@@ -0,0 +1,13 @@
1
+ # 0.18.13:检索工具不再被自己的 schema 挡住
2
+
3
+ ## 检索工具能返回了
4
+
5
+ `memory_search` 的输出 schema 里还留着内部 id 的必填项,但引用对外早就只给标题和层,工具每次调用都被宿主校验判成无效:
6
+ `missing required property "value.refs[N].id"`。把必填项和属性一起删掉,输出只保留标题、层、版本、状态、来源、类型、适用场景、更新时间。
7
+
8
+ 这不是文案问题:schema 和数据不一致,工具就完全不可用。
9
+
10
+ ## 验证
11
+
12
+ - `memory_search` 在宿主里能正常返回,不再报 schema 错误
13
+ - 输出 schema 与引用行字段一致,契约测试守住
@@ -0,0 +1,13 @@
1
+ # 0.18.14:没提醒时说得清原因
2
+
3
+ ## 面板不再只给一个空结果
4
+
5
+ 自动召回一直有回执,但面板没读它。现在面板按当前会话显示上一次自动提醒的结论:提醒了几条;没提醒时区分「没有匹配」「有相关但条件未确认」「有匹配但本轮条数用满」「记忆已关闭」「只在你问时检索」。
6
+
7
+ 条件未确认原先会被算成「没有匹配」——因为自动召回只收完全适用的条目,只看默认召回分不清「没人提过」和「有人提过但条件没确认」。现在没命中时多发一次只看字面匹配的排序,把后一种,以及同主题两条规范互相冲突、还没定用哪条的,都报成 `needs_context`,并带上相关条数。注入给模型的文本一个字节都没变。
8
+
9
+ ## 验证
10
+
11
+ - 面板头部显示「上次自动提醒 N 条」或对应的没提醒原因
12
+ - 条件未确认的候选不再误报成没有匹配,契约测试守住
13
+ - 回执只给结论和条数,不带原因码、内部编号或正文
@@ -0,0 +1,5 @@
1
+ # 0.18.15:晚到的回执不拉回旧项目
2
+
3
+ - 面板里切换项目后,之前那个项目还没回来的保存、开关、演进回执一律丢弃,不再把列表和正文换回旧范围。
4
+ - 项目选择本身立即生效;概览请求仍只认最后一次,旧请求晚到也不覆盖。
5
+ - 不改变任何记忆内容与判定;只修界面读写的范围边界。
@@ -0,0 +1,21 @@
1
+ # dsh-lite-memory 0.18.2
2
+
3
+ 自动召回和手动搜索对英文查询给同一个答案;对外说明改成能核对的事实。
4
+
5
+ ## 英文整词判断统一
6
+
7
+ 自动召回原来按包含判断匹配英文:查询 `git` 会命中标题 `Digital asset catalog`,因为 digital 里有 git。手动搜索早先已有整词检查,所以同一句话在两个入口给出相反结果——一边把不相关的卡片放进上下文,一边返回没有结果。
8
+
9
+ 现在整词规则只有一份,放在 `view.js`,自动召回、手动搜索共用:查询不含中文时,英文词必须在标题、旧标题、标签、触发词、摘要或适用条件里按整词出现,否则不算相关。
10
+
11
+ 回归样例进 `test/recall.test.mjs` A24:同一条记忆、同一个查询,自动注入不出现该标题,`store.search` 返回 0 条。
12
+
13
+ ## 对外表述与实现对齐
14
+
15
+ - 包描述与 README 首段不再写「nothing in the system prompt」:实现的是一份不常驻的上下文槽,未命中的轮次不追加内容,命中时最多三张卡片(标题、编号、摘要、前提),受固定字节预算。
16
+ - `TRIGGERS.md` 里「从不进 system prompt」改成同样的口径,去掉两处互相矛盾的描述。
17
+
18
+ ## 验证
19
+
20
+ - `npm test` 全绿。
21
+ - ui-copy 485 error(与 0.18.1 相同),zh-lint 0 error,impeccable 空,style-lint 0/0/0/0/0。
@@ -0,0 +1,16 @@
1
+ # 0.18.3
2
+
3
+ 修两处「不该自己扩大授权」的行为,其余行为不变。
4
+
5
+ ## 从上一版恢复不再静默打开记忆
6
+
7
+ `state.json` 损坏或丢失时,`state.prev.json` 是关闭总开关之前的快照;原来直接采用它的 `control`,等于把用户关掉的记忆重新打开。现在两条恢复路径都写 `{ enabled:false, recoveryPending:true }`,恢复后保持关闭,等用户重新开启;面板与工具文案会说明「刚从损坏里恢复,需要你重新开启」,而不是让人以为是自己关的。
8
+
9
+ ## 整理兜底不再把一句要求抬成全库规则
10
+
11
+ 整理器返回空时,`pendingChangeFrom()` 原来硬写 `applicability: 'all_in_scope'`,于是「以后口播开头先给结论」这种没说范围的话会变成全项目规则。现在按文本与反馈线索判定:说到「所有 / 一律 / 默认 / 这个项目」才按全项目收;有 `taskKind` 就挂条件(`conditional`);都没有就 `unresolved`,等确认。范围没定的条目即使已经生效,也会因为适用条件未确认而不进上下文。
12
+
13
+ ## 验证
14
+
15
+ - `npm test` 全绿(`test/ha.test.mjs` 8 项、`test/learning.test.mjs` 51 项,其余同 0.18.2)。
16
+ - 新增回归:恢复后仍关闭且需重新开启;三种兜底范围判定。
@@ -0,0 +1,15 @@
1
+ # 0.18.4
2
+
3
+ 一轮里读了两次、两次都被同一条适用条件拦下时,聊天会显示两行一模一样的提示。这次只修这个。
4
+
5
+ ## 重复行只留一行
6
+
7
+ 拦截结果不返回编号和标题(`id` 为空),两次读的载荷因此逐字节相同,按编号去重认不出来。现在 `client.js` 按「曝光类型 + 文案 + 正文」认身份:同一轮里同键只显示第一次出现的那行,其余行留在 DOM 里但隐藏。不加计数、不写「共 N 条」,也不打印任何内部编号。
8
+
9
+ 文案相同但来源不同(`memory_search` 与 `memory_read` 恰好说同一句话)不合并;只有一条时不受影响。
10
+
11
+ ## 验证
12
+
13
+ - `npm test` 全绿,`test/client.test.mjs` 22 项。
14
+ - `client.js` gzip -9 = 35301 字节(上限 40960)。
15
+ - 四条 lint:ui-copy 484 error(与基线同)、zh-lint 0 error、impeccable 无输出、style-lint 五项 0。
@@ -0,0 +1,21 @@
1
+ # 0.18.5:内部编号退出所有文案
2
+
3
+ ## 用户看到的变化
4
+
5
+ - 召回卡、搜索结果、实验规则、关联记忆都只给标题与适用范围,不再出现 `mem_…` 这类编号。
6
+ - 读正文、忘掉一条,改成按标题指名:`memory_read { title }`、`memory_forget { title }`。
7
+ 标题在项目层和全局层各查一次,重名时只报「有几条同名」,让模型先对齐标题而不是编编号。
8
+ - 更新一条记忆也用同一个标题重存:标题就是身份,改标题才是改身份。
9
+ - 相近提示、冲突提示、过期关联行同样只报标题。
10
+
11
+ ## 兼容
12
+
13
+ - 工具参数里的 `id` 仍然接受(旧调用、脚本、面板 HTTP 接口不受影响),只是不再展示,也不再要求传。
14
+ - 面板内部请求继续用编号定位,编号不出现在任何界面字符串里。
15
+ - 数据格式、`state.json`、冷存文件不变,无需迁移。
16
+
17
+ ## 回归
18
+
19
+ - `npm test` 全绿;新增断言:召回卡、搜索行、save 提示、read 输出、实验规则、索引行都不含 `mem_/sug_/cf_` 编号。
20
+ - `client.js` gzip 34983 B(上限 40960)。
21
+ - 文案 lint:ui-restraint 482 error(基线 484)、zh 0 error、style-lint 5 项 0。
@@ -0,0 +1,18 @@
1
+ # 0.18.6:单字沾边不再触发召回
2
+
3
+ ## 问题
4
+
5
+ 「把这段视频的字幕导出来」会把「以后都用这个一次性脚本」召进上下文。原因是分词把整句切成单字,
6
+ `这` 出现在标题的 `这个` 里就算整词命中,一个词加一次分,三个单字把分数堆过阈值。
7
+
8
+ ## 改动
9
+
10
+ - 汉字二元组在分词只有单字时补上,单字不再当整词。
11
+ - 整词命中改成「按字段取一次最大值」,同字段不再逐词累加。
12
+ - 匹配分只在真正有实质重合时才过阈值;`MATCH_FLOOR` 不变。
13
+
14
+ ## 回归
15
+
16
+ - 新断言:`把这段视频的字幕导出来` 对那条记忆得分 0;真实相关句仍过阈值。
17
+ - `npm test` 全绿;恢复用例里原本被绕过的误触发句子。
18
+ - `client.js` gzip 34983 B。
@@ -0,0 +1,23 @@
1
+ # 0.18.7:召回措辞放宽,误触发收紧
2
+
3
+ ## 改动
4
+
5
+ - 查询与记忆有四个字以上的连续重合时算强命中:句子换了说法、词还连着,就该被想起。
6
+ - 连续重合只在基础分不够时才算,且只比前 120 个字,单次排序代价压在 10 ms 内(400 条记忆实测)。
7
+ - 分词补齐汉字二元组,单字不再当整词命中;整词加分按字段取一次。
8
+
9
+ ## 30 条固定样本
10
+
11
+ 新增 `test/eval-seed.test.mjs`,跟着 `npm test` 跑:
12
+
13
+ | 分组 | 条数 | 判据 | 结果 |
14
+ | --- | --- | --- | --- |
15
+ | 该召回 | 10 | 目标进前三 | Recall@3 1.0 |
16
+ | 该拒绝 | 10 | 一条都不出现 | 误触发 0 |
17
+ | 该等条件 | 10 | 条件未确认时不出现在上下文 | 外泄 0 |
18
+
19
+ 另加两条:条件确认后同一条变得可用;换了说法仍能召回。
20
+
21
+ ## 回归
22
+
23
+ `npm test` 全绿;`client.js` gzip 34983 B。
@@ -0,0 +1,18 @@
1
+ # 0.18.8:不再用「额度已用完」挡人
2
+
3
+ ## 问题
4
+
5
+ 自动召回把这一轮的记忆用量填满之后,任何一个 `memory_read` 都只回一行「本请求的记忆额度已用完」。
6
+ 用户已经点名要读某条记忆,得到的却是一句没法处理的内部记账,且下一条消息之前完全没有出路。
7
+
8
+ ## 改动
9
+
10
+ - 工具自己取的记忆单列一笔(6144 B / 单轮),自动注入用满不再连带挡住按标题读正文、查关联。
11
+ - 仍是硬上限:单轮正文 3 条、处理 8 次、字节封顶,越界照旧拒绝。
12
+ - 越界时说的是后果与下一步,不说「额度」:「这条消息已停止读记忆,下一条消息再读」。
13
+ - 面板自进化状态同改:「这轮先整理这些,下一条消息接着整理」。
14
+
15
+ ## 回归
16
+
17
+ - 新增用例:自动注入占满 8192 B 之后,按标题读正文仍返回完整正文。
18
+ - `npm test` 全绿;`client.js` gzip 35000 B。
@@ -0,0 +1,24 @@
1
+ # 0.18.9:句柄统一用标题,召回排序更认「两个概念都落在标题」
2
+
3
+ ## 为什么会话里反复去翻 state.json 找编号
4
+
5
+ 更新一条记忆(`updateTitle`)、关联两条记忆(`links[].title`)、绑定同一主题(`sameTopicAs.title`)
6
+ 以前都要内部编号。编号在结果里出现、参数表又要编号,模型就拿去当句柄用;编号对不上时只能翻磁盘。
7
+ 这一版把这三处都改成抄标题:
8
+
9
+ - `memory_save.updateTitle`:给原样标题就更新那一条;没有这条记忆时直接说明,不静默新建。
10
+ - `memory_save.links[].title`:按标题解析成内部 id 再落盘,标题对不上就拒写,不写半条。
11
+ - `memory_save.sameTopicAs {scope, title}`:绑到同层某条的主题槽位,不再要 revision。
12
+ - 参数表里不再出现 `id`、`mem_` 形态的字段;`supersedes` 也只收标题(旧调用传 id 仍认)。
13
+
14
+ ## 召回排序:标题里两个独立概念同时命中,加权
15
+
16
+ 「本机凭据位置:npm 发布与 GitHub 推送」这类规则标题里带着查询的两个不同实词,
17
+ 以前只按「命中一个词」记一次分,容易和无关条目同分,按上限截断时被挤掉。
18
+ `view.matchScore` 增加 coverage 项(1.6 分):标题/别名里命中的不同实词 ≥ 2 时加分,
19
+ 同分情况明显减少;通用词仍按语料 df 降权,不靠「文件」「项目」这种词刷分。
20
+
21
+ ## 兼容
22
+
23
+ - 存储形态不变(关联仍存内部 id),读正文、关联读取、面板访问范围不变。
24
+ - 默认召回上限仍是 3 条 / 1200 字节,阈值不变;这次只改排序,不放开闸门。