| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| dsh-web v0.4.10 source code.tar.gz | 2026-10-26 | 802.4 MB | |
| dsh-web v0.4.10 source code.zip | 2026-10-26 | 806.5 MB | |
| README.md | 2026-10-26 | 22.7 kB | |
| Totals: 3 Items | 1.6 GB | 0 | |
本次发布给远程桥补上一条整页通道(§35 的 ui.v1):agent 可以把一整页交给会话,用户在桌面端看到的是一张真正的页面卡,页面里的第一次操作作为该次调用的结果回到模型;不宣告 ui.v1 的客户端看到的握手与帧与从前完全一致。推送这一版修掉「同一台手机收到两条同样的通知」——发送前按 APNs 令牌收敛目标,一条令牌只投递一次;回合结束的公告也不再在帧到达时就发,而是等到该会话真正静默(宿主自己的运行标志、后代会话与宿主作业都停下)之后再发,最多等十分钟,超时就照发并在日志里写明当时还有什么在跑,因为「永远等不到的通知」正是这条通道要防的失败。桌面端的浏览器视图改用外壳发布的 Host 地址,dsh-app: 交付的页面不再拿自己的 scheme 去猜一个连不上的套接字。
协议仍是 v1,次版本 20 升到 21,纯追加:
PROTO保持 1;MINOR由 20 升到 21,只因多了一条ui.v1能力。hello 的能力表把协议自己的名字排在前面且保持原顺序,扩展插件注册的能力按注册表顺序追加并去重,所以没有挂载扩展的桥宣告的仍是它一直宣告的那份列表。 旧客户端零影响:不宣告ui.v1的客户端拿到的握手、帧与话题都没有变化——整页卡只在声明了该能力的连接上出现。这一版没有删除任何帧、能力位或话题,推送存储的结构版本仍是 2,三条既有推送限额保持原值。 设备表的收敛是幂等的:一台手机一行,重新配对只替换该行上的凭据;读取时把还残留的重复行收敛成「每个指纹一行、每条令牌一条登记」,并经名册自己的串行队列写回。收敛后的表再读一次是空操作(compacted 0 duplicate row(s), retired 0 stale registration(s)),可以重复执行。 本版没有重命名任何持久化或线协议标识符:设置 section id、配置 key、localStorage 键、控制面 API path 与聚合行 id 全部保持原值;新增的都是纯追加。没有手工迁移步骤,正常升级即完成。 卫星范围这一版不动:聚合包对四个卫星仓的依赖范围仍是^0.4.9。卫星仓在各自仓库发布0.4.10并把聚合范围抬到^0.4.10,是紧随其后的下一阶段,不在本次提交内。 转发的整页卡桌面端只渲染、不作答:桌面端用srcdoc加sandbox=allow-scripts的受控 iframe 画出整页文档,页面发来的postMessage只换来一句可见提示,不转发、不落库、不发请求;超过 256 KiB 的页面不渲染并给出可见提示。 回合结束现在要等会话静默:到达的turn/end先登记而不是直接发送,每五秒向宿主问一次「静默了吗」,最长等 600000 毫秒(十分钟)后照发,并在日志里记下当时仍在运行的东西。锁屏不会再在子会话还在跑的时候说「已经结束」。 判定「新回合」更严格:只有能证明开启了一个新回合的增量才算数;子会话的落定通知以 agent 身份的 user 消息到达父会话,不再被当成新回合。 推送去重与既有契约:发送前的目标按设备令牌收敛,重复登记的行在读取时收敛掉,schema 版本不变,没有引入新的帧、能力或话题。 已知限制:干净 profile 首次安装停在ERR_PNPM_IGNORED_BUILDS,而构建脚本的批准必须在首次 add 之前就位:在本机 pnpm 11.9.0 加官方 CLI 0.2.1-rc.3 下,干净 profile 首次用dsh plugin --profile <name> add装@linxin666/dsh-web-all@0.4.9以 exit 1 结束,唯一的报错是[ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: cloudflared@0.7.3, cpu-features@0.0.10, ssh2@1.17.0。失败之后再补审批修不回来:官方 CLI 只在安装命令 exit 0 之后才回写 profile(dsh-plugin-manager的lib/types/operations.js约 499 行),而回写时的 reconcile 只遍历本次运行新加的依赖(同一文件里的if (beforeDeps.has(name)) continue,约 106 行),失败的那次已经把聚合包写进了 manifest,所以补完审批再重跑同一条 add 虽然以 exit 0 结束,dsh.profile.bundles里仍然没有这一行——装上了却没有挂载,--dump-config看不到该 bundle,重跑多少次都停在这个静默的半挂载状态。实测能挂载的顺序是「先审批、后安装」:先用官方--from-default-profile web重置 profile(或换一个没被这次失败污染过的新 profile),在首次 add 之前把这三项写进<profile>/pnpm-workspace.yaml的allowBuilds,然后再 add。--config.strictDepBuilds=false实测只买到挂载,买不到完整安装:它在干净首次 add 上以 exit 0 结束并写入 bundle 行,却在 profile 里留下占位条目(形如cloudflared: set this to true or false),三项原生/二进制构建并不真正执行,既没有bin/cloudflared,也没有build/Release/cpufeatures.node。官方 CLI 只在 git 源插件失败时提示allowBuilds这一步,注册表包不提示;本仓pnpm-workspace.yaml:13的allowBuilds只作用于开发工作区,不作用于用户 profile。已带审批的存量 profile 实测不受影响:一个已经有构建脚本审批的 0.4.9 profile 升级到 registry 上的 0.4.10,以 exit 0 结束,不再要求新的审批,dsh.profile.bundles那一行不变也不重复,--dump-config逐字节相同,重复执行仍然幂等;这道门由审批状态决定,不由依赖新旧决定。完全没有allowBuilds审批记录的存量 profile 实测:命令报错,升级已经落地且仍然挂着:一个没有任何allowBuilds审批记录的 0.4.9 存量 profile,在 pnpm 11.9.0 加官方 CLI 0.2.1-rc.3 下把聚合包升到 registry 上的 0.4.10,命令以 exit 1 结束并报[ERR_PNPM_IGNORED_BUILDS](同样是 cloudflared@0.7.3、cpu-features@0.0.10、ssh2@1.17.0),但升级本身已经落地且保持挂载:profile 的package.json依赖已是 0.4.10,node_modules里 25 个家族包全部 0.4.10,dsh.profile.bundles里聚合包仍恰好一行、不重复,dsh --profile <name> --dump-config以 exit 0 结束且能看到该 bundle 段,25 个家族包声明的 60 个依赖 0 个不可解析;失败的是退出码与后续操作的干净度,不是升级结果或挂载状态,重跑同一条命令仍以 exit 1 结束、不自愈。这一情形的补救实测不需要重装、不需要删 profile:在<profile>/pnpm-workspace.yaml里把 cloudflared、cpu-features、ssh2 三个键写成true(或走交互式pnpm approve-builds),再跑同一条升级命令即以 exit 0 结束,三项原生/二进制构建真正执行(cloudflared 的 postinstall 生成bin/cloudflared,cpu-features 经 node-gyp 生成build/Release/cpufeatures.node,ssh2 生成sshcrypto.node),版本与挂载状态不变、--dump-config逐字节相同。这道门只读审批记录,与构建产物是否已存在无关:构建产物已经在、审批记录缺席的变体同样以 exit 1 结束,状态同样已是 0.4.10 且已挂载。两种失败形态不同,不要混为一谈:干净首发失败后补审批再重跑,是「exit 0 但 bundle 行从未写入」的静默半挂载;这里这种存量升级则是「行本来就在、状态已升级、只是命令报错」。这条限制不是本版引入的:已发布的 0.4.9 在同样环境下同样复现。
新功能
- [remote-bridge]
ui.v1:agent 可以把一整页交进会话,声明了该能力的客户端拿到ui.present,页面里的第一次操作作为这次调用的结果回到模型 - [remote-bridge] 桌面端渲染 §35 的整页卡:
ui.present注册为 keyedtool.call.toolview,调用进行中从参数读html,结算后从meta.ui读html与state,载荷缺席时回退参数 - [remote-bridge] 整页卡是受控 iframe(
srcdoc加sandbox=allow-scripts),高度先按height顶首帧、之后以注入脚本量到的实测为准,主题令牌从 GUI 根元素读出后注入并跟随明暗切换 - [remote-bridge] 桌面端只渲染不作答:页面发来的
postMessage只换一句可见提示,不转发、不落库、不发请求 - [remote-bridge] 超过 256 KiB 的页面不渲染,改为显示可见提示
- [i18n] 整页卡的俄文文案补齐同键
修复
- [browser-view] 桌面端改用外壳发布的 Host 地址:
dsh-app:交付的页面无法在该 scheme 上升级 WebSocket,不再用自己的 location 猜地址;Web 页面仍保留自己的 origin - [remote-bridge] 一次事件按 APNs 令牌投递一次,而不是按行投递一次:同一台手机的同一个令牌挂在两行上不会再收到两条同样的通知,发送前先按设备令牌收敛目标
- [remote-bridge] 重新配对复用指纹已经拥有的那一行,只把凭据搬过去,不再为每次接受新造一行
- [remote-bridge] 读取设备表时收敛重复行与过期登记,并经名册的串行队列写回,收敛可重复执行
- [remote-bridge] 回合结束改在会话静默之后公告:答案只来自宿主(
session/list的运行标志、父链与宿主作业),不猜、不读客户端状态 - [remote-bridge] 静默等待有上限:每五秒问一次,最长 600000 毫秒,到点照发并在日志里写明当时仍在运行的东西
- [remote-bridge] 只有能证明开启了新回合的增量才算新回合:子会话的落定通知、用量计数与目录变更不再被误当成新回合
- [remote-bridge] hello 公告扩展注册的能力:握手时按注册表计算,协议自己的名字在前且保序,扩展名追加去重
- [remote-bridge] 静默判定的读取失败按失败处理,不回答成「已静默」
其他改动
- [notes] 记录 §35 可交互回复的决策
- [notes] 补齐「一枚令牌一次投递」记录的双语三件套
- [libs] 重建聚合包 bundle 并刷新记录指纹
- [release-skill] 发布后检查去掉已下线的桌面打包车道
- [docs] 远程桥双语 README 写明「一台手机一行」与「一条令牌一次投递」两条规则