dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH 右侧栏页签插件:注册一个右栏页签(概览 / 文件 / 改动 / 工具),与内置的文件、文档预览、引导页签并存。概览含 DeepSeek 账户余额、上下文窗口与预算、会话指标与用量分析。
DSH(DeepSeek Harness)右侧栏的一个页签插件:通过官方右栏的页签注册接口(ctx.sidebarRightTabs)注册一个页面类型与它的正文,与内置的文件 / 文档预览 / 引导页签并存——不接管右栏、不顶替任何内置页签、不写任何网格或宽度规则。会话头部右上角另有一个与左侧折叠按钮同款的开关,点击打开/聚焦本页签(已在前台则收起右栏)。
环境要求:DSH 0.2.0+ 的 Web profile(已在桌面版 0.2.0-rc.2 实测)。启动同一套 Web profile 的桌面外壳同样可用(路由与浏览器中一致);不带 web server 的外壳不可用。
面板自身包含四个页签:
GET https://api.deepseek.com/user/balance 实时查询,15 秒刷新)、今日已用(当日北京时间 00:00 起,由后台扫描本机会话日志做 token 计价估算,只统计 DeepSeek 系列模型)与峰/谷时段指示(按 DeepSeek 官方时段:工作日 09:00–12:00、14:00–18:00 为峰,夜间、周末与法定节假日为谷;峰红谷绿,并显示到下一次切换的倒计时),右上角为充值按钮(跳转 https://platform.deepseek.com/usage)。切换到概览页即刻显示(上次结果会立刻回填,后台再刷新);服务端首次扫描尚未完成时金额处显示"统计中…",随后自动补齐。png/jpg/jpe/gif/webp/bmp/ico/avif/svg 内嵌预览,SVG 顶部可在「图像 / 源码」之间切换;大文件截断提示)。Word / Excel / PowerPoint(doc/docx/xls/xlsx/ppt/pptx)不在本插件内解码——单击即把该文件交给 DSH 内置的「文档预览」页签(同栏新开页签并聚焦,内置预览用 LibreOffice 转 PDF、表格在浏览器内渲染),交接不可用时才提示不支持;TIFF / HEIC / ICNS 任何浏览器都解不开,改为提示用系统看图工具打开。右键菜单:在文件管理器中显示、添加文件引用 / 添加文件内容(文件)、添加文件夹引用(文件夹)、复制绝对路径 / 复制相对路径。插入内容会写入对话输入框。×N,最新一次在最前。列表里若是 Word / Excel / PowerPoint 文档,单击该行即用与「文件」页签相同的交接方式打开 DSH 内置文档预览(交接不可用时在该页签显示提示,不静默失败)。插件托管在 GitHub(kee0012/dsh-sidebar-panel,未发布到 npm),DSH 支持以 git 依赖方式直接安装:
# 从 GitHub 安装(推荐,日常使用;拉取默认分支最新提交)
dsh plugin --profile desktop add github:kee0012/dsh-sidebar-panel
安装后需要重启 DSH,新的服务端代码与 client bundle 才会生效。
在 DSH 组合配置中给该插件加 config 即可(未提供时全部使用默认值):
- id: dsh-sidebar-panel
name: dsh-sidebar-panel
config:
fileBrowser:
maxEntries: 500
maxContentChars: 40000
includeHidden: false
reference:
file: '@<path>'
folder: '@<path>/'
changes:
writeTools: ['write', 'edit', 'str-replace-editor', 'patch', 'run_code']
pricing:
enabled: true
currency: CNY
peakWindows: [[9, 12], [14, 18]] # 北京时间峰段(官方时段)
peakMultiplier: 2 # 峰价 = 谷价 × 2(官方倍率)
models: # 未列出则回退官方价表
deepseek-v4-pro: { inputPerM: 4.5, cacheHitPerM: 0.15, cacheWritePerM: 4.5, outputPerM: 13.5 }
defaultModel: { inputPerM: 1, cacheHitPerM: 0.02, cacheWritePerM: 1, outputPerM: 4 }
usage: # 后台扫描本机会话日志(今日已用)
intervalMs: 30000 # 扫描间隔;请求永远不等扫描
warmupDelayMs: 3000 # 启动后首次扫描的延迟
maxLogBytes: 134217728 # 单个日志文件的解码上限(超出计入 skipped)
sessionsRoot: '' # 留空 = <DSH_HOME>/sessions,自动跟随数据根
models里填谷价(CNY / 百万 tokens),峰段按peakMultiplier放大。留空即使用内置的官方价表(deepseek-v4-pro/deepseek-v4-flash/deepseek-flash,前缀匹配,形如deepseek-v4-pro-2026也能命中)。峰谷判定按北京时间:工作日 09:00–12:00 与 14:00–18:00 为峰,其余时段、周末以及 2026 年法定节假日(元旦/春节/清明/劳动节/端午/中秋/国庆)全天为谷。
usage段控制今日已用的后台扫描器:插件启动后延迟warmupDelayMs扫一次,之后每intervalMs扫一次,结果放在内存快照里;GET /usage-today只读快照,永不等待扫描(快照还没热时返回warming: true,面板显示"统计中…"并在 1.2 秒后重问)。扫描器直接读会话日志文件(<sessionsRoot>/<工程目录>/<会话 id>/session.v4.jsonl.zstd),与宿主的会话存储服务完全解耦——这也是它能在几百毫秒内给出结果的原因。
| 路由 | 说明 |
|---|---|
GET /dsh-sidebar-panel/api/config | 引用模板 / 内容上限 / 计价开关 |
GET /dsh-sidebar-panel/api/overview?sessionId= | 请求数、费用、运行时间、按模型用量 |
GET /dsh-sidebar-panel/api/files?root=&path= | 列目录(文件+文件夹),锁定在工作区内 |
POST /dsh-sidebar-panel/api/file-content | 读取文件内容(截断上限可配置) |
GET /dsh-sidebar-panel/api/file-raw?root=&path= | 原始字节预览(PDF 与图片/SVG,content-type 白名单:pdf png jpg jpe jpeg gif webp bmp ico avif svg 各有真实 mime;SVG 另带 nosniff + 沙箱 CSP;TIFF/HEIC/ICNS 故意只给 octet-stream) |
GET /dsh-sidebar-panel/api/balance | DeepSeek 官方余额(user/balance,key 来自 DSH 凭据,永不下发浏览器) |
GET /dsh-sidebar-panel/api/usage-today | 今日已用(读内存快照,不阻塞)+ 官方峰/谷状态与下次切换时刻 |
POST /dsh-sidebar-panel/api/reveal | 在文件管理器中显示(win32/darwin/linux 分发) |
GET /dsh-sidebar-panel/api/changes?sessionId= | 本次会话写文件类工具改动列表 |
dsh-sidebar-panel/
├── package.json # DSH bundle 清单 + client 注入声明 + 构建 / 门禁 / 测试脚本
├── cordis.patch.yml # 把插件插入 DSH 组合层
├── src/index.js # 服务端源码:同源 HTTP API + 会话事件增量折叠(用量/费用/改动)+ 文件浏览 + reveal
├── client/client.js # 客户端源码:注册右栏页签(类型 + 正文)+ 头部开关 + 四页签 + 右键菜单
├── lib/ # 构建产物:lib/index.js + lib/client.js(由 src/ 与 client/ 生成,勿手改)
├── scripts/build.mjs # 构建:确定性拷贝 + 生成横幅(零构建工具链依赖)
├── scripts/gates/run.mjs # 门禁:产物新鲜度 / 入口点 / 名称一致性 / React external / 依赖与展示元数据
├── locale/en.json # 显示元数据:插件管理器在插件未激活时也读它(en.json 必需,zh.json 为译文)
├── icon.svg # 显示元数据:插件图标(原创作品,导出为 "./icon")
├── test/unit.test.mjs # 服务端单元测试(mock ctx,无需 DSH 实例)
├── test/smoke.client.mjs # 客户端冒烟:桩运行时断言注册形状 / 导航行为 / chat 切片
├── tsconfig.json # 仅编辑器 / 类型提示用(noEmit,构建流程不调用 tsc)
├── SECURITY.md # 凭据与网络面说明
└── README.md / README_EN.md
pnpm install # 安装依赖
pnpm run bundle # 生成 lib/index.js + lib/client.js(入库产物;改源码后必跑)
pnpm run gates # 结构门禁:产物新鲜度 / 入口点 / 名称一致性 / React external / 依赖对齐
pnpm run check # 语法检查(client 与 server)
pnpm test # 单元测试 + 客户端冒烟
pnpm run verify # bundle + gates + 两项测试(一条命令跑全链路)
pnpm run test:unit # node test/unit.test.mjs
pnpm run test:smoke # node test/smoke.client.mjs
# 真实实例的 API 冒烟(<port> 换成你的实例端口;GET 同源不带 Origin,POST 冒烟请带 Origin)
curl "http://127.0.0.1:<port>/dsh-sidebar-panel/api/config"
curl -H "Origin: http://127.0.0.1:<port>" -H "Content-Type: application/json" -X POST \
-d '{"root":"<你的工作区>","path":"dsh-sidebar-panel/package.json"}' \
"http://127.0.0.1:<port>/dsh-sidebar-panel/api/file-content"
源码改动一律改
src/与client/,然后跑pnpm run bundle;lib/是产物,pnpm run gates会逐字节校验它与源码一致,手改lib/直接失败。
依赖声明:
@deepseek-ai/*是宿主运行时的共享实例,因此只进peerDependencies+devDependencies(dependencies为空)——profile 里的副本会静默遮蔽运行时版本。peer 范围按官方契约覆盖全部 prerelease 元组(见package.json)。 展示元数据:icon.svg+locale/en.json(meta.title/meta.description)是插件管理器的硬性交付项(不激活插件也要读),pnpm run gates一并校验。
read/grep/glob 的参数里同样有 file_path/path,按参数名认文件会把"看过"记成"改过";bash/pwsh 内部的文件改动无法可靠捕获。会话日志把工具参数存成 JSON 字符串,解析失败(截断的日志)时该条跳过,不影响其余记录。request/header、assistant/message 的 usage),插件安装前的历史会话在首次访问时会一次性补算;运行时间 = 自首次请求至今(含空闲)。DEEPSEEK_API_KEY,否则显示"未配置"提示)。官方仅提供余额查询接口,无公开的累计消费/请求次数接口,故账户卡片不展示这两项;精确账单可通过"充值"按钮进入 https://platform.deepseek.com/usage 查看。assistant/message 的 usage,按官方价表 × 峰谷倍率累加。这张卡片说的是 DeepSeek 账户,所以由其他厂商模型(非 DeepSeek)服务的请求整体跳过——既不出价也不计入条数:给它们套兜底价目只会凭空造出一笔账户从未产生的消费。只读当日有改动、且每个会话取最新世代(session.v4 优先于旧的 session.v2)的日志;它反映的是"按 token 计价",与按余额差值观测或最终账单可能有差异。扫描发生在请求路径之外(启动后与每 30 秒各一次),所以面板永远即时出数。日志目录不存在时该行显示 ¥0.00 并在悬停提示里说明原因,不会影响余额显示。Host 是环回名(127.0.0.1 / localhost / ::1),并拒绝 Sec-Fetch-Site: cross-site;带 Origin 时必须也是环回,以防止 DNS rebinding。同源 GET 不带 Origin 头,照常放行;POST 另有「不响应 CORS 预检 + 仅接受 JSON」防线(与 DSH 宿主 API 同策略)。MIT © dsh-sidebar-panel contributors