npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@weniatall/dsh-mobile-adapter

v0.1.67

Published

Zero-intrusion mobile drawer and responsive layout adapter for DeepSeek Harness Web

Readme

dsh-mobile-adapter

DeepSeek Harness (DSH) Web 移动端全量体验优化与响应式适配插件。

无需修改 DSH 源码,零侵入通过前端扩展注入实现手机/移动端浏览器的极致体验。

功能特性

  • 📱 响应式布局与视口自适应:自适应手机屏幕高度(100dvh / safe-area),彻底消除底部导航栏/工具栏遮挡与抖动。
  • 👑 顶部 3 层极致融合成单层(释放近 100px 屏幕净高度):针对移动端原宿主「插件顶栏 + 会话标题栏 + 对话/轨迹 Tabs 栏」3 层臃肿堆叠的痛点,进行全面去重与功能深度整合。彻底隐藏重复占位的第 3 层原生 Tabs 栏(由顶栏「⌁ 轨迹 / ← 对话」药丸按钮单行双向切换),并将第 2 层 Header 移出普通流(0 占据纵向高度);单层顶栏(48px)集成了:☰ 侧栏汉堡、真实会话标题(带点击改名/查看层级)、运行状态小光标、[⌁ 轨迹] 视图切换、[···] 会话更多操作、[◫] 右侧栏开关以及 [⛶] 全屏按钮。去除了重复展示,保留了全部交互能力,聊天正文可视面积提升 25% 以上。
  • 📷 移动端原生文件与图片上传:输入框支持一键调用手机原生相册与文件选择器,自动注入为多模态图片附件。
  • 🧰 工作区工具箱 (Mobile Toolbox):移动端在输入框右侧或底部集成统一折叠工具箱,无缝集合文件查看器、本地终端、提示词历史等插件入口。
  • 🔘 全操作按钮规范化与去冗余:对话框底部全操作按钮圆形统一设计,触控点击更舒适,防误触。权限模式选择器在移动端收成 32px 圆钮(隐藏文字与下拉箭头),选择器哈希同时覆盖 dsh 0.1.x 的 Sh0Q9G_* 与 0.2.1-rc.2 的 iWlSmW_*。模型选择器不再按构建哈希写死,改为锚定宿主写死的语义属性([data-composer-card] button[aria-haspopup="menu"][aria-label*="模型"]),因此宿主换哈希(_7KE1Ra_* → _9r0rkG_* → …)当天按钮仍收成 32px 圆钮;悬浮窗同理按 [role="menu"][aria-label*="模型"] 强制 position:fixed 停靠在底部操作栏上方,并带 :not(:has([role="menuitem"])) 排除内层滚动区,避免把列表区一起改成 fixed 导致滚不动。移动端隐藏原生冗余的「+」快捷指令按钮(移动端直接键入 / 即可触发指令,省出单行空间避免挤压换行,多层覆盖 .uV2eYG_add、.ccegLa_add 与 [class*="_add"]、button[aria-haspopup="listbox"] 语义选择器)。
  • 🧭 输入框下方的统计行固定单行三列、且不掉出卡片:宿主把「N 轮 M 步 · tok/s」「用量 · 缓存命中」统计行和上下文用量圆环一起渲染在输入卡片下方的 dock 里(两个药丸装在 conversation.composer.dock 槽位内)。移动端固定为单行三列——[轮次/速度] [用量/缓存] [上下文圆环]:槽位与 dock 都强制 row/nowrap(曾因槽位是 column 导致统计行堆成多行),不折行也不横向滚动;两列统计等分宽度,收缩压力只落在每段的末位文字(速度、缓存命中率)上走省略号,轮次/步数与总量保持完整;≤360px 超窄屏进一步隐藏末位文字与分隔符,只留「N 轮 M 步」和总量,完整数值仍可从药丸点击面板查看。整块内容由脚本按实测 dock 高度动态配平(卡片补同样的底部内边距 + dock 等量负边距)收进卡片圆角内。旧实现用 :has(+dock …) 加固定 40px/-38px 魔法数,在 Safari < 15.4、Chrome < 105 等不支持 :has() 的内核上会整条静默失效,表现就是「输入框下方的内容缺失」——现在不再依赖 :has()。
  • 📑 抽屉与弹窗防溢出:对侧边栏会话抽屉、历史记录抽屉等全部进行移动端全屏/半屏底部抽屉(Bottom Sheet)自适应改造。
  • 📂 工作区目录可正常展开/收起:宿主把工作区行的展开三角藏在 :hover 里(.YDXeBa_projectRow .YDXeBa_chevron{display:none},仅 :hover 显示),触屏设备既没有 hover 也没有指针,展开状态完全不可见;同时宿主 hover 时用三角顶替文件夹图标(.YDXeBa_projectRow:hover .YDXeBa_folder{display:none}),触屏一按下图标就互相乱跳。移动端现固定为:三角常显并独占槽位、文件夹图标保持常显、旋转方向由宿主的 aria-expanded 驱动、行高抬到 40px 便于点按。并修正点击行为——工作区行是展开/收起控件而非会话选择,点它不再关闭侧边抽屉(此前宿主刚展开的会话列表会被立刻关掉,表现为「点文件夹毫无反应」),只有真正选中会话行才收起抽屉。
  • ↩️ 右侧栏(文件/终端)避让与一键返回:右侧栏在移动端展开时自动避开顶部导航栏并放大 tab 与收起按钮触控区,顶栏右上角变为「← 对话」一键收起面板回到会话;冷启动恢复页面时若右侧栏曾处于展开态,自动收起,不再出现刷新或重开网页后被锁在文件栏、回不到对话的问题。
  • 🔍 聚焦输入不再整页放大:iOS Safari 会对计算字号小于 16px 的可编辑元素(输入框已是 contenteditable)聚焦时强制放大整个视口,顶栏按钮随之被挤出屏幕。输入区字号现统一抬到 16px 下限(用户在设置里选定的更大字号照常生效),聚焦时页面保持原有缩放,按钮不再消失。
  • 🎨 模型和推理强度条完全跟随状态条效果,不跟主题:输入框上方的「模型 · 推理强度」条完全跟随 dsh-theme-studio 的「状态条效果」(流光文字、呼吸光环、极光流动、双色霓虹、终端扫描、糖果气泡、故障闪烁、环形光晕、条形律动等 10 档),由 <html data-ts-status="..."> 纯 CSS 驱动,设置切换 0ms 瞬间响应。不跟主题:无条件压过任何特定主题(如极光的静态极光环、毛玻璃等)的样式干扰,确保该条纯粹展现状态条本身的胶囊与动效;零侵入:当设置为「原生」(或未安装主题工作室)时保持移动端默认的居中轻量纯文本。两个插件独立发布、零耦合。
  • ⛶ 一键全屏(只收起浏览器 chrome):顶栏右侧提供全屏切换按钮,调用 Fullscreen API(requestFullscreen({ navigationUI: 'hide' }))收起浏览器自身的地址栏与底部工具栏。应用自己的「新会话」顶栏、会话标题栏、对话/轨迹 tabs 全部保留——全屏后仍需它们导航。全屏按钮始终留在顶栏原位,前后位置无跳变;浏览器全屏后视口变高,根容器与滚动区跟随 100dvh 重铺,并用 :fullscreen 伪类兜底覆盖「通过浏览器菜单进入全屏」的场景。用户按 Esc / 系统手势退出时同步按钮的 aria 状态;进入前自动收起侧边抽屉,旋转到平板/桌面宽度时静默退回普通模式;状态只存内存不落盘,刷新后回到正常界面。

安装

# 1. 使用 GitHub Release 在线安装
dsh plugin --profile web add https://github.com/veildawn/dsh-plugins/releases/download/[email protected]/dsh-mobile-adapter-0.1.67.tgz

# 2. 或在本地打包安装
dsh plugin --profile web add ./plugins/dsh-mobile-adapter/dsh-mobile-adapter-0.1.67.tgz

选择器契约

移动端样式同样只能依附宿主运行时真实存在的 CSS Modules 类名。宿主每次构建都会换 哈希(ccegLa_* → uV2eYG_*),所以这里的规则分四层,越靠后越稳:

  1. 语义钩子优先:[data-slot=…]、[data-composer-card]、[data-conversation-scroll]、 [role="dialog"]、[data-shell-overlay]——宿主渲染时写死的属性,不随构建变化。
  2. 去哈希兜底::is(.H0stHa_details,[class$="_details"]),在保留当前哈希的同时 按局部名后缀匹配,宿主换 hash 后仍然命中。用 node scripts/add-host-local-fallbacks.mjs 生成;它只在规则已带语义作用域时加兜底——_root 在宿主里有 37 个组件共用、 _row 29 个,裸写 [class$="_root"] 会把侧栏内边距糊到整个应用上。个别关键面板 改用元素类型收窄(轨迹详情面板是 aside[class$="_details"])。
  3. 历史版本兼容:Sh0Q9G_*、ccegLa_* 等旧宿主哈希保留,并登记在 test/mobile-adapter.test.mjs;一旦某个类名重新出现在宿主中,测试会要求把它删掉。
  4. 跨元素布局交给脚本配平:需要「卡片补内边距 + 兄弟节点负边距」才能对齐的布局 (输入卡片下方的统计行与上下文圆环),不要写 :has() 或固定像素魔法数。:has() 在 Safari < 15.4、Chrome < 105、部分移动端内核上整条失效,固定像素在宿主换代后 失准——两种失效都是静默的,表现就是内容掉出输入框。改由脚本测量真实高度写入 --dsh-dock-reserve,并用自己的 data-dsh-dock* 标记驱动样式(见 balanceComposerDock()),宿主类名/属性怎么换都不影响。

仓库根 test/fixtures/host-classes.json 是宿主类名快照(桌面版 + Web 版,与 dsh-zcode-theme 共用),宿主升级后重新采集:

node scripts/harvest-host-classes.mjs --all          # 桌面版 + Web 版一起采,推荐
node scripts/harvest-host-classes.mjs --web          # 只采 `dsh web` 的前端
node scripts/add-host-local-fallbacks.mjs            # 给新出现的类名补去哈希兜底
node scripts/add-host-local-fallbacks.mjs --check    # 只检查,有未兜底项则以非零退出

重启生效

  • macOS / Linux 用户:
    ./scripts/dsh-web.sh restart
  • Windows 用户:
    .\scripts\dsh-web.ps1 restart
    # 或 cmd:
    scripts\dsh-web.cmd restart

License

MIT