下拉查看访问过的网页,点击即可回跳
30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/12 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ilun886/dsh-browser-history该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · browser
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 24 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-browser-history(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/13 09:38:46
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 下拉查看访问历史
- 点击回跳页面
- 按URL去重
给 DSH 右侧栏内嵌浏览器加历史记录列表:下拉浏览访问过的页面(标题/域名/时间),跨重启与关标签保留,按 URL 去重,点击回跳。纯客户端插件,不改 app.asar。
README
由 DeepSeek 最新模型翻译生成dsh-browser-history
给 DSH 右侧栏的内嵌浏览器加一个历史记录列表。
官方侧边栏浏览器只有顺序的后退/前进,没有可浏览的历史列表;而且历史不跨重启保留。这个插件把访问过的页面记成一份列表(跨重启保留),点一下就能回到那一页。
它解决什么问题
先把话说准,避免误解。官方 @deepseek-ai/dsh-client-ui-sidebar-browser 的 Desktop 载体确实使用 Chromium 原生导航历史:
Web uses an iframe with application-managed history; Desktop uses Electron
<webview> with native navigation history and retained pages.
—— 官方 README.md L12
IframeImpl uses BrowserNavigation, while ElectronWebViewImpl observes
Chromium history.
—— 官方 README.md L69
所以在一个标签页的生命周期内,官方那对 ← → 是能用的(由
element.canGoBack() / canGoForward() 驱动)。
展开完整文档(README 剩余 1 节)
dsh-browser-history
给 DSH 右侧栏的内嵌浏览器加一个历史记录列表。
官方侧边栏浏览器只有顺序的后退/前进,没有可浏览的历史列表;而且历史不跨重启保留。这个插件把访问过的页面记成一份列表(跨重启保留),点一下就能回到那一页。
它解决什么问题
先把话说准,避免误解。官方 @deepseek-ai/dsh-client-ui-sidebar-browser 的 Desktop 载体确实使用 Chromium 原生导航历史:
Web uses an iframe with application-managed history; Desktop uses Electron
<webview> with native navigation history and retained pages.
—— 官方 README.md L12
IframeImpl uses BrowserNavigation, while ElectronWebViewImpl observes
Chromium history.
—— 官方 README.md L69
所以在一个标签页的生命周期内,官方那对 ← → 是能用的(由
element.canGoBack() / canGoForward() 驱动)。
真正缺的是另外三件事:
| 缺失 | 官方行为 | 本插件 |
| 可浏览的历史列表 | 只有顺序前进/后退,看不到"我访问过哪些页" | 下拉列表,含标题/域名/时间 |
| 跨重启保留 | 每个标签只存一条 URL+标题,且需手动"恢复"才打开 | 全量保留,重启后直接点 |
| 跨关闭标签保留 | 官方 README L108:Closing the tab removes its checkpoint | 记录独立于标签生命周期 |
| 去重与时间戳 | 无 | 按 URL 去重,最近访问置顶 |
官方丢弃的是什么
官方 README 的限制章节写得很明确:
Saved title and URL survive reloads and plugin unload while the tab remains in
Sidebar's layout. Closing the tab removes its checkpoint. Restart restoration
does not recover page memory, unsaved forms or Chromium's history stack.
—— 官方 README.md L108
也就是说:
- 标签还在 → 标题/URL 保留,原生前进/后退可用
- 标签关掉 → checkpoint 被删除
- 重启 → 不恢复页面内存、表单,也不恢复 Chromium 的 history 栈
关于 clearHistory()
官方代码里有这么一处:
// ui-sidebar-browser/lib/client.js:1233-1239
observeReady(element, committed) {
const parsed = committed ? parseBrowserAddress(element.getURL()) : void 0;
if (parsed?.ok && this.firstDocument) {
element.clearHistory(); // ← 注意:不是"丢弃用户历史"
this.firstDocument = false;
}
...
}
firstDocument 在构造时置 true,在 dropGuest() 里重置为 true;而 webview 创建时的初始地址是 about:blank#<lease>(同文件 L1342)。当*第一个真正的
HTTP(S) 文档提交时,这段代码把引导用的 about:blank 从历史栈里清掉,
目的是让"后退"回不到 about:blank——之后前进/后退照常工作。
关于分区不落盘
Desktop 的存储分区是进程内共享的,官方 README 明确说 Cookie / Web storage 不跨应用重启保留:
Desktop 按规范化的工作区 CWD 共享进程内存储分区……
Cookie 与 Web storage 不跨应用重启保留。
—— 官方 README.zh.md L110
本机实测确认磁盘上没有对应的持久化分区,也没有 Chromium 的 History 数据库:
%APPDATA%\@deepseek-ai\dsh-desktop\Partitions\
dsh-platform-0d154612… ← 只有平台自己的分区,内容仅 dsh-platform-a18ac6a1… Preferences / DIPS / 性能观测库(不存在 dsh-sidebar-browser 分区,也不存在名为 History 的文件)
效果
在右侧栏顶栏多一个时钟图标:
| 功能 | 说明 |
| 位置 | 顶栏 全屏 / 收起右侧边栏 的左边(分栏 在更左侧的独立分组里) |
| 悬浮提示 | 鼠标停留 500ms 显示「历史记录」 |
| 下拉列表 | favicon + 页面标题 + 域名 + 相对时间 |
| 点击回跳 | 在当前侧边栏里打开该页面 |
| 清空 | 面板右上角「清空」 |
| 容量 | 最多 300 条,按 URL 去重,最近访问置顶 |
| 渲染 | 下拉一次最多画 60 行(数据仍全量保留,避免长列表卡顿) |
| 持久化 | 存 localStorage,跨重启保留 |
安装
本机侧边栏浏览器只在 desktop profile 挂载,所以必须装进 desktop profile:
dsh plugin --profile desktop add link:D:\dsh-browser-history
装完后重启 DSH。挂载生效需要两处同时存在(缺一不可):
1. C:\Users\<你>\.dsh\profiles\desktop\package.json 的 dependencies 里出现 "dsh-browser-history": "link:D:/dsh-browser-history"
2. 同一个文件的 dsh.profile.bundles 数组里出现 "dsh-browser-history"
⚠️ 光加 dependencies 不会挂载插件。dsh.profile.bundles 才是挂载表。
卸载
从 profile 的 package.json 里删掉上面那两处,重启 DSH 即可。
工作原理
数据从哪来
侧边栏浏览器是 Electron <webview>:
// ui-sidebar-browser/lib/client.js:1336-1340
document.createElement("webview")
element.dataset.sidebarBrowserFrame = "webview"
导航事件派发在页面 DOM 元素上,没有 stopPropagation、没有隔离。
所以第三方插件挂同样的监听就能拿到用户点击产生的导航:
| 事件 | 用途 |
| did-navigate | 整页跳转 |
| did-navigate-in-page | 同页跳转(SPA、锚点) |
| page-title-updated | 标题变化 |
地址和标题也从元素上读:element.getURL() / element.getTitle()。
因为一切都在页面里完成,所以不需要 desktop-bridge、不需要碰 resources/app.asar。
点击回跳的三条策略
按「最贴近用户在浏览器里点历史」的顺序尝试:
| 顺序 | 条件 | 行为 |
| ① webview | 已有可见的浏览器页 | 原地导航,不新开标签 |
| ② openTab | 没有浏览器页 | 用官方服务新开标签,带初始地址 |
| ③ openTabFromTarget+pending | ② 抛错时 | 先开标签,再用 pendingUrl 在 webview 出现后补地址 |
优先 ① 的原因:官方浏览器标签注册为 multiple: true,所以 openTab 一定会 新开一个标签。原地导航才不会越点越乱。
策略 ③ 的存在是因为 openTabFromTarget 不传 params(见 ui-sidebar-right/lib/client.js:6569-6582,它只透传 paneId / replaceTab),会把 URL 丢掉——只能靠 pendingUrl 事后补。
最近一次用了哪条策略会记在 localStorage['dsh.bh.lastnav'],便于排查。
三个实现上的坑
这些都是实测踩出来的,改代码前建议先看:
① 绝不能自激
不要「观察 document.body 子树」同时「在同一子树里写 DOM」:
scan() → 写 DOM → 触发 observer → scan() → …
回调走微任务,能把主线程彻底饿死(表现为永久停在 Loading plugins…、 无报错、CPU 100%)。本插件曾因此把整个 app 卡死过一次。
现有防护:
- observer 跳过自己渲染的 panel / tip / 按钮容器的变更
- requestAnimationFrame 合并多次变更
- scanning 重入锁
- 250ms 最小扫描间隔 —— DSH 是聊天应用,助手每输出一个 token 都会插 DOM 节点;不限速的话全文 querySelectorAll 会被拉到接近帧率。实测节流后约 1 次/秒。
② 官方有多个面板
RightbarRoot 为每个保留的会话各渲染一份面板,同一时刻只有一个是可见的(其余 rect 为 0×0、offsetParent 为 null)。
| 做法 | 结果 |
| querySelector 只取第一个 | 按钮插进隐藏面板 → 隐身 |
| 只挑"当前可见的" | 面板一换手,按钮跟着旧面板隐身 |
| 往每一条工具栏都插一个 ✅ | 无论哪个面板可见,它自带的按钮就跟着可见 |
③ HMR 会叠加实例
client-hmr(默认 500ms 轮询 mtime)在文件变动时重新求值 factory 并再跑一次 apply,但不保证先调用上一实例的清理函数。不管的话页面上会同时存在多个实例,各自持有 observer 和按钮,互相删除又互相重建,表现为工具栏里图标越堆越多。
现有防护:单例守卫(apply 开头先销毁上一实例)+ 按实例标识回收孤儿按钮。
调试
页面控制台可用(Ctrl+Shift+I):
__dshBrowserHistory.list() // 当前历史数组
__dshBrowserHistory.clear() // 清空
__dshBrowserHistory.scan() // 立刻扫一遍 DOM,返回 {views, attached, buttons}
__dshBrowserHistory.instance // 当前实例标识(排查多实例用)
日志前缀统一为 [BH]。
代码结构
dsh-browser-history/
├─ package.json 双半区声明:dsh.bundle.patch + dsh.client ├─ cordis.patch.yml bundle patch(挂载声明) └─ lib/ ├─ index.js 宿主半区:不注册服务、不挂事件,仅占位 └─ client.js 全部逻辑(约 980 行)
宿主半区为什么是空的:侧边栏浏览器是 <webview>,导航事件派发在页面 DOM 上,捕获历史只需要一个跑在页面里的客户端半区。宿主进程不参与,也就不需要 desktop-bridge、不需要改 app.asar。
兼容性
依赖以下官方内部结构,DSH 升级后可能需要同步调整:
| 依赖 | 位置 |
| webview[data-sidebar-browser-frame] | ui-sidebar-browser |
| [data-sidebar-right-mode] / -toggle | ui-sidebar-right |
| ctx.sidebarRight.openTab(kind, options) | ui-sidebar-right 服务 |
| tab.navigation.params.url | 浏览器标签的初始地址 |
样式全部走 --dsw-alias- 设计令牌,自动适配明暗主题。
按钮复用官方 iconButton 类名(CSS-module 哈希,跨版本可能变),同时有独立的兜底样式,保证官方类名失效时按钮仍然可点、可见。
已知限制
- 记录时机是导航提交(did-navigate / did-navigate-in-page)与标题更新,所以加载失败的页面(如 ERR_CONNECTION_TIMED_OUT)也会被记下 URL
- 不记录表单内容、滚动位置(官方也不恢复这些)
- 时间显示为相对时间("3 分钟前"),不精确到秒
- 每个 URL 只保留一条(重新访问会置顶并更新时间)
- 只覆盖侧边栏浏览器;系统浏览器 / 外部 Chrome 的活动不在范围内
- 不接管 ← → 后退/前进——那是 Chromium 原生行为,官方已在用;本插件只提供官方没有的"历史列表"这一层
许可
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ilun886/dsh-browser-history
下拉查看访问过的网页,点击即可回跳
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目