Repository navigation
Releases: zeusxx/dsh-composer-live
Releases · zeusxx/dsh-composer-live
Release list
v0.2.22
v0.2.21
插件市场元数据补全(用户在 dshmarket 市场条目发现信息不全):宿主声明、插件图标、双语描述门面。
- 新增
dsh.engines.dsh: ">=0.1.5-rc.2"宿主声明——此前市场条目显示「未声明宿主要求」标签;声明后插件管理器的版本兼容判断与市场信息都有明确依据。 - 新增插件图标(
assets/icon-180.png/icon-256.png):墨底圆角方 + 青瓷闪电 + 暖白光标线(Chrome 矢量渲染截图生成);package.json增icon字段,npm files 白名单与发布白名单同步收录。 - package.json description 英文化精炼(旧的是中文长句,npm 搜索与英文市场不友好):
Type Markdown, see it rendered live — Open-WebUI-style composer for DeepSeek Harness (DSH) web. … - README(双语)顶部品牌化:居中 logo + 标题 + 一句话卖点 + 徽章居中。
- 同步更新 GitHub 仓库 description / homepage(市场英文描述的抓取源)。
v0.2.20
demo GIF 重录:修正分镜与列表自动续项的交互,任务勾选框与代码块补全过程正确呈现。
- 0.2.18 的 GIF 分镜在列表行尾按 Shift+Enter 后又手打了
-——续项功能已自动补前缀,实际文本变成- - [x](双横线嵌套),勾选胶囊的渲染条件不满足,GIF 里勾选框没出现(用户指正)。 - 修正后的分镜顺着续项行为:Shift+Enter 接受自动补的
-直接打[x]…(勾选胶囊正常渲染),任务行后空项再按一次 Shift+Enter 顺带演示「空项退出列表」,然后围栏补全成代码块。 - 画面防线加固:hero 态优先(不再点「选择工作区」——进工作区会展开侧栏露出真实工作区名);
[class*="workspaceLabel"]隐藏(hero 输入组顶部的工作区选择器);顶部遮罩 52→100px。DOM 级验证:dsh-cl-task-done勾选胶囊、dsh-cl-dl删除线、dsh-cl-tok-*语法高亮 class 全部在位。
v0.2.19
v0.2.18
文档与发布物料更新(功能零变更)——README 双语大修 + 首个动态演示 GIF。
- 新增动态演示 GIF(
docs/screenshots/demo.gif,960×540、109 帧、1.8MB):真实逐字打字过程——行内四件套(粗体/行内代码胶囊/斜体/删除线)、列表与任务项、```js围栏自动补全成代码块并语法高亮,一镜到底。录制脚本e2e/capture-demo-gif.mjs(CDP screencast + trusted 逐字打字通道,随仓库工具链留档,发布白名单不含)。 - README(中英双语)五处增强:顶部嵌入演示 GIF;徽章更新为「206 单测 · 129 E2E」;新增「实测版本」表(0.1.5-rc.2 / 0.2.0-rc.2 / 0.2.1-rc.5 三代全绿,双环境 E2E 是本插件独有的质量承诺);新增「与其它输入框插件的关系」对比表(composer-plus / composer-enter / prompt-history 互不重叠可共存);新增「反馈」段(issue 入口)。
- 修正过时数字:单测 188→206、E2E 62→129 场景。
- npm keywords 增补(live-preview / toolbar / format / paste)。
v0.2.17
渲染性能大优化:空闲主线程占用 98% → 0、打字帧率 6fps → 125fps(200 行文档实测)。
- 问题画像(diag-perf 基准,200 行文档):优化前空闲 10 秒 161 次全量渲染(16 次/秒)共 9.8 秒长任务(98% 主线程占用);打字 60 字 140 次渲染、帧中位 175ms(≈6fps);拖选扩选 20 次触发 75 次渲染。
- 根因:① MutationObserver 观察整个
document.body——页面上其它组件(皮肤中心/费用统计/React 渲染)的任何 DOM 活动都转化为本插件的全量渲染;②selectionchange无合帧直通 render,拖选以指针级频率触发;③ 500ms 兜底轮询每轮全量;④ 每次渲染全量无短路——3000 字符逐个getBoundingClientRect+ 每行 DOM 解析 tokenize +innerHTML整块重建。 - 修法四件:① 渲染签名短路——内容 + 光标行 + 相对几何(相对 overlay 的坐标,滚动天然零重渲染)+ 字体栈 + 主题色全部相同则跳过测量与重建(只更新随精确光标变的工具栏高亮);② 行级测量缓存——行的字符 rect 只依赖行文本与行起点,key=行文本、布局代(字体/几何/主题)变化整体作废、命中后验证行首字符 x/y(前行动态折行会平移本行)不过则重测,200 行文档从 ~3000 次测量降到 ~300 次验证;③
selectionchangerAF 合帧;④ MutationObserver 回调过滤到输入卡内(卡外噪音由 500ms 兜底轮询覆盖)。 - 顺手清理:
ov.__dshClLineCache死代码(v0.1.x 增量渲染时代的清理残留,缓存本体早已不存在);chip 行不再测量(原版测了但渲染侧整行降级无消费方)。 - 基准对比(diag-perf.mjs 留档):空闲渲染 161→0、长任务 161→0、帧中位 66ms→8ms、heap 110→79MB;打字渲染 140→60(每键恰 1 次)、帧中位 175ms→8ms;扩选渲染 75→1(仅跨行那次)。
- 已知边界:超大文档(200 行级)连续打字时每次内容变化仍全量重建 overlay(段 HTML 解析+布局,剩余长任务的主要构成,实测中位帧 8ms 可接受);行级 DOM 差量更新属边际收益未做。
- L0 单测 206 项通过;双环境 129 场景全绿。
v0.2.16
选中一段文字加粗/斜体/行内码后,选区后面的字消失(用户实测反馈「翻转头去选择一部分文字用 Ctrl+B,在它后面的有一些字就消失了」)。
- 根因(行内路径):
applyWrapAction的光标恢复用requestAnimationFrame、选区替换用setTimeout(0)的 execCommand——页面有高频渲染活动(caret 闪烁/React 动效)时 rAF 会在被 clamp 的定时器之前执行,把 DOM 选区改写成[start, start+insert.length),随后的 execCommand 就地替换该选区 → 恰好吞掉 insert 标记字符数(bold 为 4 个)的正文。是否触发取决于 keydown 时刻的帧相位:用户自然操作节奏经常踩中(diag-ctrlb-rate 在活跃页面 100% 复现),单行全选/尾部选区恰好不敏感(旧 E2E 的 Q6 因此漏检)。 - 根因(跨行路径):选区含换行(
act.insert含\n)时直接对选区跑insertInline的 beforeinput 逐行序列——与 Lexical 内部 selection 状态不同步(Tab 块缩进当年同款坑),产生内容丢失/重复(diag-ctrlb 的 C1/B4 实锤)。 - 修法:行内分支光标恢复改为排在 execCommand 完成之后的 setTimeout 链(时序上不可能再先于插入);跨行/代码块分支改走「先删后插」三步链(重建选区 → 合成 deleteContentBackward → commit 后光标落 start → 插入完整内容 → 恢复选区)。
- E2E 体系大扩充(62 → 129 场景):S 组(12 种用户选择方式——真实鼠标拖选/双击选词/三击选段/Shift+Click/Shift+方向键/行选择,CDP trusted 事件)+ W 组(20 种格式化形态——行首/行中/行尾/跨行 br/字面 \n/行尾边界/光标态/嵌套/链式/含标记/含 emoji/列表引用行内/撤销)+ X 组(10 个 CDP trusted 逐字打字通道场景——合成 beforeinput 逐字符在 Lexical 下失效(只进 1 字),此前矩阵根本没有真实打字通道)+ D 组(9 种删除变体——选中删/替换删/Ctrl+Backspace 删词/跨行合并)+ U 组(7 条撤销重做链)+ P 组(5 个刷新多 p/粘贴通道格式化)。
- 测试基建修三层假阴性(都由本次「测不出用户 bug」倒逼出来的):① runner 的
cdp.eval缺awaitPromise:true——所有 async op 的断言失败值被丢弃(拿到空对象=恒 PASS);② headless 空闲页面 compositor 降频、rAF 稀疏——时序竞争路径根本不执行,stressWrap 内置「每帧真实重绘」的 rAF 心跳还原真实用户页面节奏;③ 单次断言对帧相位敏感——stressWrap 用「execCommand 时刻选区」确定性断言(插入前选区被改写即报错,与帧相位无关)+ 12 轮 0-80ms 相位扫描 + 文本精确比对双保险。 - 新增 CDP trusted op(run-e2e.mjs 拦截执行,合成事件不触发浏览器默认行为的结构性盲区):
cdpType(Input.insertText 逐字打字)/cdpKey(trusted keydown)/mouseSelect(真实鼠标拖选)/dblClick/tripleClick/shiftClick;页内新增 op:typeChars(execCommand 逐字符)/deleteKey(前向删除)/selectWord/expectSel(选区投影区间断言)/stressWrap(时序压力探测器)。 - 单测 188 → 206 项(
_decideWrapAction此前零覆盖,补 18 条形态测试)。
v0.2.15
v0.2.14 的工具栏迁出与本次修复一同发布(0.2.14 版本号未单独发布)。
输入 / 命令/技能名时文字无颜色、hover 被色块遮挡(用户 0.2.1 实测反馈)。
- 根因:0.2.x 官方把
/anatomy这类技能命令识别为「文本引用装饰」[data-composer-text-ref]——span 带color: var(--dsw-alias-state-business-primary)(主题引用色)与:hover { background: var(--dsw-alias-state-business-tertiary) }。插件把编辑器文字-webkit-text-fill-color: transparent后由 overlay 重绘,装饰的color因此不可见(文字显示为普通正文色);而 hover 背景留在编辑器层(z-index: 1,画在 overlay 之上),会整块盖住渲染文字。 - 修法:
buildAnchors记录[data-composer-text-ref]的投影区间(挂在anchors.refs),renderCharOverlay按绝对 offset 给对应字符加dsh-cl-refclass,颜色取同一主题变量--dsw-alias-state-business-primary(明暗主题自动跟随,取不到时回退#3b82f6);同时注入[data-composer-text-ref]:hover { background: transparent !important }禁掉编辑器层 hover 背景,杜绝遮挡。 - 单测 188 项通过。
工具栏迁出输入卡:放卡外正上方,不再占输入框内部空间(用户反馈「工具栏阻碍输入框空间」)。
- DOM 位置:
.dsh-cl-toolbar从「输入卡内、编辑器滚动容器顶部(v0.2.8 sticky)」迁到「card 的父容器内、card 前一格」——输入卡外、正上方,视觉为与卡等宽的独立细条(36px 高、圆角 12px、明暗两套底色阴影、与卡 6px 间距)。编辑器 padding-top 让位(v0.2.8 的 BAR_RESERVE 6px)随 sticky 体系整体退役,输入框恢复官方原始内距。 - 宽度同步:父容器(
uV2eYG_root,flex column + align-items:flex-start)内容宽 ≠ card 宽,CSSwidth:100%会比卡突出——搬正逻辑每次从card.offsetWidth同步(有差异才写,避免每次 run 触发样式失效)。 - card 重建防双份:工具栏跨 card 重建存活(hero 切换/会话切换后旧工具栏仍留在父容器),setupCard 先查父容器复用(接管
__dshClToolbar/__dshClBtns引用)再谈新建;expand 按钮闭包改findCard()现查(格式键本就现查)。卸载清理改引用直取 +document.querySelectorAll全局兜底(card 已消失时父容器查找清不到)。 - React 重排自愈:官方重建父容器 children 时不认识外来节点,工具栏可能被挤错位——搬正逻辑(每次 setupCard/run 跑)持续拉回 card 前一格。
- 代价说明:工具栏卡外后占文档流 36px,消息区可视高度相应少 36px(消息区自身可滚动,内容无损)。
- E2E:
scrollToolbarop 重写为「卡外位置 + 与卡等宽 + 长文滚动时输入区(工具栏+输入框)整体固定」断言(旧 sticky 钉顶语义退役);toolbarClear查找范围从 card 内改 document 级。场景 R8 更名R8-toolbar-outside-card。 - 单测 188 项通过;8124(0.1.5-rc.2)E2E 全绿后发布。
v0.2.13
发布仓库隐私整改 + E2E 工具通用化(插件本体零改动)。
- 发布仓库 commit 作者身份修正:GitHub 仓库全部历史 commit 的作者已重写为 zeusxx(此前误用本机全局 git 身份)。
- E2E runner 通用化(
e2e/run-e2e.mjs):退役写死本机布局的目标表,改为环境变量推导——DSH_CL_PORT(默认 8124)+DSH_CL_DSH_HOME(默认DSH_HOME,再默认~/.dsh)→ 自动定位部署副本;--target <name>保留为纯别名(报告文件名/日志/传给部署脚本)。cookie 与报告文件统一按端口命名(cookie-<端口>.txt/report-last-<端口>.json);部署副本不存在时跳过版本对照不阻塞;--with-deploy在分发包内(不含部署脚本)给出明确提示。任何布局的实例都能测,不再绑定特定开发机。 - 文档修复:CHANGELOG 0.2.3 条目的字面
`\n`曾被写成真实换行导致 Markdown 列表损坏(本条已修);0.2.4 条目对 CLAUDE.md 的失效引用改指e2e/README.md;README 双语的 E2E 场景数 53→62 更正。
v0.2.12
E2E 测试体系升级为双环境 62 场景(插件本体零改动——本版是测试基建与发布配套)。 v0.2.11 的插件代码在 dsh 0.1.5-rc.2 与 0.2.0-rc.2 两个环境各跑一轮 62 场景全绿,本版把这套测试能力作为包内容发布。
--target <8124|020>双测试目标:一套脚本测多个 dsh 版本(0.1.5-rc.2 / 0.2.0-rc.2),TARGETS表可扩展新版本;报告文件按目标分开(report-last.json/report-last-020.json)。- 鉴权 cookie 全自动:dsh 0.1.5/0.2.0 对无 cookie 的本机请求会在 Set-Cookie 里直接发一个 30 天授权 cookie——runner 自动获取并存
cookie-<端口>.txt,不再需要从 DevTools 手动复制。 - 0.2.0 首访 modal 弹窗自动关闭:新浏览器 profile 首次打开 0.2.0 会弹「预览版说明」modal,其焦点陷阱会让
input.focus()、execCommand、合成 beforeinput 全部失效(症状是「时灵时不灵」的插入与删除)——runner 内置dismissDialogs自动点「继续」;弹窗未关闭时的测试结果全部作废。 - 新增 R 组 9 场景(53→62):图片附件在场(打字渲染 / 长文本滚动 / @ 候选菜单贴输入框——对应 v0.2.6-0.2.8 三个附件 bug 的回归)、全选替换 + Ctrl+Z 撤销、Ctrl+Y 重做、窄视口软折行、注入后改视口重排、长文滚动工具栏 sticky 钉顶、空文档基线。
inpage.jsop 集扩充:attachImage/detachImages/toolbarClear/scrollToolbar/menuNearInput/snapshotClass;op 改 async(runner 侧 awaitPromise);clearDraft改用Range.selectNodeContents(execCommand("selectAll")在焦点不在编辑器内时会溢出到页面级)。- 视口控制:场景可声明
viewport/resizeAfter(Emulation.setDeviceMetricsOverride),覆盖窄窗口软折行与 resize 重渲染路径。 - INV-8 白名单:0.2.0-rc.2 刷新页面时 sidebar.footer slot 第三方插件的 React #130 噪音(官方错误边界兜住、与输入框插件无关)。
- 部署脚本
deploy.mjs同步支持--target(不进发布包,随私有仓库分发)。