sjh9714 /
dsh-win32
DeepSeek Harness 在 Windows 上选极简模式会直接报错,terminal inspection is unsupported on platform win32。第一反应都是 node-pty 没装好,但重装、换 Node 版本、装 VS Build Tools 全没用,报错一个字都不变。 顺着报错读源码才发现,问题不在 node-pty。官方 subprocess 运行时里有个 createProcessInsp…
sjh9714 /
DeepSeek Harness 在 Windows 上选极简模式会直接报错,terminal inspection is unsupported on platform win32。第一反应都是 node-pty 没装好,但重装、换 Node 版本、装 VS Build Tools 全没用,报错一个字都不变。 顺着报错读源码才发现,问题不在 node-pty。官方 subprocess 运行时里有个 createProcessInsp…
DeepSeek Harness 在 Windows 上选极简模式会直接报错,terminal inspection is unsupported on platform win32。第一反应都是 node-pty 没装好,但重装、换 Node 版本、装 VS Build Tools 全没用,报错一个字都不变。 顺着报错读源码才发现,问题不在 node-pty。官方 subprocess 运行时里有个 createProcessInspector,按平台分派进程检查器实现,Linux 一个 macOS 一个,win32 分支是直接 throw。而这次调用发生在起 PTY 之前,所以 Windows 上根本轮不到 node-pty 表演,前一步就抛了。少了这块,持久 shell 这个概念在 Windows 上就立不住,依赖它的极简模式整个不可用。 这个项目就是通过官方留的注入座补上 win32 实现,核心一行不改。进程树用一次 CIM 快照,pid、ppid 和 CreationDate 三者构成进程身份防 pid 复用,信号走 taskkill,中途取消按 ConPTY 惯例把 Ctrl-C 作为 PTY 输入写进去。 做的过程中还挖出两个更麻烦的东西。 一个是沙箱。workspace-write 用的是受限令牌,Git Bash 这类 MSYS shell 会死在 cygheap 初始化,实测签名是 NtSetInformationToken 0xC0000022,后来有用户在自己机器上报告了同族的第二个签名 CreateFileMapping Win32 error 5。这是 MSYS 运行时模型和受限令牌的直接冲突,插件层修不了,也解释了为什么现有的 Windows 方案清一色要求 danger-full-access。换成纯 Win32 实现、没有 POSIX 模拟层的 busybox-w32 ash 就能活下来。据我所知这是目前唯一能在 DSH 沙箱内跑起来的 Windows 持久 shell。 另一个是前台命令识别。Windows 上不能靠父进程链回答终端里现在跑着什么,MSYS 的 fork 模拟会切断链条。实测很直白,Git Bash 的 PTY 里跑 sleep 20,查它的直接子进程是空的,同一时刻查 ConPTY 的控制台进程列表,那个 sleep 清清楚楚在里面。控制台归属是控制台自己的属性,不靠父子关系维持,fork 模拟骗得过进程树,骗不过控制台附着。这块由外部贡献者实现并合并。 顺带修了 GBK。官方 fs 对 GBK / UTF-16 文件返回 FSNOTTEXT 直接拒读,国内老项目里这种文件一大把,Agent 连读都读不了。 所有主张都在 windows-latest CI 上每次推送复跑,41 个单测,3 系统矩阵。限制也全写在 README 里,比如 Git Bash 预设需要 danger-full-access,PTY 输出的旧代码页在插件层无解,isStdinWaiting 故意恒为 false。个人项目,MIT 协议。 安装一条命令。 npx dsh-win32 setup
Discuss this product