Skip to content

[Grok/dsh 68] Windows 产物与原生终端运行 #200

Description

@Blackman99

Parent

#132

Ticket: 68

Status: ready-for-agent

User Stories: 7, 18, 69(见父规格)

What to build

原生 Windows 用户安装预编译程序,通过支持的终端完成 dsh 对话、文件工具、审批、取消和恢复。

Acceptance criteria

  • 解决公开 Rust 导出在 Windows 的实际构建/运行差异,不能把上游 best-effort 当已支持。
  • 验证 ConPTY/控制台输入、路径、Unicode、shell 与进程树取消,原生 Windows 不能以 WSL 替代验收。
  • 安装、更新、失败回退、终端复原及目录隔离可重现,用户无需自行编译。
  • 建立未被 skip 的 Windows 集成入口;其他功能和沙箱限制由平台能力验收继续验证。

Blocked by

Delivery contract

用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。

Activity

  1. Blackman99 commented on Sep 28, 2026

    @Blackman99
    OwnerAuthor

    已集成: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 新增 windows job(windows-2022 / windows-2025,无 Rust 工具链),在集成分支及含 windows 的分支上运行,不带 skip。
    • 文档:README Windows 段落、CONTRIBUTING [Grok/dsh 68] Windows 产物与原生终端运行 #200 段落;Changeset rust-windows-prebuilt.md(codsh-cli / codsh-bundle patch)。

    检查(本地 box,Linux x64)

    • cargo fmt --check、pnpm typecheck、debug 构建、clippy -A(允许级)通过;严格 clippy 仅 2 个已知错误(tail_marker dead code、needless_return)。
    • test:rust:792 passed,4 个已知 Linux 失败(2× filesystem_sandbox、voice substitute_route…、privacy drafts_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 的 windows job + 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。
    • windows job 只在集成分支和名称含 windows 的分支上运行(Windows runner 较慢,安装/更新/回退一步约 5 分钟)。
    • 应用内没有 /update(同 [Grok/dsh 66] macOS 预编译安装、更新与回退 #198)。

    未改动

    • 未改动 main,未发布包/标签/Release,未改仓库设置或 secrets。
    • 草稿分支 ci/200-probe、ci/200-windows-a … ci/200-windows-i 保留未删。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions