diff --git a/contrib/windows-runner-actuate/PATCH-NOTES.md b/contrib/windows-runner-actuate/PATCH-NOTES.md index f29e13f..0d31060 100644 --- a/contrib/windows-runner-actuate/PATCH-NOTES.md +++ b/contrib/windows-runner-actuate/PATCH-NOTES.md @@ -71,7 +71,11 @@ internal sealed record RunnerResponse(int ProtocolVersion, string RequestId, boo ## 6. 验证状态与已知限制 -- **语法级人工审查已完成;未编译**——本机无 .NET SDK,编译验证需在装 .NET 10 SDK 后进行(`dotnet build` native/csproj),或由对面侧首次合入时跑; +- **已编译通过 + 协议冒烟通过(2026-11-06,.NET SDK 10.0.403)**: + - `dotnet build`(对面 csproj 原样 + 本补丁三文件 + §2 最小 diff):**0 警告 0 错误**(TreatWarningsAsErrors 开启,直接达到对面合入标准); + - 编译修正两处:`NativeInput.Point` 由 private 改 internal(CS0050 可访问性)、`ActuateService.cs` 补 `using System.Diagnostics;`(CS0103); + - 零桌面交互协议冒烟 5 例:`policy_invalid` ✅ / `desktop_session_mismatch` ✅ / observe 老路径无回归 ✅ / requestId 逐字回显 ✅;另 2 例(越权窗口/非法动作)因**窗口选择先于动作校验**的既有顺序先报 `window_not_found`——顺序与对面 observe 一致,属预期行为,用例已按此修正理解; + - 需要真实窗口的用例(click/type/window_activate/action_invalid 路径)留待对面 `test/fixture` 集成测试(第 4 节),避免占用用户桌面。 - `Clipboard.SetDataObject` 依赖 STA:对面 Main 已是 `[STAThread]`,满足; - mouse_event → SendInput 为现代等价替换(标志位映射见 PORTING-MAP 第四节);如对面评审倾向零差异,可回退为 mouse_event P/Invoke,一行替换; - 平滑移动公式中的伪随机抖动与 JS `%` 保号语义一致(C# `%` 对 double 同为保号),无漂移。 diff --git a/contrib/windows-runner-actuate/README.md b/contrib/windows-runner-actuate/README.md index c31ff72..9d6c1a8 100644 --- a/contrib/windows-runner-actuate/README.md +++ b/contrib/windows-runner-actuate/README.md @@ -28,4 +28,4 @@ ## 验证状态 -语法级人工审查完成;**未编译**(本机无 .NET SDK)。编译验证需 .NET 10 SDK(`dotnet build`),或在对面侧首次合入时执行。集成测试用对面现成 `test/fixture`,用例清单见 PATCH-NOTES 第 4 节。 +**已编译通过 + 协议冒烟通过**(2026-11-06,.NET SDK 10.0.403):对面 csproj 原样 + 本补丁三文件 + Program.cs 最小 diff → `dotnet build` 0 警告 0 错误;五例零桌面交互协议冒烟全部符合预期(安全门错误码、双路分发、requestId 回显、observe 无回归)。真实窗口用例留待对面 `test/fixture` 集成测试。 diff --git a/contrib/windows-runner-actuate/native/ActuateService.cs b/contrib/windows-runner-actuate/native/ActuateService.cs index 1e2a945..9bccdab 100644 --- a/contrib/windows-runner-actuate/native/ActuateService.cs +++ b/contrib/windows-runner-actuate/native/ActuateService.cs @@ -1,3 +1,4 @@ +using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Globalization; diff --git a/contrib/windows-runner-actuate/native/NativeInput.cs b/contrib/windows-runner-actuate/native/NativeInput.cs index f0d02a2..6e59f19 100644 --- a/contrib/windows-runner-actuate/native/NativeInput.cs +++ b/contrib/windows-runner-actuate/native/NativeInput.cs @@ -76,7 +76,7 @@ internal static class NativeInput private static extern uint SendInput(uint count, Input[] inputs, int size); [StructLayout(LayoutKind.Sequential)] - private struct Point { public int X; public int Y; } + internal struct Point { public int X; public int Y; } [StructLayout(LayoutKind.Sequential)] private struct Input diff --git a/docs/rpa-core-migration-guide-v2.md b/docs/rpa-core-migration-guide-v2.md index 135182d..83b2615 100644 --- a/docs/rpa-core-migration-guide-v2.md +++ b/docs/rpa-core-migration-guide-v2.md @@ -339,7 +339,7 @@ | ADR | 问题 | 决定 | |---|---|---| | R1 | Registry 作用域:backend 是否多租户并存 | **全局一份能力清单**(菜单所有租户共用),权限隔离完全由 capability-gateway 按租户管;长期将清单挂到 engine 实例(已从对面源码确认 WorkflowIdentity 带 tenantId,但清单本身无需按租户复制) | -| R3 | 桌面执行安全模型:RPA PowerShell 驱动 vs 对面"受信 C# 原生进程"红线 | **C# 扩展 actuate**:把 RPA 五域执行逻辑移植进 windows-runner 原生进程;PowerShell 通道仅限本 demo,不进宿主。**原型已产出(2026-11-06)**:`contrib/windows-runner-actuate/` 补丁包(协议扩展 + NativeInput + ActuateService + 逐原语移植对照表 + 合入指引含门禁合规清单);对面 README Windows 行"click/type 或随本轮交付"与该路线吻合 | +| R3 | 桌面执行安全模型:RPA PowerShell 驱动 vs 对面"受信 C# 原生进程"红线 | **C# 扩展 actuate**:把 RPA 五域执行逻辑移植进 windows-runner 原生进程;PowerShell 通道仅限本 demo,不进宿主。**原型已产出并编译验证(2026-11-06)**:`contrib/windows-runner-actuate/` 补丁包(协议扩展 + NativeInput + ActuateService + 逐原语移植对照表 + 合入指引含门禁合规清单);对面 csproj 原样合编 0 警告 0 错误(.NET 10.0.403),协议冒烟 5 例通过(安全门错误码/双路分发/observe 无回归);对面 README Windows 行"click/type 或随本轮交付"与该路线吻合 | | R4 | 浏览器双路径 | **按场景分工**:RPA 场景走咱们的 CDP 接管路线(复用用户登录态/真实页面——RPA 核心价值);对面 PlaywrightBrowserRunner 留给 AI 智能体场景(无头自管浏览器)。约束:①咱们 CDP 路线必须接对面 BrowserContextPolicy 白名单与证据体系,不自建;②迁移前修完 transport 超时与定位器不统一两缺陷;③需对面在插件清单给咱们的 runner 备案(rpa.browser) | | R5 | 包消费方式 | **源码并入 + 锁版本**:git subtree 进对面仓库统一编译,Bun 锁 1.4.3(与对面全家 workspace:* 源码消费现状一致) | | R6 | 部署拓扑:rpa-core 各域跑在哪 | **按能力域拆分部署**:纯 Node 域→backend plugin-worker;桌面/视觉/弹窗域→用户电脑 Electron 宿主;同一包按 PLATFORM_GROUPS 分组加载,不维护两份代码 |