Repository navigation
dsh-usage-dock v0.8.2 发布说明
发布日期:2026-10-15
主方向:DSHA(Android 移植)WorkBuddy 读取失败修复
背景
DSHA(Android APK / dsh web 0.2.0-rc.2)上 WorkBuddy 渠道一直显示「获取失败」,
报 WorkBuddy 状态读取失败(fetch failed)。经完整诊断(见 DHSA移植反馈/交接文档-0.8.2修复.md),
usage-dock 本身无缺陷,根因在宿主侧:
- DSHA 内置插件
dsh-web-mobile@3.0.5的compress.js改写ServerResponse.prototype
做响应压缩,会把「可延迟」的响应头攒起来晚一拍提交; @deepseek-ai/dsh-host-webserver的 gzip 中间件(阈值 1024 B)在res.end代理里
看到headersSent仍为 false,会自己再调一次res.writeHead(statusCode);- 该重入落回
compress.js的patchedWriteHead,它先flush()(headersSent变 true),
后面的 guard 又因这个 true 调原生writeHead→ 抛ERR_HTTP_HEADERS_SENT→
webServer 兜底 catch 直接res.destroy()→ 客户端只见fetch failed。 - 触发条件:响应体 < 1 KiB 且带显式
Content-Length+ 客户端声明 gzip。
WorkBuddy AI 版的 52 Bsigned-out桩响应正好中招,而国内版(3.5 KB)正常;
旧策略「任一版本失败即整体报错」于是把整条渠道拖垮。 - 该内置插件目录受 App 完整性保护(改了会被还原),只能从消费侧绕过。
修复 1:status 请求声明不压缩(plans/workbuddy.js)
fetchStatus() 的 fetch 请求头显式加 accept-encoding: identity——无编码可协商,
gzip 中间件不进入问题重入分支。已在 DSHA 真实宿主上实测:错误消失,
creditsTotal 恢复 1846、11 条明细。
修复 2:失败降级为「部分数据」(plans/workbuddy.js + client.js)
- Host:先看有没有任何版本真的拿到 credits——
- 有 → 照常展示该版本合计,并带
partial/partialNote标记; - 没有 → 保持原有
api/exec/signed-out分类与文案。
signed-out/ 404 依旧不算失败(不是「另一方坏了」,只是没登录/没装)。
- 有 → 照常展示该版本合计,并带
- Client:WorkBuddy 面板合计行下以灰色脚注(
sectionNoteStyle)渲染
partialNote(「以下版本未取到数据:…」),不把部分合计伪装成完整合计。 - 实测三场景(真实宿主 + 模拟):一方失败一方正常 → 正常展示 + 脚注;
两方都失败 → 仍报exec;两方都未登录 → 仍报signed-out。
注意:WorkBuddy 插件自身的设置卡片与「检查更新」(
/update、/probe端点)
仍受同一宿主 bug 影响,需宿主侧修复(方案已提交 dsh-web-mobile 维护者,
或用户级cordis.patch.yml关 gzip),不在本插件范围内。
新功能
详情卡片:点击卡片外自动关闭
详情卡片打开后,点击卡片外的任意位置自动关闭(pointerdown 捕获阶段判定,
按在胶囊/面板内不关;兼容 Shadow DOM composedPath);Esc 同样关闭。
不必再通过再次点击胶囊来收起。
详情卡片:从胶囊向上展开的渐变动画
参考 DSH 桌面端左侧工作区「点击项目展开会话记录」的动效语言:面板出现那一帧
播放一次「从胶囊向上展开 + 渐显」动画(translateY 6px → 0 + opacity 0 → 1,
170ms,WAAPI 合成器路径,与峰谷条动画同款方案);无 WAAPI 的环境(旧 WebView)
静态呈现,行为与上一版一致。打开期间的数据刷新不重播动画。
峰谷条游标:方案 K「上下对尖」
替换原 2px 白柱:上游 8×5 倒三角 + 轨道下 6×4 小正三角夹住「现在」,
色条内部没有任何覆盖物,也没有类似边界的竖线(方案出自
docs/demos/cursor-directions-v2.html 方向 K,用户定稿)。
上三角底缘与轨道上缘留 1px 空隙、下三角顶缘与轨道下缘留 2px 空隙,
全部挂在共享 50% 锚点上,不进轨道圆角裁切。
测试
- 回归总量 156 + 5 项全绿:
test-workbuddy.mjs13 → 22 项:W8 改为降级策略断言(部分成功 → partial 标记 +
不报错;两方都失败 → 仍 exec),新增 W11(两条 status 请求都带
accept-encoding: identity);- 新增
tools/test-panel-interactions.mjs(8 项):外点/Esc 监听生命周期、
点击卡片外自动关闭、卡片内按下不关、Shadow DOM 判定、Esc、展开动画
单次播放与关键帧、partial 脚注渲染与无标记零影响; tools/test-peak-marker.mjs(真实 Chromium 几何)改为方案 K 断言:
上下三角与轨道中点同轴、1px/2px 空隙、无轨道内游标元素,24 组宽度/zoom
组合共 144 项断言通过;tools/mock-react.mjs对齐真实 React 的两处语义(effect cleanup 保存与执行、
渲染后补全 mock DOM 父子链),供外点判定测试使用;可选waapi运行时记录
element.animate调用。
test-android-compat.mjs13 项、test-workbuddy-contract.mjs5 项(真实 0.7.4
移植包源码契约)通过,模拟无 shell / 无账号 / 无 configEditor 宿主依旧成立。
升级
dsh plugin --profile web add dsh-usage-dock@0.8.2桌面端按实际 profile 使用 --profile desktop。安装后重启 DSH / 安卓引擎并刷新页面。