Skip to content

Releases: Suguyun/dsh-insight

dsh-insight 0.1.9

Choose a tag to compare

@Suguyun Suguyun released this 23 Sep 10:52

修复:侧栏没打开时,不再弹「已更新,请刷新本页」

那条横幅是给「扩展重载后,已打开页面里的内容脚本变成孤儿、划词不再工作」准备的。但在结果只进侧栏的模式下、侧栏又是关闭的,本来就什么都不会发生 —— 再弹一条横幅纯属噪声,而且违背了「只进侧栏」模式下页面保持干净的约定。

收敛边界与那条闸门保持一致:

模式 侧栏关闭 侧栏打开
click-sidebar / auto-sidebar 不提示 提示
click / auto(页面浮窗) 提示 提示

页面浮窗模式不受限制:那种模式本来就会在页面上出东西,缺了它需要解释。

已知近似:孤儿状态下 panelOpen 是本页脚本失效前记住的值(孤儿后收不到推送),所以「侧栏后来才被关掉」这种情况可能仍会提示一次。无害。

升级

npx github:Suguyun/dsh-insight install

装完在扩展页点一次「重新加载」,再刷新目标页面。

测试

新增 tests/test-orphan-quiet.mjs(9 项)。21 个套件、249 项断言全绿。

dsh-insight 0.1.8

Choose a tag to compare

@Suguyun Suguyun released this 23 Sep 10:45

新增:侧栏的「选区原文」可折叠、可就地编辑

折叠:原先它是 max-height: 24vh 的内滚动区 —— 窄侧栏里再套一层滚动区很难用,而且长选区会把「解读」挤到屏幕外。现在超过 160 字默认折叠到约 5 行(底部渐隐提示还有内容),配「展开 / 收起」;展开态本身也有 60vh 上限。头部同时显示字数。

编辑 + 重新解读:划词常常选得不精确(多选了一段、漏了半句),原先只能回页面上重新划一次。现在点「编辑」直接改文字,再点「用这段重新解读」就按改过的内容重来一遍。没改动时按钮禁用 —— 否则等于把同一个问题问两遍。

顺带修一个 hidden 失效的真 bug

hidden 属性的默认 display: none 会被任何 display 声明覆盖。本文件原先散着 5 处逐元素兜底 #x[hidden] { display: none; } —— 同一个坑踩了 5 次;而 #empty 漏配,它的 display: block 会压掉自己的 hidden。

现在换成一条全局规则 [hidden] { display: none !important; },逐元素兜底随之删除。

这个 bug 单元测试查不出来:测试断言的是 .hidden 属性,而失效发生在计算样式上 —— 只有截图能看见。

升级

npx github:Suguyun/dsh-insight install

装完在扩展页点一次「重新加载」。

测试

新增 tests/test-quote-box.mjs(35 项)。20 个套件、240 项断言全绿。

dsh-insight 0.1.7

Choose a tag to compare

@Suguyun Suguyun released this 23 Sep 10:36

修复:某些页面划词毫无反应 —— Selection.isCollapsed 会撒谎

抓取选区的第一行判断是 if (selection.isCollapsed) return undefined;。而实测(Monaco 编辑器)会出现自相矛盾的状态:

window.getSelection().toString().trim().length === 89
window.getSelection().isCollapsed          === true      ← 撒谎

于是这种选区被第一个判断直接丢掉 —— 表现就是「选中了、高亮正常、扩展毫无反应」,而且不留任何痕迹。

修复:判断依据从 isCollapsed 换成文本长度。文本才是「有没有东西可解读」的唯一真相;isCollapsed 现在只用于诊断记录,不再作为闸门。另外,拿不到 getRangeAt(0) 时不再丢弃这次划词,改为退回指针/视口定点 —— 几何问题只应影响浮标位置,不该决定「要不要解读」。

诊断自身也犯了同一个错

0.1.4 加的 capture-miss 诊断里也有 if (s.isCollapsed) return;,所以它一条都没记下来 —— 诊断和被诊断的代码共用了同一个错误假设,导致连续几轮排查都看不到任何信号。

教训:诊断不能复用被测代码的判断逻辑,否则两者会一起错。

这一轮新加的诊断(0.1.5 / 0.1.6)

键 含义
content_ready 脚本开始执行
content_init 初始化跑完、监听器已注册,并记录扩展版本与是否孤儿
content_error 初始化抛异常时的消息与栈顶
settle-first 计时器回调第一次真的跑起来(证明事件到达)
settle-selection 第一次回调时确实有非空选区时的快照

升级

npx github:Suguyun/dsh-insight install

装完在扩展页点一次「重新加载」,再 Cmd+Shift+R 硬刷新目标页面。

测试

tests/test-capture-rect.mjs 增加场景「isCollapsed 撒谎」,断言该状态下仍必须接住选区、摆好浮标、发出解读请求。19 个套件、205 项断言全绿。

dsh-insight 0.1.4

Choose a tag to compare

@Suguyun Suguyun released this 23 Sep 10:24

修复:某些页面划词毫无反应 —— 选区被几何判断丢掉了

症状:在部分网站上选中文字(实测为 Monaco 编辑器),高亮正常、内容脚本也确实注入进了该页面,但扩展毫无反应。

根因:抓取选区时对几何信息要求过严:

rect = selection.getRangeAt(0).getBoundingClientRect();
if (rect.width === 0 && rect.height === 0) return undefined;  // 直接丢弃这次划词

而这类编辑器里 Range 的几何是退化的,实测到过两种取值(同一页面不同时刻):

实测取值 旧代码的后果
{width: 0, height: 0} 命中判断 → 选区被丢弃,连浮标都不建
{width: 0, height: NaN} NaN === 0 为假、躲过判断 → 但 NaN 顺着 Math.max(8, …) 传下去,left/top 被写成 "NaNpx"(无效值被浏览器忽略)→ position: fixed 的浮标落在文档流末尾,用户看不见

两者同源:这类编辑器用 CSS transform 做滚动/排版,嵌套下几何会算出 0 或 NaN。

修复:几何信息坏掉不再等同于「没有选区」 —— 它只影响浮标摆在哪。锚点矩形改为逐级退化:

Range 包围盒 → getClientRects 分段矩形 → 选区所在元素 → 鼠标位置 → 视口定点

每一级都要求四个数都是有限值、且不是空格子,保证写进 style 的永远是合法的 NNNpx。最后两档意味着:即使几何完全拿不到,这次划词也不会被丢掉,只是浮标位置不精确。

新增诊断 capture-miss:当「确实存在非折叠选区、却仍未接住」时记录一次原因,每页只记一次;普通点击不记,所以没有噪声。

升级

npx github:Suguyun/dsh-insight install

装完在扩展页点一次「重新加载」,并刷新目标页面。

测试

新增 tests/test-capture-rect.mjs(20 项),把上述两种实测取值各自钉成场景并覆盖整条退化链。19 个套件、197 项断言全绿。

dsh-insight 0.1.3

Choose a tag to compare

@Suguyun Suguyun released this 23 Sep 10:10

修复:iframe 里的划词完全没反应

症状:在部分网站上选中文字,蓝色高亮正常显示,但扩展毫无反应 —— 没有浮标、没有解读,也没有任何报错。

根因:内容脚本原先第一行就是 if (window.top !== window) return;,只在顶层帧运行。于是正文嵌在 iframe 里的页面(微前端外壳、后台系统、部分在线编辑器)划词彻底失效:选中动作发生在子帧的 document 里,顶层 document 既收不到 mouseup / selectionchange,window.getSelection() 也是空的。

修复:

  • content_scripts 改为 all_frames: true,并加 match_about_blank 覆盖 srcdoc / about:blank 帧
  • 脚本不再按帧提前退出

顺手处理了两处只在多帧下才暴露的问题:

  • 孤儿横幅(「扩展已更新,请刷新本页」)只在顶层帧弹一次,否则每个帧各弹一条,页面上会出现 N 条横幅
  • 上报的页面地址:同源帧用顶层帧 URL(贴近地址栏),跨域帧读不到 top.location 则退回 document.referrer(即内嵌它的那个页面),都没有才用帧自身 URL

升级

npx github:Suguyun/dsh-insight install

装完在扩展页点一次「重新加载」,并刷新那些原本失败的老标签页(扩展重载前打开的页面里,内容脚本已成孤儿)。

测试

新增 tests/test-frames.mjs(9 项)锁定这一行为。18 个套件、177 项断言全绿。

另:file:// 本地文件、PDF 阅读器等非 http(s) 页面注入不了内容脚本,这一条属于浏览器机制,已写进 README 的已知限制。

dsh-insight 0.1.2

Choose a tag to compare

@Suguyun Suguyun released this 23 Sep 09:29

新增

侧栏未展开时不再做解读(针对「结果只进侧栏」的两种模式)。

click-sidebar 与 auto-sidebar 的结果只在扩展侧栏显示。侧栏没打开时既看不到结果、又白跑一次模型 —— 现在这种情况下整个跳过:不发请求,也不弹浮标。侧栏打开后立即恢复。

两种「页面浮窗」模式(click / auto)不受影响:它们的结果画在页面上,本来就不需要侧栏。这个边界是有意的 —— 闸门只关「结果无处可显示」这一种情况。

侧栏开合状态由 background 以侧栏长连接的有无判断,内容脚本启动时问一次、之后由 background 主动推送;此外 background 侧还有一道兜底闸门,防「浮标弹出之后侧栏才被关掉」这类竞态。

其他

  • 跳过时会在内容脚本诊断记录里留一条 skip-sidebar-closed(每页只记一次),免得以后出现「划词没反应」时无从判断。它不是失败,不会污染失败记录。
  • 设置页与 README 补充了该行为的说明。

升级

npx github:Suguyun/dsh-insight install

扩展目录没变(~/Library/Application Support/dsh-insight),重装后在扩展页点一次「重新加载」即可。

测试

17 个自包含套件,会打印计数的那些合计 168 项断言:node tests/run.mjs
新增 tests/test-panel-gate.mjs(15 项)锁住这个行为边界。

dsh-insight 0.1.1

Choose a tag to compare

@Suguyun Suguyun released this 23 Sep 09:00

修一个安装目录的坑,并补上回归测试。扩展本体未改动(扩展版本仍 0.1.0),本版只涉及安装器与文档。

修复

dsh-insight install 原先把扩展装到 <用户目录>/dsh-insight/extension/。而「加载已解压的扩展程序」对话框里,很自然会选中名字更像产品名的上一层 <用户目录>/dsh-insight/ —— 然后报:

清单文件丢失或不可读取

Edge 没说错,那一层确实没有 manifest.json。这个多出来的层级是从上游 dsh-chrome(dsh-chrome/extension)继承的。

现在直接装到 <用户目录>/dsh-insight/,清单就在该目录根部,选它即可:

  • macOS:~/Library/Application Support/dsh-insight
  • Linux:${XDG_DATA_HOME:-~/.local/share}/dsh-insight
  • Windows:%LOCALAPPDATA%\dsh-insight

另外 install 增加了装后自检:若目标目录根部没有 manifest.json,直接报错退出,而不是打印一个错误路径。

升级

已经装过的,重新跑一次安装器即可(升级后记得在扩展页点「重新加载」):

npx github:Suguyun/dsh-insight install

用旧目录加载过的,需要在 chrome://extensions / edge://extensions 里移除旧条目,再从新目录加载一次。扩展 ID 由 manifest 的 key 决定,未变,设置不会丢。

测试

16 个自包含套件、147 项断言:node tests/run.mjs
其中 tests/test-cli.mjs 是本次新增,专门锁住上面这个目录层级回归。

dsh-insight 0.1.0

Choose a tag to compare

@Suguyun Suguyun released this 23 Sep 08:36

首个公开版本。dsh(DeepSeek Harness)的浏览器伴侣,fork 自 dsh-chrome(MIT)。

装什么

附件 dsh-insight-0.1.0.zip 是扩展本体(manifest.json 在压缩包根部)。解压后在 chrome://extensions / edge://extensions 打开开发者模式,「加载已解压的扩展程序」选择解压出的目录即可。

但扩展需要配套的 dsh 宿主半边才能工作:

dsh plugin --profile web add github:Suguyun/dsh-insight

详见 README。

这一版有什么

  • 划词即解读:选中文字后浮标触发,四种模式(点浮标 / 划词即解读 × 页面浮窗 / 只进侧栏)
  • 侧栏原生多轮追问:就当前解读继续问,携带最近 16 轮历史
  • 设置内嵌侧栏:不再跳转独立选项页
  • 外观可配置:背景色与字号(11–20px)
  • 解读口径:6 个内置(可编辑)+ 任意多个自定义
  • 零依赖 Markdown 渲染:不使用 innerHTML
  • 智能体侧 8 个 browser_* 工具:读页面 / 列标签 / 导航 / 点击 / 开标签 / 抓包 ×3

相对上游的改动

  • 页面自动注入默认关闭(宿主不挂载 + 扩展开关默认 false),修掉上游会自我复制放大、顶爆上下文的 400 问题
  • 正文上限收紧:扩展侧 1,000,000 → 8,000;桥接入站 1,000,000 → 200,000
  • 页面注入器改为有界:单次 4000 字符、自身回声整条跳过、单会话 60000 封顶
  • 修复划词请求飞行途中丢弃新选区、孤儿内容脚本无提示等问题
  • 移除 cookies 权限

变更明细见 CHANGELOG。

测试

15 个自包含套件、137+ 断言:node tests/run.mjs