Skip to content

Releases: zeusxx/dsh-composer-live

v0.2.22

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 06:56

图标空白修复:0.2.21 的图标生成脚本漏设视口尺寸——Chrome 默认视口约 800×600,180px 的 SVG 缩在左上角,整幅截图 90% 是白色空白(README 顶部与市场引用都是「一小角图标+大片空白」)。补 Emulation.setDeviceMetricsOverride + 截图 clip 后重生成,图标主体铺满画幅。

v0.2.21

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 06:48

插件市场元数据补全(用户在 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

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 06:06

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

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 05:38

README 图片引用改为 GitHub 绝对 URL(npm 包页面渲染修复)。 npmjs.com 不解析包内相对路径图片——0.2.18 的 demo GIF 与三张截图在 npm 页面会显示破图。全部改为 raw/main 绝对链接,GitHub 与 npm 双端正常渲染。GitHub 仓库同步补齐了全部 8 个版本的 Release(含正文)并加上 dsh-plugin topic(dsh-plugin.org 自动发现收录)。

v0.2.18

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 05:32

文档与发布物料更新(功能零变更)——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

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 05:32

渲染性能大优化:空闲主线程占用 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 次验证;③ selectionchange rAF 合帧;④ 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

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 05:32

选中一段文字加粗/斜体/行内码后,选区后面的字消失(用户实测反馈「翻转头去选择一部分文字用 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

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 05:32

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-ref class,颜色取同一主题变量 --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 宽,CSS width:100% 会比卡突出——搬正逻辑每次从 card.offsetWidth 同步(有差异才写,避免每次 run 触发样式失效)。
  • card 重建防双份:工具栏跨 card 重建存活(hero 切换/会话切换后旧工具栏仍留在父容器),setupCard 先查父容器复用(接管 __dshClToolbar/__dshClBtns 引用)再谈新建;expand 按钮闭包改 findCard() 现查(格式键本就现查)。卸载清理改引用直取 + document.querySelectorAll 全局兜底(card 已消失时父容器查找清不到)。
  • React 重排自愈:官方重建父容器 children 时不认识外来节点,工具栏可能被挤错位——搬正逻辑(每次 setupCard/run 跑)持续拉回 card 前一格。
  • 代价说明:工具栏卡外后占文档流 36px,消息区可视高度相应少 36px(消息区自身可滚动,内容无损)。
  • E2E:scrollToolbar op 重写为「卡外位置 + 与卡等宽 + 长文滚动时输入区(工具栏+输入框)整体固定」断言(旧 sticky 钉顶语义退役);toolbarClear 查找范围从 card 内改 document 级。场景 R8 更名 R8-toolbar-outside-card。
  • 单测 188 项通过;8124(0.1.5-rc.2)E2E 全绿后发布。

v0.2.13

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 05:32

发布仓库隐私整改 + 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

Choose a tag to compare

@zeusxx zeusxx released this 01 Nov 05:31

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.js op 集扩充: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(不进发布包,随私有仓库分发)。