github zhu1090093659/dsh-web v0.4.16
dsh-web v0.4.16

one hour ago

本次发布围绕旧自更新面收口、双端交互协同与多处跨端运行期修复展开:已被官方插件页原生覆盖的家族自更新包 @linxin666/dsh-update 整包移除(聚合包保留 @linxin666/dsh-web-all/update 静默 tombstone);远程接入(dsh-remote-bridge)将待答提问与审批改为桌面浏览器面板与已配对手机双侧同显、先答者结算,并退役离线提问独占认领窗口;工坊中继(dsh-market)识别并解压隧道宿主未声明编码的 gzip 响应,消除边缘二次压缩造成的手机端乱码(issue #2030);任务看板(dsh-task-board)在卡片携带未完成子任务但部署运行旧代 Agent Teams 时于启动前 fail closed(issue #2031);浏览器视图(dsh-browser-view)在 CDP 连接断开后自动重建会话并拆分连接与命令超时预算;技能中心(dsh-skill-explorer)、会话归档(dsh-session-archive)、小队(dsh-agents)、梁神预设(dsh-liangshen)、窄屏抽屉(dsh-web-all 与 dsh-remote-web-ui)、图表(dsh-diagrams)与 Windows 终端(dsh-win-bash)同步落地一系列稳定性与安全修复。四个卫星仓在本版同版本对齐到 0.4.16。

移除 @linxin666/dsh-update 家族自更新包:DSH 0.2.2-rc.1 已在官方插件页提供全量已装 bundle 的注册表版本检查、宿主下限门禁与就地移除/安装/还原流程,聚合包也已于 0.4.14 停止挂载 web-ui-update 行。本版将 packages/dsh-update 连同俄语 update 字典、6 处共享模块同步目标与 4 项门禁基线一并删除;聚合包继续保留 @linxin666/dsh-web-all/update 子路径导出、retiredPlugins 登记与 shellNotes 行作为静默 no-op 的 tombstone,存量 profile 升级或启动不会因旧行名报错,npm 上已发布的 @linxin666/dsh-update@0.4.15 仍可解析。
远程接入待答提问与审批双侧可见、先答者生效:此前 dsh-remote-bridge 认领用户提问或审批时未调用 next(),导致问题被手机认领后桌面浏览器面板无法渲染同一张卡片。现在提问与审批在认领成立的同时立即向下放行给宿主应答链,桌面端与手机端同时持有待答卡片,任一侧先作答即完成结算:宿主面板先答时,桥向已声明 questions.v1 或 approvals.v1 的连接广播 state: "settled" 并释放认领;手机先答时,桥返回手机答案并忽略宿主链随后的结果;宿主链 reject 或返回默认 unavailable 不视为裁决,手机侧认领继续可答。当 ctx.typertGateway.hasLiveClient() 为真(桌面面板在线)时不再发送重复 APNs 推送;原 10 分钟离线提问独占窗口(OFFLINE_QUESTION_CLAIM_TTL_MS 及环境变量 DSH_REMOTE_BRIDGE_OFFLINE_CLAIM_TTL_MS)一并退役,离线认领保持至被回答、宿主截止时间到期或插件卸载。
工坊中继补齐未声明的传输编码与部署密钥轮询(issue #2030):被隧道穿透的 DSH 宿主对部分响应无论请求头如何都会返回 gzip 压缩字节且不带 Content-Encoding,导致 Cloudflare 边缘二次压缩,手机端只解开一层后将页面渲染成乱码。market/worker/src/relay-encoding.js 现检查未声明 Content-Encoding 的响应首块,对以 gzip 魔数(1f 8b 08)开头的响应流在 Worker 内解压为原始字节并附上 Cache-Control: no-transform,quick 与 bridge 两条链路统一经此出口返回;scripts/deploy-market 在刷新 TURNSTILE_SECRET 与 ASSET_ATTEST_SECRET 后轮询等待密钥列表收敛,消除版本传播竞态导致的误判失败。
任务看板强制调度器预置无法编排时 fail closed(issue #2031):携带未完成子任务的卡片会被强制切到 liangshen 预设执行,但在挂载了旧代官方 Agent Teams(注册 spawn_teammate 工具)的部署上,梁神预设的 R0.5 兼容门会立即停下等待人工点击退出选项,无人值守或定时触发的卡片因此永远卡在 running 列。dsh-task-board 现在于创建任何会话前读取宿主工具注册表,一旦探测到 spawn_teammate 即以具名错误直接拒绝本次启动,并在执行日志中按读者语言(中/英/俄)给出排查与处置说明。
浏览器视图自动替换已关闭的 CDP 会话并拆分超时预算:此前 dsh-browser-view 的真实浏览器模式把 5 秒连接时限沿用为后续所有 CDP 命令的超时,导致慢页面频繁触发假超时,且浏览器重启或底层 socket 断开后旧会话被一直复用直至重启宿主。现在连接预算(外部端点 5 秒)与命令执行预算(CDP_COMMAND_TIMEOUT_MS,30 秒)拆分为独立旋钮;当下一次工具调用发现传输已关闭时,自动按配置变更同款的清理路径丢弃失效会话(对外部浏览器仅分离而不关闭进程,对已退出的隔离 Chromium 执行销毁并重拉起),并为并发调用方共享同一个新建会话。
技能中心准入、窄屏抽屉命中、小队会话桥接与归档删除保护预览:dsh-skill-explorer 接入宿主可选的 connection 服务,凡经 --trusted-host 或有效签名浏览器会话接纳的反向代理请求均可直接访问 /api/dsh-skill-explorer/*(issue #2025、#2026);dsh-web-all 与 dsh-remote-web-ui 为窄屏抽屉层级补上 !important 并将聚合遮罩设为 pointer-events: none,修复官方布局运行时注入样式表赢下同权重平手后把抽屉压到遮罩下方、导致抽屉内点击失效或首击关闭抽屉的问题(issue #2012、#2013、#2014);dsh-agents 改用实例级 ctx.inject 实时桥接 uiWorkspace 与 sessions,消除插件加载顺序导致「打开会话」按钮永久缺失的问题;dsh-session-archive 下发宿主侧 attached 与 in-flight 保护原因并按 in-flight > current > attached > running 合并,使行内删除禁用态、全保护批量删除禁用态与确认框跳过数同宿主权威计划完全一致(issue #2022)。
梁神预设工具面与事实折叠、图表净化及 Windows Unicode HOME 修复:dsh-liangshen 改为从步骤准入的 tools.schemas(agent, context.toolSet) 读取目录表面并通过 ctx.tools.restrict() 施加分页,修复 SDK 2.0.22 将工具声明收回 provider 后子会话误报无工具的问题(issue #2016),同时让 foldFactLedger 一并折叠默认 ptc 呈现下的 tool/ptc-dispatch 事件并跳过报错调用;dsh-diagrams 改用 URL 解析器提取链接 scheme,剥离借 TAB/LF/CR 拆分或前置 C0 控制字符隐藏的 javascript: URL(issue #2017);dsh-win-bash 为随包 MSYS bash 显式注入 HOME(优先保留既有 HOME,缺失时取 Node homedir()),避免含非 ASCII 字符的 Windows 用户目录经 ANSI 代码页推导损坏(issue #2028)。
四个卫星仓同版本对齐到 0.4.16:皮肤中心(dsh-skins)上架 equation-sea、pixel-whale 与 md3 三套新皮肤(商店皮肤扩充至 65 套),将 diy-journal 字体转写为 Woff2 并压缩贴纸与插画使包体积缩减 62%,补齐 model-dorm 浮层阴影与圆角运行时令牌并修正 3 个令牌名,修复 equation-sea 右侧栏与商店卡片对比度,排除 4 套模板里发送键选择器对附件栏删除按钮的误命中,并将皮肤中心的全屏面板不透明底色限定在 data-sidebar-right-open 打开态下绘制(5f51988d1249173509c77129670e3be5cfd514a8);宠物(dsh-pet)重绘 whale-girl-refined 左右奔跑动作的 8 帧序列,擦除腰部多余的远端袖口与手部伪影并按逐像素水平镜像对齐左跑行(ae2c9d443eda35a6439597c1787c7607e988bbed);社区插件索引(dsh-community-plugins)退役 52 个宿主下限仍停留在 0.1.x 的历史条目,新收录 dsh-plugin-desktop-notify、@chendaleiq/dsh-plugin-auto-update、dsh-tutorloop、dsh-character-cards、dsh-power-menu-mac 与 dsh-keenable,恢复已适配新底座的 dsh-llm-verifier,当前商店目录共 106 个插件(f0b8ad9de23ddd9fc1cc81c66196f566c1b8859a);预设中心(dsh-presets)与主仓同步对齐版本号至 0.4.16(5752778d13f97e3f81467178559efd973777da53)。

升级须知

  • 宿主最低版本要求保持 DSH >=0.2.2-rc.1:本版未抬高 dsh.engines.dsh 与 @deepseek-ai/dsh 对等依赖下限,已满足 0.4.15 运行条件的宿主可直接升级。
  • @linxin666/dsh-update 整包移除与存量兼容:自更新包源码与独立发布线自本版起终止,插件版本检查与更新统一在官方插件页执行。聚合包保留 @linxin666/dsh-web-all/update 静默 tombstone 与 retiredPlugins 登记,存量全量 profile 无需手工删行即可平滑升级;若此前曾单独安装 @linxin666/dsh-update,旧版 0.4.15 仍留在 npm registry,建议在插件页将其卸载并改用官方插件页自带的更新检查。
  • 远程接入离线提问认领窗口配置项退役:dsh-remote-bridge 的待答提问现由桌面面板与已配对手机双侧同显、先答者结算,原 10 分钟离线独占窗口(环境变量 DSH_REMOTE_BRIDGE_OFFLINE_CLAIM_TTL_MS)已移除,设置该环境变量不再产生任何效果。
  • 任务看板对旧代 Agent Teams 强制编排预设执行前置拦截:若部署启用了旧代官方 Agent Teams(工具注册表含 spawn_teammate),包含未完成子任务的看板卡片在启动时会被立即拒绝并标记失败,而不会再拉起卡死在兼容门上的会话。需运行此类父子卡片时,请先升级到当前代官方 Agent Teams,或在设置中停用旧代团队运行时后重启宿主。
  • 升级入口支持矩阵:仓库内不存在 Doctor 预启动迁移,官方插件页(或插件管理器更新任务)是具备配置备份、--dump-config 预检与失败自动回滚的推荐升级入口;客户端 bundle 与宿主服务改动在升级后需重启 dsh web 并刷新浏览器页面生效。
  • 平台验证声明:本版在 Linux(Ubuntu x86_64)环境下完成了本地门禁与只读核验。Windows 与 macOS 未在物理实机上验证——dsh-win-bash 为非 ASCII Windows 用户目录显式注入 HOME 的改动(issue #2028)仅经单元测试覆盖其环境构造契约,未在物理 Windows 主机上做实机挂载验证。

新功能

  • [remote-bridge] 待答提问与审批同时呈现在桌面浏览器面板与已配对手机上,先作答者结算,离线提问认领持续至被回答、宿主截止或插件卸载
  • [market] 创意工坊上架 equation-sea、pixel-whale 与 md3 三套新皮肤(共 65 套),并将 diy-journal 皮肤包体积缩减 62%
  • [market] 创意工坊新收录社区插件 dsh-plugin-desktop-notify、@chendaleiq/dsh-plugin-auto-update、dsh-tutorloop、dsh-character-cards、dsh-power-menu-mac 与 dsh-keenable,并恢复 dsh-llm-verifier

修复

  • [remote-bridge] 认领提问或审批后立即放行宿主应答链并在任一侧结算时通知另一侧,桌面面板在线时不再重复发送 APNs 推送
  • [market] 解压隧道宿主未声明 Content-Encoding 的 gzip 响应首块并附上 Cache-Control: no-transform,消除边缘二次压缩导致的手机端乱码 (#2030)
  • [task-board] 含未完成子任务的卡片在强制使用梁神预设而部署运行旧代 Agent Teams 时于建会话前 fail closed (#2031)
  • [win-bash] 为随包 MSYS bash 显式提供 HOME(优先继承环境,缺失时取 Node homedir()),修复 Unicode 用户目录经 ANSI 代码页推导损坏的问题 (#2028)
  • [skill-explorer] 放行经宿主 connection 服务接纳的请求(--trusted-host 与有效签名浏览器会话)进入 /api/dsh-skill-explorer/* (#2025 #2026)
  • [browser-view] 在 CDP 传输关闭后自动丢弃旧会话并重建共享替换会话,同时将 5 秒连接时限与 30 秒命令超时拆分为独立预算
  • [session-archive] 下发宿主侧 attached 与 in-flight 保护原因并按权威优先级合并,使列表行内删除按钮、全保护批量删除禁用态与确认框跳过计数同宿主实际拒绝集合一致 (#2022)
  • [agents] 按实例通过 ctx.inject 实时桥接可选的 uiWorkspace 与 sessions 服务,晚于本行挂载时自动启用会话入口,缺席时保持按钮可见置灰并写明原因
  • [web,remote-web-ui] 为窄屏侧栏抽屉层级补充 !important 并将聚合遮罩设为 pointer-events: none,修复后注入的官方布局样式表压低抽屉层级导致点击穿透或首击误关抽屉 (#2012 #2013 #2014)
  • [liangshen] 关键事实登记簿(foldFactLedger)同时折叠 tool/ptc-dispatch 与 tool/call 事件并跳过报错的 PTC 调用,修复出厂默认 ptc 呈现下登记事实不进入 [Working Context] 的问题
  • [liangshen] 从步骤准入的 tools.schemas(agent, context.toolSet) 读取工具目录表面并按 ctx.tools.restrict() 施加分页,修复 SDK 2.0.22 后子会话误报无工具的问题 (#2016)
  • [diagrams] 通过 URL 解析器判别链接 scheme,剥离借 TAB/LF/CR 拆分或前置 C0 控制字符隐藏的 javascript: URL (#2017)
  • [pin] 将 dsh-message-edit 与 dsh-web-settings 的 @deepseek-ai/dsh-client-ui-slots 映射至包内 registry 副本,并对齐 dsh-remote-bridge 的 dsh-user-questions 可变答案数组签名,修复宿主 SDK 钉死下的本地 typecheck 与 build
  • [market] 部署脚本在刷新 TURNSTILE_SECRET 与 ASSET_ATTEST_SECRET 后轮询等待密钥列表生效窗口,消除版本传播竞态导致的误报失败
  • [pet] 重绘 whale-girl-refined 左右奔跑帧以擦除腰部多余远端袖口与手部伪影,并同步刷新创意工坊精灵图资产 (#2021)

其他改动

  • [dsh-update] 整包移除家族自更新插件 @linxin666/dsh-update(源码、俄语 update 字典、共享模块同步目标与四项门禁基线行),保留 @linxin666/dsh-web-all/update 静默 tombstone,插件版本检查与更新归口至官方插件页
  • [market] 退役 52 个宿主下限停留在 0.1.x 的社区插件条目,并在合并皮肤、插件与宠物卫星更新后重建 market/dist(当前共 65 套皮肤、12 只宠物、106 个插件、33 个预设)
  • [satellites] 前移 dsh-skins、dsh-pet、dsh-community-plugins 与 dsh-presets 四个子模块 gitlink 到各自 0.4.16 发布提交,同步皮肤中心全屏面板不透明修饰符与各轮准入决策记录
  • [remote-bridge] 在双语 README 中移除已退役的离线提问独占认领窗口说明,对齐双端同显与先答生效语义
  • [readme] 同步根双语 README 的家族插件表、社区规模与模型配置示例,并转义波浪号区间以避免 GFM 删除线误渲染
  • [notes] 记录宿主 SDK 钉死对本地门禁的影响及修复、移除 dsh-update、窄屏抽屉命中测试与 win-bash 显式 HOME 等决策笔记

English

This release focuses on retiring redundant self-update infrastructure, coordinating dual-surface interactions, and hardening cross-platform runtime behavior: the family self-update package @linxin666/dsh-update is removed outright now that the official Plugins page natively handles version checks and updates (while @linxin666/dsh-web-all/update stays as a silent tombstone); remote access (dsh-remote-bridge) displays pending user questions and approvals on both the desktop browser panel and paired phones with first-answer-wins settlement, retiring the offline exclusive claim window; the Workshop relay (dsh-market) detects and decompresses undeclared gzip responses from tunneled hosts so Cloudflare does not double-compress them into mojibake on mobile (issue #2030); the task board (dsh-task-board) fails closed before creating a session when a card with unfinished subtasks is forced onto the LiangShen preset on a deployment running the legacy Agent Teams generation (issue #2031); the browser view (dsh-browser-view) automatically replaces closed CDP sessions and splits connection and command timeout budgets; and a batch of stability and security fixes lands across dsh-skill-explorer, dsh-session-archive, dsh-agents, dsh-liangshen, mobile drawers (dsh-web-all and dsh-remote-web-ui), dsh-diagrams, and dsh-win-bash. The four satellite repositories align to 0.4.16.

Remove the @linxin666/dsh-update family self-update package: DSH 0.2.2-rc.1 checks and installs registry updates for every installed bundle on the official Plugins page, complete with the DSH minimum floor gate and the remove/install/restore steps, and the aggregate had already stopped mounting the web-ui-update row in 0.4.14. This release deletes packages/dsh-update together with the Russian update dictionary, six shared-module sync targets, and four gate baseline rows. The aggregate keeps the @linxin666/dsh-web-all/update subpath export, retiredPlugins entry, and shellNotes row as a silent no-op tombstone so existing profiles continue to resolve cleanly, and @linxin666/dsh-update@0.4.15 remains on npm.
Pending remote questions and approvals show on both sides, first answer wins: claiming a user question or an approval in dsh-remote-bridge previously never called next(), hiding the card on the desktop browser panel whenever a phone held the claim. Both claims now pass the request to the host's answerer chain immediately so the desktop panel and paired phones hold the card at the same time and the first answer settles it: when the host panel answers first, the bridge broadcasts state: "settled" to connections declaring questions.v1 or approvals.v1 and releases the claim; when a phone answers first, the bridge resolves with the phone's answer and ignores the host chain's later completion; a host chain rejection or default unavailable is not treated as a verdict, leaving the claim answerable on the phone. APNs pushes are suppressed while ctx.typertGateway.hasLiveClient() is true, and the 10-minute offline exclusive claim window (OFFLINE_QUESTION_CLAIM_TTL_MS and DSH_REMOTE_BRIDGE_OFFLINE_CLAIM_TTL_MS) is retired so an away-phone claim lives until answered, expired by the host deadline, or unloaded.
Workshop relay normalizes undeclared wire encodings and polls secret propagation (issue #2030): a tunneled DSH host compresses some responses regardless of request headers without setting Content-Encoding, causing the Cloudflare edge to compress the gzip body a second time and leaving mobile clients with mojibake after decoding one layer. market/worker/src/relay-encoding.js now inspects the first chunk of responses lacking Content-Encoding, decompresses gzip streams (1f 8b 08) into identity bytes, and attaches Cache-Control: no-transform across both quick and bridge relay paths; scripts/deploy-market also polls the secret list after updating TURNSTILE_SECRET and ASSET_ATTEST_SECRET to wait out the deployment version propagation race.
Task board fails closed when the forced dispatcher preset cannot orchestrate (issue #2031): a card with unfinished subtasks is forced under the liangshen preset, whose R0.5 compatibility gate stops and waits for a human reply on deployments running the legacy Agent Teams generation (spawn_teammate), leaving unattended or scheduled runs stuck in the running column forever. dsh-task-board now inspects the agent tool registry at launch, refuses the run before any session is created when spawn_teammate is present, and renders a localized explanation in the reader's language (zh/en/ru).
Browser view replaces closed CDP sessions and splits connect and command budgets: a real-browser session in dsh-browser-view previously reused its 5-second connect deadline for every subsequent command and returned a closed transport forever after a browser restart. The 5-second external connect bound and the 30-second command timeout (CDP_COMMAND_TIMEOUT_MS) are now separate knobs, and the next tool call on a closed transport disposes the stale session (detaching an external browser without closing it, or stopping and relaunching an exited isolated Chromium) and opens a single replacement shared across concurrent callers.
Skill explorer admission, mobile drawer hit-testing, squad session bridges, and archive protection previews: dsh-skill-explorer consults the optional host connection service so reverse-proxy requests admitted via --trusted-host or a signed browser session pass straight into /api/dsh-skill-explorer/* (issues #2025, #2026); dsh-web-all and dsh-remote-web-ui mark the mobile sidebar drawer z-index: 1100 !important and set the aggregate mask to pointer-events: none, preventing the runtime-injected official layout stylesheet from winning the equal-specificity tie and burying the open drawer beneath its own mask (issues #2012, #2013, #2014); dsh-agents bridges uiWorkspace and sessions per instance via ctx.inject so providers mounting after the plugin enable session entry points dynamically while deployments without them keep the buttons visibly disabled with an explanation; and dsh-session-archive ships host-side attached and in-flight protection reasons and merges them under in-flight > current > attached > running so row delete buttons, fully protected batch selections, and confirmation skip counts match the host's authoritative plan (issue #2022).
LiangShen catalog admission and fact folding, diagram URL sanitization, and Windows Unicode HOME: dsh-liangshen reads the step tool surface from tools.schemas(agent, context.toolSet) and pages via ctx.tools.restrict(), fixing false no-tools assertions in seeded child sessions on SDK 2.0.22+ (issue #2016), and updates foldFactLedger to replay both tool/ptc-dispatch and tool/call events while ignoring errored dispatches so pinned facts reach [Working Context] under the default ptc presentation; dsh-diagrams parses attribute URLs before checking their scheme so javascript: URLs split by TAB/LF/CR or prefixed with C0 control characters are stripped (issue #2017); and dsh-win-bash explicitly supplies HOME (base.HOME ?? homedir()) to the vendored MSYS bash so Windows profiles with non-ASCII characters are not corrupted by ANSI code-page derivation (issue #2028).
The four satellite repositories align to 0.4.16: the skin center (dsh-skins) adds three new skins (equation-sea, pixel-whale, and md3, expanding the catalog to 65 skins), converts diy-journal fonts to Woff2 and compresses artwork to shrink the package by 62%, covers floating-surface shadow and radius tokens and fixes three token names in model-dorm, improves equation-sea right-rail and market-card contrast, excludes the attachment rail from composer send-key rules across four skin templates, and restricts the opaque fullscreen-panel fill in the skin center to the open data-sidebar-right-open state; the pet plugin (dsh-pet) repaints the eight-frame whale-girl-refined running rows to erase the stray far-arm cuff and hand at the waist and mirrors running-left pixel-for-pixel from running-right; the community plugin index (dsh-community-plugins) retires 52 legacy entries whose host floor predates 0.2.0, registers dsh-plugin-desktop-notify, @chendaleiq/dsh-plugin-auto-update, dsh-tutorloop, dsh-character-cards, dsh-power-menu-mac, and dsh-keenable, and restores dsh-llm-verifier for a catalog of 106 plugins; and the preset center (dsh-presets) aligns its version to 0.4.16.

Upgrade Notes

  • The DSH host floor remains >=0.2.2-rc.1: this release does not raise dsh.engines.dsh or the @deepseek-ai/dsh peer dependency floor; any host already running 0.4.15 can upgrade directly.
  • @linxin666/dsh-update package removal and profile compatibility: the standalone self-update package is removed from the repository and its release line ends here, with version checks and updates handled by the official Plugins page. The aggregate retains the @linxin666/dsh-web-all/update silent tombstone and retiredPlugins entry so existing aggregate profiles upgrade without manual edits; users who installed @linxin666/dsh-update standalone can still resolve 0.4.15 from npm and are advised to uninstall it in favor of the official Plugins page.
  • Retirement of the remote-bridge offline question claim TTL knob: pending questions in dsh-remote-bridge now appear on both the desktop browser panel and paired phones with first-answer-wins settlement, and the 10-minute exclusive offline claim window (along with DSH_REMOTE_BRIDGE_OFFLINE_CLAIM_TTL_MS) has been removed; setting that environment variable now has no effect.
  • Pre-launch fail-closed check for forced dispatcher presets on legacy Agent Teams: on deployments where the legacy official Agent Teams runtime (spawn_teammate) is active, task board cards carrying unfinished subtasks are now refused before any session is created instead of spawning a session that hangs forever at the compatibility gate. Upgrade to the current Agent Teams generation or disable the legacy runtime and restart the host before running parent cards with subtasks.
  • Upgrade entry matrix: there is no Doctor pre-launch migration in this repository; the official Plugins page (or the plugin manager update task) remains the recommended upgrade entry with configuration backup, --dump-config precheck, and automatic rollback. Restart dsh web and refresh the browser after upgrading so host service and client bundle changes take effect.
  • Platform verification: this release passed the local gate suite and read-only verification on Linux (Ubuntu x86_64). Windows and macOS remain unverified on physical hardware — the explicit HOME injection in dsh-win-bash for non-ASCII Windows user profiles (issue #2028) is covered by unit tests on shellEnvironment() without a physical Windows mount check.

New Features

  • [remote-bridge] Show pending user questions and approvals on both the desktop browser panel and paired phones with first-answer-wins settlement, keeping offline question claims alive until answered, expired by the host, or unloaded
  • [market] Add the equation-sea, pixel-whale, and md3 skins to the Workshop (65 skins total) and shrink the diy-journal skin package by 62%
  • [market] Register the community plugins dsh-plugin-desktop-notify, @chendaleiq/dsh-plugin-auto-update, dsh-tutorloop, dsh-character-cards, dsh-power-menu-mac, and dsh-keenable in the Workshop, and restore dsh-llm-verifier

Bug Fixes

  • [remote-bridge] Pass claimed questions and approvals through to the host answerer chain immediately, notify the other surface on settlement, and suppress duplicate APNs pushes while a desktop browser client is live
  • [market] Decompress undeclared gzip response streams from tunneled hosts and set Cache-Control: no-transform so the edge does not double-compress pages into mojibake on mobile (#2030)
  • [task-board] Fail closed before creating a session when a card with unfinished subtasks is forced onto the LiangShen preset on a deployment running the legacy Agent Teams runtime (#2031)
  • [win-bash] Explicitly supply HOME (inheriting base.HOME or falling back to Node homedir()) to the vendored MSYS bash so Unicode user profiles are not corrupted by ANSI code-page derivation (#2028)
  • [skill-explorer] Admit requests accepted by the host connection service (--trusted-host and signed browser sessions) into /api/dsh-skill-explorer/* (#2025 #2026)
  • [browser-view] Replace closed CDP sessions automatically and split the 5-second external connect bound from the 30-second command timeout budget
  • [session-archive] Ship host-side attached and in-flight protection reasons and merge them by authoritative precedence so row delete buttons, fully protected batch selections, and confirmation skip counts match the host (#2022)
  • [agents] Bridge the optional uiWorkspace and sessions services per instance via ctx.inject so late-mounting providers enable session openers while deployments without them keep the buttons visibly disabled with a reason
  • [web,remote-web-ui] Mark the mobile sidebar drawer z-index as !important and set pointer-events: none on the aggregate mask so the runtime-injected official layout sheet cannot bury the drawer beneath its mask (#2012 #2013 #2014)
  • [liangshen] Fold both tool/ptc-dispatch and tool/call events in foldFactLedger while skipping errored PTC dispatches so pinned facts reach [Working Context] under the default ptc presentation
  • [liangshen] Read the step tool surface from tools.schemas(agent, context.toolSet) and page via ctx.tools.restrict() to prevent false no-tools assertions in seeded child sessions on SDK 2.0.22+ (#2016)
  • [diagrams] Parse attribute URLs before matching their scheme so javascript: URLs split by TAB/LF/CR or prefixed with C0 control characters are stripped (#2017)
  • [pin] Map @deepseek-ai/dsh-client-ui-slots to the registry copy in dsh-message-edit and dsh-web-settings and align the mutable dsh-user-questions answer signature in dsh-remote-bridge so local typecheck and build pass under the host SDK pin
  • [market] Poll the secret list after refreshing TURNSTILE_SECRET and ASSET_ATTEST_SECRET in deploy-market to wait out the version propagation race
  • [pet] Repaint whale-girl-refined left and right running frames to erase the stray far-arm cuff and hand at the waist and refresh the Workshop spritesheet asset (#2021)

Other Changes

  • [dsh-update] Remove the @linxin666/dsh-update family self-update package outright (sources, the Russian update dictionary, six shared-module sync targets, and four gate baseline rows) while keeping the @linxin666/dsh-web-all/update silent tombstone, handing plugin version checks and updates to the official Plugins page
  • [market] Retire 52 community plugin entries whose host floor predates 0.2.0 and rebuild market/dist across the skin, plugin, and pet satellite updates (now 65 skins, 12 pets, 106 plugins, and 33 presets)
  • [satellites] Advance all four submodule gitlinks (dsh-skins, dsh-pet, dsh-community-plugins, dsh-presets) to their 0.4.16 release commits, syncing the fullscreen-open qualifier and the intake decision records
  • [remote-bridge] Remove the retired offline question claim window from the bilingual READMEs to match dual-surface display and first-answer-wins settlement
  • [readme] Align the root bilingual READMEs with the current plugin roster, catalog counts, and model configuration examples, and escape tilde ranges to prevent GFM strikethrough rendering
  • [notes] Record decision notes on the host SDK pin local gate fix, the dsh-update package removal, mobile drawer hit-testing, and explicit HOME in win-bash

Don't miss a new dsh-web release

NewReleases is sending notifications on new releases.