chore: rpa-cli 显式注册+engine.execute;V2 现状表同步阶段1修复状态
This commit is contained in:
parent
5e8fc9686f
commit
9bb5a44b95
@ -35,34 +35,34 @@
|
||||
|
||||
---
|
||||
|
||||
## 2. RPA 侧现状事实清单(2026-11-06 实测)
|
||||
## 2. RPA 侧现状事实清单(2026-11-06 实测;★=阶段 1 已于当日修复)
|
||||
|
||||
| # | 事项 | 状态 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 1 | Driver 惰性 getter + 非 win32 抛 `platform_unsupported` | 已实现 | engine.ts:47-61;error-codes.ts:43;engine-driver.test.ts |
|
||||
| 2 | **Driver 可注入** | **未实现** | `createEngine()` 无参数(engine.ts:64-66);desktop.ts:9 等在模块加载时捕获 `defaultEngine.driver` |
|
||||
| 3 | Registry 全局 Map、last-wins、runtime 读全局 getHandler | 属实(未改) | registry.ts:36-45;runtime.ts:260 |
|
||||
| 4 | PLATFORM_GROUPS 单一源(34 域全 win32)+ buildDomainPlatformMap 真实实现 + 守卫测试 | 已实现 | register-all.ts:16-50,98-127;platform-groups.test.ts |
|
||||
| 5 | withTimeout 监听 signal 但无 AbortController——超时不中止底层 | 属实(未修) | runtime.ts:33-56 |
|
||||
| 6 | NodeState 类型含 cancelled,但 executeNode catch 把取消标成 failed | 属实(未修) | types.ts:142;runtime.ts:334-339 |
|
||||
| 7 | 重试上限 100、黑名单式 isRetryable | 属实(未修) | runtime.ts:58-60,276 |
|
||||
| 8 | Graph Validator | 未实现 | 全仓无 validateFlowGraph |
|
||||
| 9 | 动态 `import("electron")` 5 处(vision.ts×3、cv-vision.ts×2) | 属实(未修) | vision.ts:18,66,432;cv-vision.ts:51,213 |
|
||||
| 10 | check-deps.mjs 对 `import("electron")` 零匹配(盲区实测) | 属实 | check-deps.mjs:20 正则要求 `import\s+` |
|
||||
| 11 | 包依赖缺 3 项:@napi-rs/canvas、pdfjs-dist、@cantoo/pdf-lib | 属实(未修) | rpa-core/package.json:17-32 对比 pdf.ts/vision.ts import |
|
||||
| 12 | main/exports 直指 src 源码、private | 属实(决策项) | rpa-core/package.json:4-11 |
|
||||
| 13 | rpa-cli 副作用全量 import + 全局 getHandler | 属实(未改) | scripts/rpa-cli.ts:25,53-59 |
|
||||
| 14 | CDP transport 单命令无超时/无 AbortSignal/pending 仅断连清理 | 属实(未修) | transport.ts:96-118 |
|
||||
| 15 | 两段式元素定位(当前页优先,失败才跟前台)| 已实现 | session.ts:296-307,518-523 |
|
||||
| 16 | locate() 不支持 xpath / Shadow DOM(与 withElement() 不一致)| 属实(未修) | session.ts:465-517 对比 252-287 |
|
||||
| 17 | HostBridge/SubflowSource 模块级单例 | 属实(未改) | host-bridge.ts:16-24,61-69 |
|
||||
| 18 | AI ChatCompletionOptions 无 signal 参数 | 属实(未修) | ai-service.ts:39-48 |
|
||||
| 19 | 桌面拾取无 AbortSignal(热键+轮询+deadline 自有机制)| 属实(未修) | desktop-pick.ts 全文零 signal 命中 |
|
||||
| 20 | catalog platformTag:win32=687 / null=326 / **数字 1=3(脏值未清洗)** | 部分实现 | build-catalog.mjs:245-246 对 truthy 旧值透传 |
|
||||
| 21 | catalog overrides(fields/removeFields/addFields) | 已实现 | catalog-overrides.mjs:6-24 |
|
||||
| 1 | Driver 惰性 getter + 非 win32 抛 `platform_unsupported` | 已实现 | engine.ts;error-codes.ts:43;engine-driver.test.ts |
|
||||
| 2 | **Driver 可注入** | ★已实现 | `createEngine({driver})` + `engine.setDriver()`;desktop/common-final/system-extended/window-extended 的模块级捕获改惰性 `getDriver()` |
|
||||
| 3 | Registry 全局 Map、last-wins、runtime 读全局 getHandler | 属实(ADR-R1 短期形态固化;新增 `engine.execute` 语义真实入口) | registry.ts;engine.ts execute() |
|
||||
| 4 | PLATFORM_GROUPS 单一源(34 域全 win32)+ buildDomainPlatformMap 真实实现 + 守卫测试 | 已实现 | register-all.ts;platform-groups.test.ts |
|
||||
| 5 | withTimeout 监听 signal 但无 AbortController——超时不中止底层 | ★已修复 | 尝试级 AbortController 汇聚 run 取消+节点超时,handler 收到的 ctx.signal 即尝试信号 |
|
||||
| 6 | NodeState 类型含 cancelled,但 executeNode catch 把取消标成 failed | ★已修复 | 取消映射 cancelled(不适用 skipOnError、不进异常分支);runtime.cancel.test.ts |
|
||||
| 7 | 重试上限 100、黑名单式 isRetryable | ★已门控 | CapabilityMeta.idempotent===false 时无视 retryCount |
|
||||
| 8 | Graph Validator | ★已实现 | engine/graph-validator.ts(重复ID/悬空边/自环/环/孤儿/不可达),runFlow 前置校验 |
|
||||
| 9 | 动态 `import("electron")` 5 处(vision.ts×3、cv-vision.ts×2) | ★已修复 | HostBridge.screen 服务注入(requireScreenService),Core 恢复零 Electron |
|
||||
| 10 | check-deps.mjs 对 `import("electron")` 零匹配(盲区实测) | ★已修复 | 新增动态 import()/require() 扫描;合成用例命中=1,真实源码 0 违规 |
|
||||
| 11 | 包依赖缺 3 项:@napi-rs/canvas、pdfjs-dist、@cantoo/pdf-lib | ★已修复 | rpa-core/package.json dependencies 补齐 |
|
||||
| 12 | main/exports 直指 src 源码、private | 属实(决策项,与对面源码消费一致) | rpa-core/package.json |
|
||||
| 13 | rpa-cli 副作用全量 import + 全局 getHandler | ★已重写 | 显式按域注册(5 域)+ engine.execute |
|
||||
| 14 | CDP transport 单命令无超时/无 AbortSignal/pending 仅断连清理 | 属实(未修,A7 迁移前修) | transport.ts:96-118 |
|
||||
| 15 | 两段式元素定位(当前页优先,失败才跟前台)| 已实现 | session.ts |
|
||||
| 16 | locate() 不支持 xpath / Shadow DOM(与 withElement() 不一致)| 属实(未修,A7 迁移前修) | session.ts |
|
||||
| 17 | HostBridge/SubflowSource 模块级单例 | 属实(ADR-R1 范畴;screen 服务已并入 HostBridge) | host-bridge.ts |
|
||||
| 18 | AI ChatCompletionOptions 无 signal 参数 | 属实(未修,P2) | ai-service.ts |
|
||||
| 19 | 桌面拾取无 AbortSignal(热键+轮询+deadline 自有机制)| 属实(未修,P1) | desktop-pick.ts |
|
||||
| 20 | catalog platformTag:win32=687 / null=326 / 数字 1=3(脏值未清洗) | 部分实现(T4 待清洗) | build-catalog.mjs 对 truthy 旧值透传 |
|
||||
| 21 | catalog overrides(fields/removeFields/addFields) | 已实现(+782 个 options 收割修复重生成回归) | catalog-overrides.mjs |
|
||||
| 22 | 能力 719 个 / 目录组件 1016(vendor 997 + native 16 + trigger 3)/ fields 4299 / 34 域 | 实测 | platform-groups.test.ts;catalog.json counts |
|
||||
| 23 | 平台守卫测试 5 文件 + driver/platform.ts 唯一入口 | 已实现 | capabilities/*.test.ts;driver/platform.ts |
|
||||
| 24 | Driver 五域方法均无 AbortSignal 参数 | 属实(未修) | driver/types.ts:87-119 |
|
||||
| 24 | Driver 五域方法均无 AbortSignal 参数 | 属实(未修;运行时取消已能中止监听 signal 的能力内部操作) | driver/types.ts |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
/**
|
||||
* rpa-core CLI host(任务 5.1):Node 直接拉起 createEngine() + WindowsDriver,
|
||||
* 不经过 Electron,验证包的零宿主可运行性。
|
||||
* rpa-core CLI host(任务 5.1;迁移阶段1-T4 重写):
|
||||
* Node/Bun 直接拉起 createEngine(),按需显式注册 5 个能力域(不再副作用全量注册),
|
||||
* 能力调用统一走 engine.execute(ADR-R1 语义真实化),验证包的零宿主可运行性。
|
||||
*
|
||||
* 跑通 5 个代表能力(全部只读或落在临时目录,可重复执行):
|
||||
* 1. 桌面(PowerShell user32):Window_GetActiveWindow —— 读前台窗口标题
|
||||
@ -17,12 +18,9 @@ import path from "node:path";
|
||||
import {
|
||||
createEngine,
|
||||
capabilityCount,
|
||||
getHandler,
|
||||
registerAll,
|
||||
type CapabilityHandler,
|
||||
type RunContext
|
||||
} from "@rpa/core";
|
||||
import "@rpa/core/capabilities";
|
||||
|
||||
const ctx = {
|
||||
runId: "rpa-cli",
|
||||
@ -37,26 +35,27 @@ const ctx = {
|
||||
} as unknown as RunContext;
|
||||
const node = (componentId: string) => ({ id: "rpa-cli", componentId, position: { x: 0, y: 0 }, values: {}, options: {} });
|
||||
|
||||
async function run(name: string, handler: CapabilityHandler, args: Record<string, unknown>): Promise<void> {
|
||||
async function run(engine: import("@rpa/core").RpaEngine, name: string, args: Record<string, unknown>): Promise<void> {
|
||||
process.stdout.write(`[${name}] `);
|
||||
const result = await handler(ctx, node(name), args, undefined as never);
|
||||
const result = await engine.execute(name, args, ctx, node(name));
|
||||
console.log("OK ->", typeof result === "string" ? result.slice(0, 120) : JSON.stringify(result)?.slice(0, 200));
|
||||
}
|
||||
|
||||
async function main(): Promise<void> {
|
||||
const engine = createEngine();
|
||||
await registerAll(engine);
|
||||
console.log(`rpa-core CLI host:引擎已创建,注册能力 ${capabilityCount()} 个\n`);
|
||||
// 显式注册本 CLI 用到的 5 个能力域(迁移后 Agent-Employee 侧同样按域注册)
|
||||
await registerAll(engine, ["desktop", "commonFinal", "excelCommon", "files", "http"]);
|
||||
console.log(`rpa-core CLI host:引擎已创建(注入 driver 可用 createEngine({ driver })),注册能力 ${capabilityCount()} 个\n`);
|
||||
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "rpa-cli-"));
|
||||
try {
|
||||
await run("Window_GetActiveWindow", getHandler("Window_GetActiveWindow")!, {});
|
||||
await run("Window_GetScreenSize", getHandler("Window_GetScreenSize")!, {});
|
||||
await run("Excel_Cs_NewV5", getHandler("Excel_Cs_NewV5")!, { filePath: tmpDir, name: "rpa-cli-demo.xlsx" });
|
||||
await run(engine, "Window_GetActiveWindow", {});
|
||||
await run(engine, "Window_GetScreenSize", {});
|
||||
await run(engine, "Excel_Cs_NewV5", { filePath: tmpDir, name: "rpa-cli-demo.xlsx" });
|
||||
const file = path.join(tmpDir, "hello.txt");
|
||||
await run("File_Write", getHandler("File_Write")!, { path: file, content: "hello from rpa-core CLI" });
|
||||
await run("File_Read", getHandler("File_Read")!, { path: file });
|
||||
await run("Http_Get", getHandler("Http_Get")!, { url: "https://www.baidu.com", timeout: 15 });
|
||||
await run(engine, "File_Write", { path: file, content: "hello from rpa-core CLI" });
|
||||
await run(engine, "File_Read", { path: file });
|
||||
await run(engine, "Http_Get", { url: "https://www.baidu.com", timeout: 15 });
|
||||
console.log("\n5 项代表能力全部通过 ✓");
|
||||
} finally {
|
||||
fs.rmSync(tmpDir, { recursive: true, force: true });
|
||||
|
||||
Loading…
Reference in New Issue
Block a user