dsh-instruction-memory 1.2.0 → 1.3.1
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 +77 -0
- package/README.md +37 -0
- package/lib/client.js +416 -8
- package/lib/index.js +345 -72
- package/memory.schema.json +6 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,83 @@
|
|
|
7
7
|
> 1.0.13 起由 CI 经 OIDC Trusted Publishing 发布(首个带 provenance 的版本)。
|
|
8
8
|
> 这些历史 tag **不应回填**——npm 上的版本号已被占用。
|
|
9
9
|
|
|
10
|
+
## [1.3.1] — 2026-10-15
|
|
11
|
+
|
|
12
|
+
1.3.0 发布当天的评审跟进:一个披露计数回归与三个展示层小修正。
|
|
13
|
+
|
|
14
|
+
### 修复
|
|
15
|
+
|
|
16
|
+
- **ui-test 去竞态**:F7 真实定时器冒烟中「暂停后立刻断言注入已静音」与 50ms 定时器存在调度竞态
|
|
17
|
+
(高负载 runner 上定时器可能已过期),改为确定性地断言到期时刻已写入存储文件,并把到期等待
|
|
18
|
+
从 300ms 放宽到 1s。仅测试基建,不影响已发布的包内容。
|
|
19
|
+
- **导入回退去重后的计数披露**:「新增指令 N 条 / 新增用户形象 N 个」按实际落库数(staged)
|
|
20
|
+
统计,不再包含被回退去重跳过的项;截断披露同样只统计实际落库项。80f94f5 引入的口径回归,
|
|
21
|
+
contract-test 新增断言钉住「2 通过 − 1 回退重复 = 新增指令 1 条」。
|
|
22
|
+
- **暂停倒计时与复制路径的三个小修正**:新起暂停时先取当前时刻再起秒表(否则长开面板的
|
|
23
|
+
首帧剩余时间可能偏大最多 1 秒,下一秒自愈);他窗发起暂停时复位暂停菜单展开态;
|
|
24
|
+
剪贴板 execCommand 抛错路径也移除游离的辅助 textarea。均为 1.3.0 评审发现,仅展示层。
|
|
25
|
+
|
|
26
|
+
## [1.3.0] — 2026-10-15
|
|
27
|
+
|
|
28
|
+
两个审查修复与两项体验增强(F12 / F7)。
|
|
29
|
+
|
|
30
|
+
### 修复
|
|
31
|
+
|
|
32
|
+
- **切换配置集时关闭打开中的编辑草稿**:切换成功后同时关闭指令编辑器与用户形象编辑器
|
|
33
|
+
(并退出批量选择模式)。此前留在屏幕上的表单仍显示旧集合的内容,保存时会落进新集合
|
|
34
|
+
(服务端跨集合保护保证不覆盖、不丢数据,但表单本身就是误导)。若切换时确有草稿被关闭,
|
|
35
|
+
会在提示里说明。ui-test 新增回归:打开形象编辑器 → 切换集合 → 断言编辑器消失且有披露;
|
|
36
|
+
并钉住「条目编辑器为整页接管,打开时切换按钮不可达」这一结构事实。
|
|
37
|
+
- **导入回退到激活集合时按目标集合重新去重**:导入条目声明的集合不存在(或已达 20 个上限
|
|
38
|
+
无法创建)时会归入当前激活集合,但去重仍按**声明的集合**计算,可能把与激活集合已有条目
|
|
39
|
+
title+content 完全相同的内容再插一份。现在在提交阶段先确定每项的真实归属,再对回退项
|
|
40
|
+
按目标集合补一次查重(含同批其他回退项与正常落集项之间的互查):重复的不再插入并单独
|
|
41
|
+
计数披露(「另有 N 项因回退到当前配置集后与已有内容重复被跳过」);全部被跳过时保持
|
|
42
|
+
no-op 不写盘。回退目标中 id 已被占用而正文是新内容时改发新 id,不再把重复 id 写进同一
|
|
43
|
+
集合。正常路径(集合存在/成功创建)的幂等性不变——重新导入同一导出文件仍是 no-op。
|
|
44
|
+
|
|
45
|
+
### 新增
|
|
46
|
+
|
|
47
|
+
- **诊断与安全状态集中面板(F12)**:设置页新增可折叠「诊断信息」卡片(默认收起、纯展示、
|
|
48
|
+
无写路由),集中展示存储(路径/在盘/载入来源/最近保存/rev)、注入(注册状态、`pulls`
|
|
49
|
+
自启动计数、字符数/上限)、备份与历史(位置、`.bak`、历史目录与快照数、Schema 文件)与
|
|
50
|
+
全部错误/警告;「复制诊断信息」生成含 `navigator.userAgent` 的纯文本(**不含任何用户文本**,
|
|
51
|
+
剪贴板不可用时降级为手动全选文本框;序列化为导出纯函数 `__diagnosticsText` 并被
|
|
52
|
+
`verify.mjs` 锁定)。快照新增 `security`(`hostGuarded`/`boundHost`,与路由 Host 校验同源)与
|
|
53
|
+
`diagnostics`(`loadedFrom`/`rev`):绑定在非回环地址时页面顶部显示醒目橙色安全警告,
|
|
54
|
+
补上对外发布场景缺失的信号。`docs/demo.html` 桩同步补齐。
|
|
55
|
+
- **临时静音(F7)**:总开关旁「暂停注入…」——30 分钟 / 1 小时 / 到今天结束(本地时区
|
|
56
|
+
24:00),暂停期间指令与形象都不注入(系统提示词与未安装插件逐字节一致),到期由宿主侧
|
|
57
|
+
定时器自动恢复,**无需操作、不写盘(rev 不变)**;状态存于新增的**可选**顶层字段
|
|
58
|
+
`disabledUntil`(epoch 毫秒;0/缺失 = 未暂停;格式版本仍为 2,无迁移;跨重启保留)。
|
|
59
|
+
`set-options` 接受该字段:0 = 立即恢复,过去时间视为 0,超过 7 天上限钳到 now+7d 并披露;
|
|
60
|
+
手动切换总开关清零它(显式开关优先于定时)。注入渲染引入**可注入时钟**:`isMuted(data, now)`、
|
|
61
|
+
`planInjection(data, now = Date.now())`、`buildBlock(data, now = Date.now())`(默认参数仍是
|
|
62
|
+
当前时间,纯函数允许固定 now,字节结果可复现);到期决策 `muteExpired(data, now)` 由
|
|
63
|
+
`syncSection` 末尾的单一定时器消费(每次状态变化先清旧定时器,插件卸载时清理,`unref`
|
|
64
|
+
不阻退出)。客户端提供暂停菜单、剩余时间倒计时(1s interval,随暂停状态自动建立/清理)
|
|
65
|
+
与「立即恢复」;`memory.schema.json`、README、demo 桩同步更新。
|
|
66
|
+
|
|
67
|
+
### 测试
|
|
68
|
+
|
|
69
|
+
- contract-test:导入回退去重六组回归(激活集合重复 / 20 集上限 / 批内互查 / 形象重复 /
|
|
70
|
+
id 重发 / 跨集同文不误伤);先红后绿验证(回退修复后新用例失败)。
|
|
71
|
+
- ui-test:切换集合关闭草稿回归;同以 stash 验证测试有效性。
|
|
72
|
+
- smoke-test:isMuted 真值表与 muteExpired 到期决策;planInjection/buildBlock 注入时钟在
|
|
73
|
+
暂停前/后的字节一致性(暂停中 ≡ enabled:false;到期后 ≡ 未暂停);形象随暂停一起置空;
|
|
74
|
+
时钟参数可省(arity = 1)。
|
|
75
|
+
- contract-test(F7/F12):set-options disabledUntil 写入/披露/过去归零/7 天钳制/随总开关
|
|
76
|
+
清零/非法拒绝;暂停中快照 injection.muted=true、registered=false、preview 为空;存储文件/
|
|
77
|
+
导出/restore 往返/源码模式携带该字段;手改非法值载入时重置并披露;F12 security/diagnostics
|
|
78
|
+
字段存在且 hostGuarded 随绑定地址变化(回环 vs 0.0.0.0)。
|
|
79
|
+
- verify.mjs:__diagnosticsText 输出含关键字段、含环境信息、不含条目/形象/预演文本;
|
|
80
|
+
schema 记录 disabledUntil(integer ≥ 0);F12/F7 双语键组检查。
|
|
81
|
+
- ui-test(F12/F7):诊断卡片展开/收起与复制降级路径(无剪贴板 → 可手动全选的转储,断言
|
|
82
|
+
不含用户文本);非回环绑定警告出现/消失(第二宿主实例真实切换绑定);暂停菜单三档 →
|
|
83
|
+
状态条倒计时 → 立即恢复;50ms 真实定时器到期自动恢复(文件字节不变的到期语义)。
|
|
84
|
+
ui-test 垫片补上 React 的 effect cleanup 语义(重跑前先清理),倒计时 interval 不再泄漏到
|
|
85
|
+
后续断言。
|
|
86
|
+
|
|
10
87
|
## [1.2.0] — 2026-10-15
|
|
11
88
|
|
|
12
89
|
P2 进阶增强:多情境配置集、版本历史与回滚、手改友好化(JSON Schema)、源码模式、
|
package/README.md
CHANGED
|
@@ -80,6 +80,17 @@ dsh plugin --profile web remove dsh-instruction-memory
|
|
|
80
80
|
总开关关闭时,该提示词段落(指令与用户形象)**整个注销**,系统提示词与未安装本插件时逐字节一致;
|
|
81
81
|
总开关开启但没有任何生效指令、也没有启用形象时,段落同样不出现。
|
|
82
82
|
|
|
83
|
+
### 临时静音(暂停注入一段时间,F7)
|
|
84
|
+
|
|
85
|
+
总开关旁提供「暂停注入…」:**30 分钟 / 1 小时 / 到今天结束**(本地时区 24:00)。暂停期间
|
|
86
|
+
指令与用户形象**都不注入**,系统提示词与「未安装本插件」**逐字节一致**;到期由插件内的
|
|
87
|
+
宿主侧定时器**自动恢复**——无需用户操作,也不产生写盘(存储文件与修订号不变)。暂停
|
|
88
|
+
状态保存在存储文件的 `disabledUntil` 字段里(仍是格式版本 2 的可选字段,缺失即未暂停),
|
|
89
|
+
因此**跨重启保留**。手动切换总开关会立即清除暂停(显式开关优先于定时)。设置页在暂停中
|
|
90
|
+
显示剩余时间倒计时,并可随时「立即恢复」;倒计时只是展示,权威判定始终在宿主快照
|
|
91
|
+
(`injection.muted`)里。到期判定与注入渲染都是**可注入时钟**的纯函数(`isMuted`、
|
|
92
|
+
`planInjection(data, now)`),相同输入永远得到相同字节。
|
|
93
|
+
|
|
83
94
|
## 存储
|
|
84
95
|
|
|
85
96
|
记忆保存在 **DSH 数据根目录**下(设置页会显示完整绝对路径):
|
|
@@ -350,6 +361,26 @@ DSH 就会得到第二份空记忆,看起来像"记忆消失"。
|
|
|
350
361
|
**逐字节相同**(`verify.mjs` 有断言锁定这一点)。`debug` 级别由宿主日志级别过滤;
|
|
351
362
|
没有 logger 服务的环境下需要 `DSH_INSTRUCTION_MEMORY_DEBUG=1` 才会输出到标准错误。
|
|
352
363
|
|
|
364
|
+
### 诊断与安全状态面板(F12)
|
|
365
|
+
|
|
366
|
+
设置页的「诊断信息」卡片把散在快照里的排障信息集中展示(默认收起,纯展示、无写路由):
|
|
367
|
+
|
|
368
|
+
- **存储**:路径、是否已在磁盘、载入来源(`loadedFrom`:首次创建 / 采用现有文件 / `.bak`
|
|
369
|
+
恢复 / 旧版迁移等)、最近保存时间、修订号(rev);
|
|
370
|
+
- **注入**:是否已注册、`pulls` 拉取计数(**自本次插件启动**,含义见上文)、当前字符数 / 上限;
|
|
371
|
+
- **备份与历史**:备份位置、是否默认、`.bak` 覆盖副本路径、版本历史目录与快照数、Schema 文件位置;
|
|
372
|
+
- **错误与警告**:存储错误 / 存储警告 / 历史错误 / 注入错误原样显示。
|
|
373
|
+
|
|
374
|
+
「复制诊断信息」把以上内容序列化成纯文本(附 `navigator.userAgent`、语言与当前时间,
|
|
375
|
+
便于提 issue)。它**绝不包含条目正文、形象内容等用户文本**;剪贴板 API 不可用时降级为
|
|
376
|
+
`execCommand` 复制,再不可用则把文本放进可手动全选的文本框(序列化逻辑是导出的纯函数
|
|
377
|
+
`__diagnosticsText`,`verify.mjs` 断言其输出含关键字段且不含任何用户文本)。
|
|
378
|
+
|
|
379
|
+
卡片同时补上了此前缺失的唯一安全信号:**`security.hostGuarded`**。设置路由绑定在**非回环
|
|
380
|
+
地址**(主动对外发布)时,页面顶部会出现醒目橙色警告:同一网络内的设备可无鉴权访问此页面、
|
|
381
|
+
请勿在不可信网络暴露,并指向下节「经反向代理对外发布」。该判定与路由实际执行的 Host 校验
|
|
382
|
+
是**同一个开关**;快照同时携带 `boundHost`(路由注册时捕获的绑定地址),警告会点名具体地址。
|
|
383
|
+
|
|
353
384
|
## 请求来源防护(Host / Origin)
|
|
354
385
|
|
|
355
386
|
设置页路由之所以要求 `content-type: application/json`,是因为 HTML 表单无法伪造 JSON body,
|
|
@@ -579,6 +610,7 @@ Package → Settings → Trusted publishing → Add trusted publisher
|
|
|
579
610
|
"version": 2,
|
|
580
611
|
"rev": 3,
|
|
581
612
|
"enabled": true,
|
|
613
|
+
"disabledUntil": 0,
|
|
582
614
|
"budgetChars": 4000,
|
|
583
615
|
"backupDir": "",
|
|
584
616
|
"activeSetId": "st-default",
|
|
@@ -626,6 +658,11 @@ Package → Settings → Trusted publishing → Add trusted publisher
|
|
|
626
658
|
`backupDir` 为**本机**的自定义备份位置(留空 = 与存储文件同目录,最多 512 字符);它不是
|
|
627
659
|
可移植内容,从备份恢复时不会被改写。
|
|
628
660
|
|
|
661
|
+
`disabledUntil` 为**临时静音**(F7)的到期时刻(epoch 毫秒):`0` 或缺失 = 未暂停;未来值 =
|
|
662
|
+
暂停中,到期由插件自动恢复(无需操作、不写盘、rev 不变),跨重启保留。手动切换总开关会
|
|
663
|
+
清零它(显式开关优先于定时)。这是格式版本 2 的**可选**字段:旧文件缺失即未暂停,不触发
|
|
664
|
+
迁移;手改成非法值(非数字/负数)会被重置为 0 并在设置页披露。
|
|
665
|
+
|
|
629
666
|
`profiles` 为可选的**用户形象**数组(缺失按空数组处理):`name` 单行不超过 40 字符,
|
|
630
667
|
`content` 不超过 4000 字符,最多 50 个;`enabled` 控制是否使用该形象。名称与内容同时为空的形象会在
|
|
631
668
|
载入时剔除并明确披露;名称为空时自动取内容前 20 字符。
|