Repository navigation
[Grok/dsh 68] Windows 产物与原生终端运行 #200
Copy link
Copy link
Closed
Labels
ready-for-agentAgent-grabbable workAgent-grabbable work
Description
Activity
已集成:Windows 预编译产物与原生终端运行(#200)
集成提交:
664781c(已普通推送到rewrite/grok-dsh-20260920,未改动main)。实现内容
- 原生产物:
rust-native.yml在 windows-2022 上构建x86_64-pc-windows-msvc(+crt-static,不依赖 VC++ 运行库);release.yml的check:rust-package要求包含win32-x64。 - 路径:统一使用 dunce 规范化路径(不再有
\\?\前缀进入 dsh 或 Home),审批路径识别盘符。 - 控制通道 / 进程树:Windows 上 ACP 控制通道改为带一次性令牌的回环 TCP 端口(其他平台仍为 Unix socket);取消与退出用
taskkill /T /F结束整棵进程树。 - 会话所有权锁:Windows 的强制字节范围锁改为锁定记录之外的一个字节(偏移 0x7fff_ffff),修复所有者文件被锁后不可读导致恢复/调度报 "no longer owned"。
- 控制台输入:Windows 对每个键都报告 Release,现只有语音组合键处理 Release(此前每个字符会输入两次);没有对应 Press 的非 ASCII 字符 Release(Alt 码、ConPTY 下键盘布局外的字符如 ✓)按该字符输入(单元测试
windows_unpaired_release_types_the_character);Windows 上不推送 kitty 键盘协议。 - Shell 工具:dsh 在 Windows 的 shell 工具是
pwsh,现按 shell 命令渲染并按 shell 审批策略处理;无密钥 mock 在 win32 上发出 pwsh 命令。 - 集成入口:新增
scripts/rust-windows-pty-test.py,通过真实 ConPTY(pywinpty,外层cmd.exe)驱动已安装的打包产物;rust-platforms.yml新增windowsjob(windows-2022 / windows-2025,无 Rust 工具链),在集成分支及含windows的分支上运行,不带 skip。 - 文档:README Windows 段落、CONTRIBUTING [Grok/dsh 68] Windows 产物与原生终端运行 #200 段落;Changeset
rust-windows-prebuilt.md(codsh-cli/codsh-bundlepatch)。
检查(本地 box,Linux x64)
cargo fmt --check、pnpm typecheck、debug 构建、clippy -A(允许级)通过;严格 clippy 仅 2 个已知错误(tail_markerdead code、needless_return)。test:rust:792 passed,4 个已知 Linux 失败(2×filesystem_sandbox、voicesubstitute_route…、privacydrafts_stay_local…),与基线一致;其余 crate 全部通过。pnpm test:110 files;2676 passed / 15 skipped。build+build:rust+check:rust-package+rust-install-test+ plain-pipe 通过;旧版 e2e(pnpm 10):177 passed / 1 skipped。- PTY:resume / cancel / permission 通过;prompt / voice / shell / core-pty 在 Linux 按设计拒绝(需 macOS PTY 证据)。
- 另以
x86_64-pc-windows-gnu目标做了 clippy 编译检查。
真实运行(GitHub Actions,原生 Windows,非 WSL)
集成运行 Rust platforms #36409443574(集成提交 664781c 本身):重跑失败 job 后全部成功,含 #198 的 macOS 安装 job 与 #199 的 Linux job。均为已打包 tarball + 注册表 dsh(测试版本 0.1.5-rc.3)+ 仓库 mock 模型,无网络模型、无官方账号、无 Rust 编译环境。
环境 结果 Job windows-2022(Windows Server 2022,10.0.20348.5622) 全部场景通过(第 1 次尝试 108891747260 也通过) 108903465019 windows-2025(Windows Server 2025,10.0.26100.33438) 全部场景通过(第 2 次尝试,见下方差异说明) 108903463534 native win32-x64 构建 通过 108885909584 package layout(全部原生产物) 通过 108891495732 开发期证据运行(
ci/200-windows-i):#36403713746,windows-2022 108872624471、windows-2025 108872624409 均成功(windows-2025:Microsoft Windows [Version 10.0.26100.33438])。每个 Windows job 的场景(均在 ConPTY 内的
cmd.exe里运行,退出前后读取控制台输入模式,必须一致,且退出后 shell 仍能接收一行输入):install-check— 运行时检查通过;headless— 非交互 turn;turn— 交互 turn,中日韩文字与 Alt 码字符 ✓ 正确输入与显示;file-approval— 工作区路径含空格与中文(工作 区),文件工具需审批后写入;shell— pwsh 命令经审批执行;cancel— 运行中的 pwsh 被取消,pwsh.exe及其整棵进程树结束;resume—--continue恢复上次会话;sandbox-refused— codsh 沙箱配置在 Windows 上被明确拒绝;install-update-rollback— 安装 → 更新提示(0.24.0 → 99.0.1)→ 3 种损坏安装被拒绝(版本不匹配/更新未完成、下载损坏或不完整、缺少原生产物),被拒绝的启动不写入 Rust Home → 回退;更新计划选择 npm;Rust Home 保留,旧~/.dsh/~/.grok未被触碰。
对照验收标准
- 解决 Windows 的实际构建/运行差异(路径前缀、控制通道、进程树、强制字节锁、按键 Release、kitty 键盘、pwsh 工具),在真实 Windows 上运行验证,未把上游 best-effort 当作已支持。
- 验证 ConPTY/控制台输入、路径(空格 + 中文)、Unicode、shell(pwsh)与进程树取消;原生 Windows Server 2022/2025,未用 WSL。
- 安装、更新、失败回退、终端(控制台模式)复原及目录隔离可重现;用户无需自行编译(crt-static 预编译产物)。
- 建立未被 skip 的 Windows 集成入口(
rust-platforms.yml的windowsjob +scripts/rust-windows-pty-test.py);剪贴板、通知、麦克风及沙箱等由 [Grok/dsh 69] 三平台原生能力验收 #201 平台能力验收继续验证。
已记录的差异
- dsh 0.1.5-rc.3 的 Windows ACL 沙箱:即使 codsh 显示 "sandbox off",dsh 默认仍以 workspace-write 运行 pwsh,且无法进入位于
%USERPROFILE%内的工作区——此时 pwsh 在C:\Program Files\PowerShell\7启动、写入被拒绝。因此 cancel 场景使用配置目录之外的工作区(C:\codsh-win-cancel-<pid>\工作 区)。这是上游 dsh 行为,记录给 [Grok/dsh 69] 三平台原生能力验收 #201。 - 一次不稳定失败:集成运行第 1 次尝试中 windows-2025 的
cancel场景失败(108891747396):长时间运行的 pwsh 命令直接以 exit 0、无输出结束,测试随后卡住约 23 分钟,客户端进程残留导致后面的更新步骤出现一次EBUSY(重试后通过)。只重跑失败的 job 后,两个 Windows job 全部通过;开发期运行与 windows-2022 均未复现。原因尚未确定(怀疑 dsh 的 ACL 沙箱或 CIM 进程查询偶发卡住);将在 [Grok/dsh 69] 三平台原生能力验收 #201 中给测试脚本加超时与更完整的错误信息,并继续观察。 - 若仍有
codsh-rust.exe在运行,npm 更新会报EBUSY(CI 中偶发;测试脚本 5 秒后重试成功)。用户需先退出正在运行的客户端再更新。 - codsh 沙箱配置在 Windows 上被拒绝;shared server、remote、wrap 在 Windows 上不可用;暂无 win32-arm64 预编译产物。
- 只用 ConPTY 驱动测试,未实际操作 Windows Terminal、conhost 窗口或 VS Code 终端;剪贴板、桌面通知、麦克风留给 [Grok/dsh 69] 三平台原生能力验收 #201。
windowsjob 只在集成分支和名称含windows的分支上运行(Windows runner 较慢,安装/更新/回退一步约 5 分钟)。- 应用内没有
/update(同 [Grok/dsh 66] macOS 预编译安装、更新与回退 #198)。
未改动
- 未改动
main,未发布包/标签/Release,未改仓库设置或 secrets。 - 草稿分支
ci/200-probe、ci/200-windows-a…ci/200-windows-i保留未删。
- 原生产物:
Metadata
Metadata
Assignees
Labels
ready-for-agentAgent-grabbable workAgent-grabbable work
Parent
#132
Ticket: 68
Status: ready-for-agent
User Stories: 7, 18, 69(见父规格)
What to build
原生 Windows 用户安装预编译程序,通过支持的终端完成 dsh 对话、文件工具、审批、取消和恢复。
Acceptance criteria
Blocked by
Delivery contract
用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。