Repository navigation
Releases: lunaship/dsh-cetus
Release list
app-v0.5.0-beta.27
官方签名 APK。
- 版本:
0.5.0-beta.27(versionCode 35) - 最低 Android:8.0(API 26)
- 签名证书:
CN=DSH Links, OU=lunaship, O=lunaship, C=CN - 证书 SHA-256:
38f71adf8b67d81042c99a3ec0dfdafb4303dd31e3fc491068ccd534cb482a47 - APK SHA-256:
3022c5a5b25aa05c9e1e597b7a40dfcb54e50ab72aa57cc8a115bc1e583f3223
本包是 0.5.0-beta.23 之后的第一版,包含 0.5.0-beta.24–0.5.0-beta.27 四轮改动(其中 beta.24 / beta.25 / beta.26 从未单独发过 APK)。逐条清单见仓库 CHANGELOG.md。
新能力
- 子代理树(P4.3):会话「⋯」→「子代理」按
parentSessionId组树,显示标题与运行中 / 空闲;父会话卡片在有子代理运行时显示「N 个子代理运行中」。 - 本机预览(P5.1 / P5.2):电脑面板批准一个本机端口后,手机在会话「⋯」→「预览」里经本机回环代理打开它(仍走原有证书钉扎与选路,退出时清掉预览 Cookie 与存储)。插件也会从工具输出里识别
localhost端口,并在会话里提示到电脑上批准。 - 会话用量与花费(P2.1–P2.3):会话用量面板(令牌总量、缓存命中率、系统 / 工具 / 对话消息分段)、预估花费、余额提醒与省钱 / 均衡 / 最强三档。
- 诊断(P1.1–P1.3):主机诊断接口与电脑面板一键检查、App 连接诊断页与主机状态点、Tailscale 优先的备用直连地址。
- 后台与通知(P3.1–P3.3):主机级会话状态事件流;离开 App 后每台电脑只保持一条主机事件连接,全部会话结束后 5 分钟停止;定时任务与长任务完成通知(长任务阈值默认 3 分钟);常驻通知改为进度样式。
- 目标卡与计划清单(P4.1 / P4.2):会话页顶栏下方目标卡(阶段、可收起、暂停 / 继续 / 编辑 / 清除),目标卡下方可展开的计划清单(收起显示「3/7 · 正在:…」)。
体验
- 长回复分段渲染(超过约 320 字拆成多个条目,代码块围栏不拆开);流式增量合帧(48ms 兜底),长回复不再逐 token 触发重组。
- 会话控制:排队消息条(编辑 / 撤回 / 插队)、目标控制、定时任务面板。
- UI 精简整改(7 步):设置页收成 5 个分区、首页顶栏单行、会话流去重(执行中目标与 todo 只在顶部吸顶摘要出现)、悬浮半透明顶栏与输入区、图标统一 16 视口 / 线宽 1.25。
- 顶栏与输入区毛玻璃(Android 12+ 用 Kyant0 Backdrop;低版本、省电或减少透明度时退回半透明 / 不透明)。
- 文件下载完整性校验:插件在响应头返回
x-dsh-link-sha256,App 下载后校验,不一致则丢弃并报错。 - 通知栏审批默认只提供「拒绝」;新增「允许在通知栏直接批准」(默认关闭,仅 Android 12+,需解锁)。锁屏下的审批通知不显示工具名。
- 对话中的网络图片默认不自动加载,点按单张加载;新增「隐私」设置分组。
修复
- 半透明修饰符把内容绘制两遍;会话页输入区在旧布局下被消息区挤出屏幕;工具摘要
LazyColumnkey 可能重复导致崩溃;轮中助手消息无法长按复制;SSE 重连时误报「电脑离线」。 - 公式(KaTeX)与 Mermaid 的离屏 WebView 禁止联网并加 CSP,只放行随包打包的本地 bundle。
- 英文界面不再混中文;辅助信息小字号由 11sp 调到 12sp。
安装
- 下载
app-release.apk(Android 8.0 及以上),允许「安装未知应用」后安装。 - 覆盖安装即可,配对数据保留;包名
dev.deeplinks。debug 包dev.deeplinks.debug是另一个应用,从它迁移需要重新配对。 - App 不会在内部下载安装包;设置 → 关于 里的「检查新版本」只会用系统浏览器打开本 Release 页面。
说明
- 远程连接(DLP/1)仍是实验性、默认关闭;不要直接把
18640暴露到公网。 - 上面几项新能力里的插件侧接口(诊断、预览端口、会话控制、用量)需要宿主上的插件为
0.1.0-beta.19(main)。旧插件下 App 会按能力协商隐藏这些入口。 - 校验和见同目录
app-release.apk.sha256,可用shasum -a 256 app-release.apk核对;apksigner verify --print-certs app-release.apk可核对证书指纹。
app-v0.5.0-beta.23
官方签名 APK。
- 版本:
0.5.0-beta.23(versionCode 33) - 最低 Android:8.0(API 26)
- 签名证书:
CN=DSH Links, OU=lunaship, O=lunaship, C=CN - 证书 SHA-256:
38f71adf8b67d81042c99a3ec0dfdafb4303dd31e3fc491068ccd534cb482a47 - APK SHA-256:
3f35675a0990d90a94ddaeeced8150ff5b335965db8873860ff2623f08494df6
主要修复(相对 0.5.0-beta.21):
- 修复远程冷启动闪退:
WorkspaceActivity在ON_START(回前台)于主线程调用HostHttp.evictIdleRemote()→ OkHttpconnectionPool.evictAll()关闭远程隧道时写 TLS 关闭帧 →NetworkOnMainThreadException。仅远程路径必现(局域网不复现)。现统一经HostHttp.evictPools转后台执行,并加架构守卫测试。 - 新增本地崩溃记录(设置 → 上次崩溃,可复制/分享/清除,脱敏、最多 3 份)。
- 冷启动提速:会话列表本地加密缓存(先显示缓存再刷新)、启动去重、蜂窝网络跳过局域网探测、首页不预加载。
- 配对去掉手输地址/配对码,改为「扫描二维码 / 从相册识别」。
- 插件对大于 1KB 的 JSON 响应开启 gzip(约 113KB → 约 15KB)。
校验和见同目录 app-release.apk.sha256。
app-v0.5.0-beta.20
官方签名 APK。
- 版本:
0.5.0-beta.20 - 签名证书:
CN=DSH Links, OU=lunaship, O=lunaship, C=CN - 证书 SHA-256:
38f71adf8b67d81042c99a3ec0dfdafb4303dd31e3fc491068ccd534cb482a47 - APK SHA-256:
a4843b054a2c1b039f0e1f0fe2abefbdd838e73c43c32df6bcfbf59feada059f
校验和见同目录 app-release.apk.sha256。
dsh-links 0.1.0-beta.18
DSH 0.1.7-alpha.1 适配(V4 tool/result 缝合)+ 多帧 zstd 会话日志修复。
- 适配 DSH
0.1.7-alpha.1的 V4 session 日志:tool/result从「role: user+tool-result包装块」升为一等role: tool消息(toolCallId/isError提到message上,content直接是内层内容数组)。新增toolResultMeta()/toolResultContent(),两种形状都认:callId以message.toolCallId为先、回落source.callId;isError以message.isError为先、回落包装块;结果正文在包装块存在时取内层content。 - 修复:V4 会话上失败的
write/edit会被当成成功变更,手机端「产出文件」卡片把失败操作写过的文件也列进来。 - 修复:真实 V3 会话的结果正文原本是把整个
ToolResultBlock序列化后的 JSON,现在取内层正文块(App 侧把tool_result的text当纯文本渲染,无需 App 改动)。 - 兼容性:DSH 源码基线由
0.1.5-rc.2升至0.1.7-alpha.1(npmalpha)。next/0.1.5-rc.3经逐字节比对为本插件相关面上无代码变更(仅package.json版本号)。迁移面与回滚限制(V4 新会话无法在 RC 线读取、settings.yaml一次性导入profiles/web/cordis.patch.yml)详见docs/COMPATIBILITY.md的「DSH0.1.7-alpha.1migration notes」。 - 证据:单测 183 绿(新增 6 条 V3/V4
tool/result用例,先git stash掉src/验证过新用例确会失败);scripts/e2e-arch-smoke.mjs对0.1.7-alpha.135/35(隔离stateDir,操作者state.json哈希未变);操作者 host 已在0.1.7-alpha.1上重启,两台既有手机配对与 Relay 路由凭据完好。真机端到端尚未在本基线重跑。 - 修复:会话日志的多帧 zstd 没被解完。
session*.jsonl.zstd是按追加逐帧写的容器,而 Node 的zstdDecompressSync/createZstdDecompress只解第一帧(后续帧不报错也不出现在输出里),原来的zstdDecompressAll()单次调用只能拿到会话头那一行(实测:973,558 字节的日志只消费了 178 字节)——「从会话文件补全 reasoning」因此一直静默失效(返回空 Map)。新增src/zstd-frames.js,逐帧解压并按解码器自身消费的压缩字节数(bytesWritten)推进;实测同一文件 562 帧 / 1,489 行 / 3.5MB 正文、耗时约 48–99ms。同时该路径现在也能直接读未压缩的session.vN.jsonl。 - 证据:单测 194 绿(新增
test/zstd-frames.test.mjs8 条 +test/session-log-reasoning.test.mjs3 条:多帧、单帧、空输入、逐帧 jsonl 保序、尾随非 zstd 字节只返回前缀、非 zstd 返回空、输出上限抛错、64 帧覆盖、文件→推理→投影端到端)。把decompressZstdFrames临时换回“单次调用旧行为”后这批用例 11 条中 7 条失败,确认测试锁住了该回归。 - 为能真正测到「文件补全思考」这条链路,把日志扫描从
src/index.js抽成src/session-log-reasoning.js的纯函数reasoningBlocksFromSessionLog()(flush 点仍与src/history.js同源),readSessionReasoning只留 IO、路径解析与缓存。 - 验证:
scripts/e2e-arch-smoke.mjs在0.1.7-alpha.1上 35/35(含插件加载,即新模块 import 生效);host 已重启加载新源码,loopbackpair-info/devices/relay-status与手机端18640/dsh-link/health均 200,两台配对完好。 - 未复现:上述验证过程中有一次
npm run prepack报 193/1(未记下用例名),随后连续 8 次全量 + 6 次集成子集重跑均 194/0,无稳定复现。 - 未修复的已知缺口(已确认,非本次改动引入):seeded/forked 会话(日志含
session/end-seed)没有assistant/chunk行,reasoning 只存在assistant/message的contentreasoning 块里;而history.js的assistant/message分支只取text块、文件扫描只认 chunk 行,所以这类会话在手机上不显示思考。 - 仓库卫生:
test/pairing-qr-payload.test.mjs的配对夹具原是从真实pair-info响应抄下来的,含维护者真实主机名、局域网/Tailscale 地址、设备 id、配对码与主机证书指纹。本仓公开,已全部替换为同形状占位值,并重写历史清除旧值。 - Android App 配套版本
0.5.0-beta.20(自适应工作台与导航重构、Mermaid 位图缓存像素预算、高权限命令统一确认、系统分享缓存配额、二级窗口FLAG_SECURE)。
dsh-links 0.1.0-beta.17
DSH Links 插件 0.1.0-beta.17。
安全加固:
- 手机端 danger-full-access 默认拒绝;新增宿主配置
allowMobileDangerFullAccess(默认 false),permission.defaultPreset与权限预设均拒绝而非静默降级。 - 权限变更与文件下载要求该设备正持有对应会话的活跃 SSE 订阅。
session.create的 cwd/workspaceId 限定在已注册工作区内,列表不可用时 fail-closed。- 文件下载与 JSON 响应补安全头部(nosniff / frame-options / referrer-policy);工作区创建与文件接口不再回显 OS 原始报错;
tls.json读取时 chmod 0600。 - Relay 控制面错误脱敏(真实错误只进服务端日志);IPC 握手绑定服务端一次性 challenge 防重放;init 不再把管理员密码打印到 stdout。
- 审计日志记录设备吊销与权限预设变更(短 id,不含 token)。
配套 Android App 0.5.0-beta.19。npm 包不含 relay/ 源码。
dsh-links 0.1.0-beta.16
- 冷启动配对就绪门控:
pair-info/qr.png在 HTTPS 端口真正 listen 之前返回 503proxy_not_ready(含phase与Retry-After),不再出现可用于扫码但证书指纹为空的配对信息;TLS 初始化失败或端口被占用保持明确的 failed 态。Web 面板按phase区分「启动中」与「启动失败」。 - 审批接管兜底:无
callId的审批 waterfall(如沙箱升级审批)回退绑定最近一条未决审批事件,手机可正常决策,5 分钟超时对此类审批实际生效;接管/透传原因写入日志。 - 会话被 Web 端或其它设备占用时,移动 API 返回 409
session_busy与可读文案(此前为笼统 502)。 scripts/e2e-arch-smoke.mjs加固:随机空闲端口 + 独立临时目录、指纹钉扎核验 HTTPS 证书、空会话 SKIP、try/finally 清理。- 新增回归测试:就绪窗口、移动 API 错误映射(npm run prepack 167/167,冒烟 35/35)。
- 配套 Android App:
0.5.0-beta.18(私有仓发布签名 APK)。 - 兼容矩阵与移动同步契约已同步更新(
docs/COMPATIBILITY.md、docs/MOBILE_SYNC_CONTRACT.md)。
dsh-links 0.1.0-beta.15
- 手机 API 下发 Web 归档集合:
bootstrap/sessions携带archivedSessionIds,sessions/search的索引路径与降级标题搜索都过滤已归档会话;旧 App 忽略未知字段。合同见docs/MOBILE_SYNC_CONTRACT.md。 workspace.list适配只认workspace/follow的持久 baseline(跳过瞬态状态帧,不再把瞬态帧当成空快照),并从 baseline 提取archivedSessionIds;流式首帧读加 15 秒期限,读完后始终关闭迭代器。- Android App 配套版本
0.5.0-beta.17;归档集合跟随需本版与该版的组合,旧组合忽略新字段、不破坏既有行为。 workspace.list适配只认workspace/follow的持久 baseline(跳过瞬态状态帧,不再把瞬态帧当成空快照),并从 baseline 提取archivedSessionIds;流式首帧读加 15 秒期限,读完后始终关闭迭代器。- Relay Control 支持维护者开通的管控租户:邀请与 Host 按
user_id隔离。自托管仍是单个admin;没有 App 登录、没有公开注册。会话继续只存在于插件本机。停用租户会立刻作废未用邀请、吊销其 Host,并让已有控制台会话失效;维护者可恢复登录(已吊销 Host 不自动回来)。托管租户默认最多 4 个未用邀请、8 台已接入 Host,避免共享 Relay 被单户占满。配额「已接入」是未吊销名额,插件断开不释放。租户控制台 Host 列表主表只显示占名额的电脑,已吊销折起。邀请主表是未用码和仍占名额的已接入记录,失效折起;清理不会删掉还能对照吊销电脑的已用码。租户概览大数显示已接入占名额与未用邀请(对照上限),不是含已吊销的历史总数,管理员台账列出各户用量,已接入或未用码满额的标「已满」并排到前面(tenant list同理),维护者不开户内机器,对方自己登录去吊销或签发;台账可再复制登录地址(回环不外发)。台账「查看电脑」只列出该户 Host / 邀请 / 记录(类似按用户看节点),优先让对方自己登录吊销;SSH 用tenant hosts --login列出占名额电脑(--all含已吊销,不含路由密钥);未用邀请满额时不带replaceOldestUnused仍返回 409,控制台确认后会作废最早未用码再签发(未用名额仍不超过上限)。满额 ENROLL(接入码有效、名额已满)返回QUOTA_EXCEEDED,插件提示到控制台吊销,而不是再签发接入码。满额不消耗该码,吊销后同一张码可再接入。已接入满额且仍有未用码时,控制台签发按钮改为「同一电脑换路由」,避免作废新电脑已贴的码。吊销腾出名额后,若仍有未用码则提示新电脑再点接入,而不是立刻再签发。租户控制台在已接入满额时显示横幅,离线 Host 标「占名额」,列表把离线占名额的排在前面、最久未见的标「建议吊销」,横幅可一键吊销那台;签发前确认这张码只适合同一电脑换新路由。控制台不再要求换 Relay 前先吊销。控制台操作记录(GET /v1/events)记下谁签发/吊销了邀请与 Host,以及控制台登录成败(不含接入码、密码、会话)。未知登录名的失败不写入,以免冲掉真实操作记录。维护者可用dsh-links-relay tenant在本机开通/停用/恢复租户。Host 列表显示插件本机主机名,并按 AgentREGISTER与节流后的PING显示在线/离线(写入last_seen_at);插件断开后立即离线,不是 90 秒窗口里的假在线。插件「断开」暂停 Agent 并保留路由凭据,可重连,不是吊销。同一电脑贴新接入码会换新路由、不占额外名额;旧路由的REVOKED不会擦掉新凭据,接入失败会恢复原 Agent。换到别的 Relay 会先 409 确认(confirmRelaySwitch);新接入成功后插件会对原 Relay 发REVOKE_SELF以空出名额,原 Relay 不可达时才提醒去原控制台吊销,若原接入串带有控制台地址则插件可打开「原控制台」(不是 App 登录)。新电脑贴带控制台地址的接入码却满额时,插件记住该公网地址,刷新后仍可打开控制台去吊销。更换或换 Relay 成功后插件提示同一网络下的手机下次打开即可跟上,纯远程请重新扫云端配对码,手机不登录控制台。云端配对码在插件已有有效路由时即显示,不必等 Agent 心跳在线;暂停或吊销后隐藏。换路由后云端码按路由戳刷新,避免扫到旧码。AppCONNECT在 MAC 通过后若 Host 已吊销或旧路由已被替换,返回REVOKED(不是AUTH_FAILED),手机清掉失效云端路由、保留局域网配对,并在设备列表留下「扫码恢复云端」(本机标记,不登录 Control)。设备列表健康探测不再把该错误当成暂时离线,也不再因此删除整台配对。GET /dsh-link/mobile/bootstrap带当前relay快照(未接入为null),同一网络下可换上新路由。插件暂停仍是可重试的AGENT_OFFLINE。匿名日流量挂起返回可重试的RATE_LIMITED,不是REVOKED:插件保留路由凭据,手机保留配对,控制台显示「挂起(日流量)」,UTC 零点后自动恢复;邀请制租户不受日流量限制。控制台吊销 Host 后,插件把REVOKED当终态:停止 REGISTER 重连、清掉 route 凭据(保留本机 Host 密钥以便再接入),并提示到控制台签发新接入码。控制台「复制」优先给出可粘贴进插件的完整接入串(含主机);裸邀请码只作为官方 Relay 的简写。吊销后在同一台自建 Relay 上再贴裸码,会回到已记住的主机,而不是误连官方。新开或被重置密码的租户必须先改成自己的控制台密码,才能签发或吊销;自建admin仍只用 config 密码。TLS 反代若对回环 Control 走 HTTP,可设admin_secure_cookies,登录 Cookie 才会带 Secure;自建http://127.0.0.1保持关闭。Control 只在对端是回环时采信X-Forwarded-Proto/X-Forwarded-For,这样租户经 HTTPS 反代能登录,登录限流也不会把所有人算成本机。租户可自己改控制台密码,管理员可重置;其它控制台会话会失效。租户可清理自己的失效邀请和已吊销 Host,不会动到别人;Host 列表用电脑名、Host ID 和接入时间区分同名电脑,邀请记录标出消费该码的电脑(吊销或删除 Host 后仍保留当时的电脑名),电脑仍占名额时可从该行吊销,操作记录带电脑名(仍不含接入码)。接入码默认 8 小时、最长 24 小时;控制台可选 30 分钟 / 2 小时 / 8 小时 / 24 小时,签发结果写出截止时间;超长ttl会被夹紧。满额 ENROLL 不消耗该码,并把短于默认时长的未用码续到 8 小时(不超过签发后 24 小时),方便吊销后再贴。开通租户后优先交出 config 的public_control_url(指向回环 8080 的 HTTPS 反代);未配置时才抄非回环 Origin。127.0.0.1不会当成租户登录入口。配置了该地址时,接入串带c=,插件记住并可「打开控制台」;手机 bootstrap / 云端码不含此字段。App 仍不登录 Control。插件「断开」仍只暂停;「释放名额」发送 DLRREVOKE_SELF,立刻空出控制台已接入名额(手机随后看到REVOKED,云端字段失效、局域网配对仍在),不经过 App 登录。 - 历史把成功的 write/edit/str_replace_editor 投影为本轮产出文件;
GET .../sessions/:id/file?path=在工作区沙箱内读文件(上限 8MB)。bootstrapcapabilities.files.workspace声明该能力。 - 会话列表不再下发 JSON
null的agentPreset/cwd等可选字段。旧 App 的JSONObject.optString会把null显示成顶栏字面量「null」;缺键则回落默认预设。 - 兼容性:DSH 源码基线由
0.1.2-alpha.5升至0.1.5-alpha.2(npmalpha)。npmlatest现为0.1.5-rc.1(next为0.1.5-rc.2)。详见docs/COMPATIBILITY.md。 - 移动端同步合同写明:
GET .../requests快照须带 pending 澄清题目与审批元数据;App 历史刷新 / 重同步后不得丢掉仍 pending 的澄清与审批卡。 - Relay README 不再把已删除的旧私有仓写成「已归档」;race 测试命令与 CI 一致,不再把
CGO_ENABLED=0和-race写在一起。 - CI 比对插件
testdata/dlr1-vectors.json与同仓relay/testdata镜像;RC1 证据脚本的 Relay 命令与门禁对齐。 - README 截图标明仍来自 App
0.5.0-beta.14;SECURITY 写明公开仓含relay/源码、npm 包不含。
Beta / Android only / Trusted LAN / Relay 内测(需接入码)。安装:dsh plugin --profile web add dsh-links@0.1.0-beta.15
兼容与未验证项见 docs/COMPATIBILITY.md 与 docs/MOBILE_SYNC_CONTRACT.md。
dsh-links 0.1.0-beta.14
dsh-links 0.1.0-beta.14
- 补发超过 500 事件时不再静默跳号:无法证明连续覆盖则发重同步信号。
- 多题澄清改为逐题校验;旧 App 不声明多题能力时回落桌面。
- 审批与 SSE 断开分离:短暂断线有限宽限,吊销/插件退出立即失效。
- 历史与实时流把
approval/asked与approval/decided归并为同一请求状态。 - Relay 源码并入本仓库
relay/。Android App 仍为私有源码,配套版本0.5.0-beta.16。 - npm
beta自0.1.0-beta.12以来的下一发包;源码线上的0.1.0-beta.13(DSH0.1.2-alpha.5适配)未单独发包,本版一并包含。
Beta / Android only / Trusted LAN / Relay 内测(需接入码)。安装:dsh plugin --profile web add dsh-links@0.1.0-beta.14
兼容与未验证项见 docs/COMPATIBILITY.md 与 docs/MOBILE_SYNC_CONTRACT.md。
dsh-links 0.1.0-beta.12
dsh-links 0.1.0-beta.12
- 「手机连接」面板 Claude 风重设计(暖象牙 + 赤陶,下划线 Tab,设置/设备分组)。
- 下线
GET /dsh-link/mobile/balance:llm.balance并非 DSH RPC 方法(rc.8 起即不存在),端点从未可用;App 余额入口已容错为不展示。 - 兼容性:DSH 基线
0.1.0-rc.8→0.1.1-rc.2,本机冒烟通过(RPC 集 / events.mux WebSocket / 面板 slot);真机端到端待重跑,见 COMPATIBILITY.md。 - Beta / Android only / Trusted LAN / Relay 内测(需接入码)。Android App 为
0.5.0-beta.14。
dsh-links 0.1.0-beta.11
dsh-links 0.1.0-beta.11 — 2026-08-28
- 「手机连接」面板 UI 重设计:配色收敛为统一的青绿令牌体系(主色/危险/成功/警告各配柔和底色与边线),圆角统一为 8/12/18 三档。
- 面板质感升级:弹窗遮罩毛玻璃、三层投影、品牌头渐变链接图标;二维码卡片加高光与虚线装饰框,配对码下方补充扫码引导文案。
- 交互细节:待确认设备圆点呼吸动效(
prefers-reduced-motion下自动关闭)、主/次按钮与输入框完整 hover/active/focus/disabled 状态、「配对需本机确认」升级为卡片式开关、设备列表数量徽标、暴露警告加警示图标、弹窗支持 Esc 关闭。 - 逻辑、数据流与接口调用无变更;Android 客户端仍为
0.5.0-beta.14。
安装:dsh plugin --profile web add dsh-links@0.1.0-beta.11