Files
nodeagent/packages/protocol
jkooe 313420a482 feat(v8): GUI 语义能力 —— window.list / window.focus / screen.find(能力 20 -> 23)
P0-1 UI 元素定位(基于 Windows UI Automation + Win32):
- window.list:枚举可见顶层窗口(hwnd/标题/进程/精确矩形/前台标识/最小化)
  —— 真机验证:正确返回 PowerShell / cmd / 各应用窗口矩形
- window.focus:按标题正则或句柄置前窗口,返回精确矩形(SW_RESTORE + SetForegroundWindow)
- screen.find:UIA 查找元素并返回**中心点屏幕坐标**(支持窗口范围/控件类型过滤),
  直接喂给 input.mouse.click —— 把「看得到画面读不懂界面」变成「按名取坐标」
  —— 真机验证:查找 'Windows PowerShell' 返回 (716,648) 与完整矩形

实现要点:
- PowerShell 脚本一律走 EncodedCommand(UTF-16LE base64),规避引号/中文/换行转义
- extractJson():Add-Type 程序集加载会向 stdout 夹杂输出污染 JSON,
  按首 [/{ 到末 ]/} 截取后再 parse(真机踩过:'Unexpected non-whitespace character')

顺带修复(本轮测试发现的 bug):
1. services 状态显示数字:Get-Service 的 Status/StartType 是 .NET 枚举,
   ConvertTo-Json 退化为数字(4=Running),显式 ToString() 修复
2. restart 任务名冲突:重启任务的 cmd 持有新 agent 进程 → 任务长期 Running
   → 下次 Unregister/Register 静默失败 → 'restart 返回成功但没重启'。
   改为唯一任务名(时间戳)+ 注册后显式校验 + 清理历史非运行任务
   —— 真机验证连续 restart:PID 2612 -> 18556,任务名带时间戳
3. cmd shell 中文:定性为 Windows 固有局限(命令行参数在进程创建时已按 ANSI
   解释,chcp 救不了参数本身),代码注释说明并引导用 PowerShell

真机:23 项能力全量在线;unit 26/26、e2e 21/21 全绿
2026-09-29 00:38:54 +08:00
..