kinyokun / dsh-web-gzip

Listed

DSH 插件:给 DeepSeek Harness Web 响应加透明 gzip 压缩,加速远程访问会话记录加载(实测单页 12.6MB→1.06MB)。Zero-dep gzip middleware for DSH web.

mainOther View source

Installation

npx -y @deepseek-ai/dsh plugin --profile web add github:kinyokun/dsh-web-gzip

This installation command is an unverified starting point generated from the GitHub repository address.

README

Maintainer-authored documentation snapshot.

View on GitHub ↗
Commit ae65034Synced Aug 18, 2026

dsh-web-gzip

license version DSH zero deps

DSH(DeepSeek Harness)宿主插件:给 dsh web 的 HTTP 响应加透明 gzip 压缩,专治公网远程访问时「会话记录」加载慢

A zero-dependency host plugin that transparently gzip-compresses DeepSeek Harness web responses — dramatically accelerating remote session-history loading.

Overview

解决什么问题:DSH 的 Web 栈没有任何 HTTP 压缩中间件,而 session.history 一页可能携带数 MB 的裸 JSON(内含大量 assistant/chunk 流式增量事件)。局域网直连尚可忍受,经公网域名 / 反代 / 隧道访问时,每一页历史都是数 MB 的原样传输——这就是"会话记录加载慢"的主因。文本类内容 gzip 压缩率约 10:1。

实测效果(本机真实部署,session.history 单页 50 条消息):

指标未压缩本插件
响应体积12,586,714 B (12.6 MB)1,063,250 B (1.06 MB)
占比100%8.4%
响应头content-encoding: gzip + vary: accept-encoding

适合谁:通过公网域名 / Cloudflare / 内网穿透 / Tailscale 等远程访问 DSH Web GUI 的用户;/export 之外希望"零改动、零配置"提速所有页面(API JSON + 静态资源)的用户。

Features

  • 全路由覆盖:包装 webServer 已注册的 exact / prefix 路由与 fallback,并接管 register / registerFallback——本插件加载之后注册的路由同样自动压缩;
  • 智能透传白名单(不缓冲、逐字节原样):
    • HEAD / Range 请求(字节精确语义);
    • SSE(text/event-stream)——保持逐块即时到达;
    • 已自带 content-encoding 的响应;
    • zip / gzip / octet-stream / wasm / 图片 / 音视频 / 字体(压缩收益低或语义不允许);
    • 小于 512 字节的小响应(压缩反而亏);
    • 204 / 304 空响应;
  • 正确 HTTP 语义:压缩时移除 content-length、添加 content-encoding: gzip、合并 vary: accept-encoding(缓存安全);
  • 对非 gzip 客户端零影响:不带 Accept-Encoding: gzip 的客户端(如本机 dsh-cli)收到的响应与未安装时逐字节一致
  • 可逆生命周期:禁用 / 卸载时 disposer 完整还原所有 handler 与注册方法,无残留;
  • 零运行时依赖:仅 node:zlib(Node 内置);不碰业务逻辑、会话数据与磁盘。

Install / Uninstall

方式一:profile 目录直接挂载(推荐,最简单)

  1. 把仓库放进 profile 目录(目录名即插件名):

    PROFILE_DIR=~/.dsh/profiles/web        # profile 名按实际部署调整
    mkdir -p "$PROFILE_DIR/dsh-web-gzip"
    cp host.js package.json "$PROFILE_DIR/dsh-web-gzip/"
    
  2. $PROFILE_DIR/cordis.patch.yml 追加插件行:

    - insert:
        - id: dsh-web-gzip
          name: ./dsh-web-gzip/host.js
    
  3. 重启 dsh web(宿主代码在模块缓存中,需进程重启生效;launchd 等托管方式会自动拉起)。

  4. 刷新浏览器页面即可——无需任何配置。

方式二:作为包名挂载

PROFILE_DIR=~/.dsh/profiles/web
mkdir -p "$PROFILE_DIR/node_modules/dsh-web-gzip"
cp host.js package.json "$PROFILE_DIR/node_modules/dsh-web-gzip/"
- insert:
    - id: dsh-web-gzip
      name: dsh-web-gzip

升级

覆盖 host.js / package.json 后重启 dsh web 并刷新页面。

禁用

在 patch 中追加 - id: dsh-web-gzip + disabled: true(保留文件,随时可重新启用)。

彻底移除

删除 patch 中的 insert 条目与插件目录,重启 dsh web

Configuration

无持久化设置。全部行为由 host.js 顶部常量控制(修改后重启生效):

常量默认说明
MIN_BODY_BYTES512响应体低于该字节数不压缩
GZIP_LEVEL6gzip 级别(1-9,速度/压缩率平衡点)
SKIP_CONTENT_TYPES见源码透传内容类型前缀白名单

Compatibility

项目声明
支持的 DSH 版本@deepseek-ai/dsh 0.1.0-rc.6(2026-08-14 真实部署实测:安装 / 压缩 / 透传 / 卸载全流程)
已验证环境macOS + Node.js 25,dsh web profile patch 挂载,公网域名(5555 端口 relay)+ launchd 托管
最后验证日期2026-08-15
已知耦合点依赖 webServerexact / prefixes / fallback 属性与 register / registerFallback 方法(见 SECURITY.md);DSH 升级改动该服务结构时需同步适配

DSH mainline 变化很快:升级前建议先跑 test/smoke.sh 验证。

Testing

node --test test/gzip.test.mjs     # 或直接运行 test/smoke.sh

测试套件用 mock webServer + 真实 node:http 服务器做字节级断言:gzip 往返、压缩率、SSE / zip / 图片 / 小响应 / HEAD / Range / 204 / 304 / 已编码响应透传、vary 合并、content-length 移除、非 gzip 客户端逐字节一致、handler 抛错 400 兜底、加载后注册路由生效、disposer 完整还原。

FAQ

  • 为什么不支持 brotli / zstd? 浏览器普遍支持 gzip,且 gzip 是 node:zlib 内置、零依赖、跨 Node 版本稳定的选择。若后续需要,可在 wrapHandler 中按 Accept-Encoding 扩展。
  • 会压缩 WebSocket 吗? 不会。本插件只包装 HTTP handler,upgrade 路由不经过包装。
  • 对会话文件本身有影响吗? 没有。只改"响应传输",不碰 session.jsonl.zstd 等任何磁盘数据。
  • /compact 的区别? /compact 压缩的是发给模型的上下文(会话文件只追加不删除);本插件压缩的是网络传输。两者互补。

License

MIT © 2026 kinyokun

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

TestsDetected
Security policyDetected
DocumentationDetected

Repository information

Language
JavaScript
License
MIT
Last updated
Aug 14, 2026, 5:29 PM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.