@qing3a/flow-rpa-app 0.5.11 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +48 -17
- package/dist/cli.js +188 -85
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -22
- package/dist/config.js +1 -43
- package/dist/config.js.map +1 -1
- package/dist/http.js +1 -2
- package/dist/http.js.map +1 -1
- package/dist/main.js +12 -12
- package/dist/main.js.map +1 -1
- package/dist/runner.d.ts +29 -11
- package/dist/runner.js +71 -64
- package/dist/runner.js.map +1 -1
- package/dist/server.d.ts +11 -21
- package/dist/server.js +7 -121
- package/dist/server.js.map +1 -1
- package/dist/status.d.ts +4 -15
- package/dist/status.js +2 -27
- package/dist/status.js.map +1 -1
- package/package.json +2 -2
- package/skill/flow-rpa-engine.md +13 -20
- package/starter/liepin_search_resumes/flow.json +54 -74
package/dist/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { CDP_PORT } from '@qing3a/flow-rpa-engine/src/cdp/client.js';
|
|
4
4
|
import { defaultProfileFile, loadSimProfile } from '@qing3a/flow-rpa-engine/src/simprofile.js';
|
|
@@ -22,51 +22,9 @@ export function defaultRunConfig(dataDir, mock) {
|
|
|
22
22
|
userDataDir: join(dataDir, 'edge-profile'),
|
|
23
23
|
mock,
|
|
24
24
|
simProfile: loadSimProfile(defaultProfileFile(dataDir)).profile,
|
|
25
|
-
platformUrl: '',
|
|
26
|
-
platformToken: '',
|
|
27
25
|
role: 'owner',
|
|
28
26
|
pauseTimeoutMs: 5 * 60_000,
|
|
29
27
|
keepRuns: Number.isInteger(keepRaw) && keepRaw > 0 ? keepRaw : 30,
|
|
30
28
|
};
|
|
31
29
|
}
|
|
32
|
-
/** data/platform.json 路径 */
|
|
33
|
-
export function platformConfigFile(dataDir) {
|
|
34
|
-
return join(dataDir, 'platform.json');
|
|
35
|
-
}
|
|
36
|
-
/** 读取持久化平台配置(文件不存在 → undefined) */
|
|
37
|
-
export function loadPlatformConfig(dataDir) {
|
|
38
|
-
const file = platformConfigFile(dataDir);
|
|
39
|
-
try {
|
|
40
|
-
const v = JSON.parse(readFileSync(file, 'utf8'));
|
|
41
|
-
if (typeof v.url === 'string' && v.url.length > 0 && typeof v.token === 'string' && v.token.length > 0) {
|
|
42
|
-
return { url: v.url, token: v.token };
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
// 文件缺失/损坏 → 未配置
|
|
47
|
-
}
|
|
48
|
-
return undefined;
|
|
49
|
-
}
|
|
50
|
-
/** 保存平台配置(token 本地明文;data/ 目录 gitignore,文档注明) */
|
|
51
|
-
export function savePlatformConfig(dataDir, url, token) {
|
|
52
|
-
mkdirSync(dataDir, { recursive: true });
|
|
53
|
-
writeFileSync(platformConfigFile(dataDir), JSON.stringify({ url, token, savedAt: new Date().toISOString() }, null, 2), 'utf8');
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* 平台配置解析(优先级:CLI/env 显式提供 > 持久化 data/platform.json)。
|
|
57
|
-
* 显式提供且与持久化不同 → 自动持久化(下次启动免参,即「自动被 flow-rpa 注册」的配置面)。
|
|
58
|
-
*/
|
|
59
|
-
export function resolvePlatformConfig(dataDir, explicitUrl, explicitToken) {
|
|
60
|
-
if (explicitUrl.length > 0 && explicitToken.length > 0) {
|
|
61
|
-
const saved = loadPlatformConfig(dataDir);
|
|
62
|
-
if (!saved || saved.url !== explicitUrl || saved.token !== explicitToken) {
|
|
63
|
-
savePlatformConfig(dataDir, explicitUrl, explicitToken);
|
|
64
|
-
}
|
|
65
|
-
return { url: explicitUrl, token: explicitToken };
|
|
66
|
-
}
|
|
67
|
-
const saved = loadPlatformConfig(dataDir);
|
|
68
|
-
if (saved)
|
|
69
|
-
return saved;
|
|
70
|
-
return { url: '', token: '' };
|
|
71
|
-
}
|
|
72
30
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAmB,MAAM,2CAA2C,CAAA;AA6B/G,sCAAsC;AACtC,MAAM,UAAU,eAAe;IAC7B,KAAK,MAAM,CAAC,IAAI;QACd,mEAAmE;QACnE,6DAA6D;KAC9D,EAAE,CAAC;QACF,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,IAAa;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IACtD,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,eAAe,EAAE;QAC3B,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;QAC1C,IAAI;QACJ,UAAU,EAAE,cAAc,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;QAC/D,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,CAAC,GAAG,MAAM;QAC1B,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;KAClE,CAAA;AACH,CAAC"}
|
package/dist/http.js
CHANGED
|
@@ -4,7 +4,7 @@ import { join } from 'node:path';
|
|
|
4
4
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
5
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
6
6
|
import { acquireInstanceLock, releaseInstanceLock, waitForQueueIdle } from './runner.js';
|
|
7
|
-
import { buildCtx,
|
|
7
|
+
import { buildCtx, housekeepingStartup, registerTools } from './server.js';
|
|
8
8
|
import { collectStatus, renderStatusHtml } from './status.js';
|
|
9
9
|
/**
|
|
10
10
|
* M11d D-H1/D-H2/D-H3:--http 常驻模式(StreamableHTTPServerTransport)。
|
|
@@ -33,7 +33,6 @@ export async function serveHttp(opts) {
|
|
|
33
33
|
const port = opts.port ?? DEFAULT_HTTP_PORT;
|
|
34
34
|
const ctx = buildCtx(opts.flowsDir, opts.dataDir, opts.config, 'http');
|
|
35
35
|
// 启动自动注册(平台已配置时:健康探测 + 自动补传待上传台账;不阻断启动)
|
|
36
|
-
void bootstrapPlatform(ctx).catch(() => undefined);
|
|
37
36
|
// T020 P0-2:启动清扫(残留 tmp + 补扫超窗 run 归档/删除)
|
|
38
37
|
housekeepingStartup(ctx);
|
|
39
38
|
const transports = new Set();
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAA;AAClG,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -10,13 +10,13 @@ import { serveHttp } from './http.js';
|
|
|
10
10
|
/**
|
|
11
11
|
* flow-app —— flow-rpa 应用壳(MCP server)。
|
|
12
12
|
* 用法见 cli.ts 注释(参数兼容 Rust 版:--flows/--data/--mock/--port/--edge/
|
|
13
|
-
*
|
|
13
|
+
* list/validate + M11d --http/--http-port/--http-token;T029:platform 参数/issues 随 md-forge 退役移除)。
|
|
14
14
|
* 模式:缺省 stdio 传输;--http 常驻(StreamableHTTPServerTransport,端口 3081)。
|
|
15
15
|
*/
|
|
16
16
|
const USAGE = `flow-rpa-app —— 本地 RPA 引擎(MCP server)
|
|
17
17
|
|
|
18
18
|
用法:
|
|
19
|
-
flow-app <子命令> [选项] 子命令: list / validate <flow.json> / init / doctor / install-skill <dir> / unlock /
|
|
19
|
+
flow-app <子命令> [选项] 子命令: list / validate <flow.json> / init / doctor / install-skill <dir> / unlock / run / resume / get
|
|
20
20
|
flow-app --http [选项] 常驻 MCP 服务(StreamableHTTP,Agent 通过 http://127.0.0.1:3081/mcp 调用)
|
|
21
21
|
flow-app(无参数) stdio MCP 传输(供 MCP 客户端 spawn 使用)
|
|
22
22
|
|
|
@@ -25,13 +25,14 @@ const USAGE = `flow-rpa-app —— 本地 RPA 引擎(MCP server)
|
|
|
25
25
|
validate <path> 校验流程定义
|
|
26
26
|
init 初始化(创建 flows/data 目录 + 内置 starter 流程 + 引导)
|
|
27
27
|
doctor 体检(✅ 通过 / ⚠️ 可忽略 / ❌ 阻断;仅 ❌ 退出码非 0)
|
|
28
|
-
install-skill <dir> 把引擎级 skill 拷贝到 Agent 平台的 skills
|
|
28
|
+
install-skill <dir> 把引擎级 skill 拷贝到 Agent 平台的 skills 目录(无参 = 列出常见目标)
|
|
29
29
|
unlock 清理过期/残留的单实例锁(仅 pid 已死的死锁)
|
|
30
30
|
open-browser 拉起引擎专用浏览器供先登录(--edge 可省——探测系统默认 Edge;Ctrl-C 退出释放锁)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
run <flowId> 直跑一个流程(同步等待完成;与 MCP run_flow 同一执行路径——闸门/队列/锁/落盘全同源)
|
|
32
|
+
run <flowId> --vars '{"keyword":"…"}' [--mock]
|
|
33
|
+
退出码:done/paused=0(paused 附 resume 指引);failed=1;用法错误=2
|
|
34
|
+
resume <runId> 人工接管后从暂停点继续(与 MCP resume_run 同一路径)
|
|
35
|
+
get <runId> 查看执行记录(run.json;paused 附 resume 指引)
|
|
35
36
|
|
|
36
37
|
选项:
|
|
37
38
|
--flows <dir> 流程目录(缺省 ~/.flow-rpa/flows 或 cwd/flows)
|
|
@@ -39,7 +40,6 @@ const USAGE = `flow-rpa-app —— 本地 RPA 引擎(MCP server)
|
|
|
39
40
|
--edge <path> Edge 可执行文件路径(从零环境必填:引擎靠它拉起专用浏览器)
|
|
40
41
|
--http-port <port> 常驻服务端口(缺省 3081)
|
|
41
42
|
--http-token <tok> 常驻服务可选认证(Authorization: Bearer)
|
|
42
|
-
--platform-url <url> --platform-token <tok> md-forge 平台配置(观察/流程同步)
|
|
43
43
|
--role hunter 工具面裁剪(仅 run_flow/get_run/list_suggestions/apply_suggestion/dismiss_suggestion)
|
|
44
44
|
--mock 调试:mock 页面(不连真实浏览器)
|
|
45
45
|
--help / --version 帮助 / 版本
|
|
@@ -64,17 +64,17 @@ export function detectPrelude(argv) {
|
|
|
64
64
|
return { kind: 'version', unknown: [] };
|
|
65
65
|
// 已知选项全集(parseArgs 定义的;tokens 里出现但不在集合内的 = 未知参数)
|
|
66
66
|
const KNOWN_OPTIONS = new Set([
|
|
67
|
-
'flows', 'data', 'mock', 'port', 'edge',
|
|
68
|
-
'http', 'http-port', 'http-token', 'role', '
|
|
67
|
+
'flows', 'data', 'mock', 'port', 'edge',
|
|
68
|
+
'http', 'http-port', 'http-token', 'role', 'vars', 'help', 'version',
|
|
69
69
|
]);
|
|
70
70
|
const { tokens } = parseArgs({
|
|
71
71
|
args: argv,
|
|
72
72
|
options: {
|
|
73
73
|
flows: { type: 'string' }, data: { type: 'string' }, mock: { type: 'boolean' },
|
|
74
74
|
port: { type: 'string' }, edge: { type: 'string' },
|
|
75
|
-
'platform-url': { type: 'string' }, 'platform-token': { type: 'string' },
|
|
76
75
|
http: { type: 'boolean' }, 'http-port': { type: 'string' }, 'http-token': { type: 'string' },
|
|
77
|
-
role: { type: 'string' },
|
|
76
|
+
role: { type: 'string' }, status: { type: 'string' }, vars: { type: 'string' },
|
|
77
|
+
help: { type: 'boolean' }, version: { type: 'boolean' },
|
|
78
78
|
},
|
|
79
79
|
tokens: true,
|
|
80
80
|
strict: false,
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC;;;;;GAKG;AAEH,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDA+BsC,CAAA;AAEpD,yCAAyC;AACzC,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAA;QACtG,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAA;IAChB,CAAC;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IACjH,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IAC9F,iDAAiD;IACjD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { EnvCheck } from '@qing3a/flow-rpa-engine/src/schema.js';
|
|
|
3
3
|
import { type DomSnapshot } from '@qing3a/flow-rpa-engine/src/export.js';
|
|
4
4
|
import { SuggestionStore, type FlowPatchApplier } from '@qing3a/flow-rpa-engine/src/learning.js';
|
|
5
5
|
import { RunStore } from '@qing3a/flow-rpa-engine/src/storage.js';
|
|
6
|
-
import {
|
|
6
|
+
import { ObservationExporter } from '@qing3a/flow-rpa-engine/src/export.js';
|
|
7
7
|
import { PerfGate } from '@qing3a/flow-rpa-engine/src/bench.js';
|
|
8
8
|
import { CooldownGate, SiteGate } from '@qing3a/flow-rpa-engine/src/gate.js';
|
|
9
9
|
import { BehaviorArchive } from '@qing3a/flow-rpa-engine/src/behavior.js';
|
|
@@ -30,7 +30,16 @@ export interface RunFlowResult {
|
|
|
30
30
|
pausedAt?: string;
|
|
31
31
|
/** T015 P0-1:暂停原因(login / env_check / paused) */
|
|
32
32
|
pauseReason?: 'login' | 'env_check' | 'paused';
|
|
33
|
+
/** T027/B2:结构化下一步指引(暂停/预检拒绝时;只进工具返回与 CLI 输出,不落 run.json——data/ 格式冻结) */
|
|
34
|
+
pauseGuidance?: string;
|
|
35
|
+
/** T027/B2:登录态预检拒绝(run 保持 paused 未执行;CLI 据此退出码 1,与「resume 后再次 paused」区分) */
|
|
36
|
+
precheckRejected?: boolean;
|
|
33
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* T027/B2:pauseReason → 结构化下一步指引(人工接管交接,bsk human-in-the-loop 借鉴)。
|
|
40
|
+
* 只进工具返回 message / CLI 输出,绝不落 run.json(data/ 格式冻结);绝不自动 resume(无人值守边界)。
|
|
41
|
+
*/
|
|
42
|
+
export declare function pauseGuidance(reason: 'login' | 'env_check' | 'paused' | undefined, runId: string): string;
|
|
34
43
|
export interface RunFlowArgs {
|
|
35
44
|
flowId: string;
|
|
36
45
|
vars: Record<string, string>;
|
|
@@ -52,7 +61,7 @@ export interface ExecCtx {
|
|
|
52
61
|
store: RunStore;
|
|
53
62
|
runs: Map<string, RunFlowResult>;
|
|
54
63
|
suggestions: SuggestionStore;
|
|
55
|
-
platform:
|
|
64
|
+
platform: ObservationExporter;
|
|
56
65
|
siteGate: SiteGate;
|
|
57
66
|
coolGate: CooldownGate;
|
|
58
67
|
perf: PerfGate;
|
|
@@ -123,29 +132,40 @@ export declare class MockPage implements PageOps {
|
|
|
123
132
|
/** mock 的 snapshotDom(D-S1 验收:mock 模式不采集 → 返回 undefined 语义由 executeRun 跳过处理) */
|
|
124
133
|
snapshotDom(): Promise<DomSnapshot>;
|
|
125
134
|
}
|
|
126
|
-
/**
|
|
127
|
-
* 自动上报(自动注册闭环):平台已配置时,run 结束后自动 deliver + 上传观察包到 md-forge。
|
|
128
|
-
* 失败记台账 Failed(sync_pending_uploads / 启动 bootstrap 可重试);平台未配置 → 零开销 no-op。
|
|
129
|
-
*/
|
|
130
|
-
export declare function autoUploadRun(ctx: ExecCtx, runId: string): Promise<void>;
|
|
131
135
|
/**
|
|
132
136
|
* T020 P0-2:run 完成后顺带清理——超窗 runs 归档到 data/archive、snapshots/extracted 删除、
|
|
133
|
-
* 残留 *.tmp
|
|
137
|
+
* 残留 *.tmp 清扫;失败仅日志(不阻断 run 收尾)。
|
|
138
|
+
* T029:观察包自动上传已随 md-forge 退役移除(export_observation 仍可本地导出)。
|
|
134
139
|
*/
|
|
135
140
|
export declare function housekeepingAfterRun(ctx: ExecCtx): Promise<void>;
|
|
136
141
|
/** 同步执行一个 run(构造驱动 → 解释执行 → 落盘 → 自动上报 → 更新运行状态) */
|
|
137
142
|
export declare function executeRun(ctx: ExecCtx, args: RunFlowArgs, runId: string): Promise<RunFlowResult>;
|
|
143
|
+
/**
|
|
144
|
+
* T027/B2:登录态探测器(真实模式缺省实现)——连 9222 现有标签页,
|
|
145
|
+
* 用 engine region.ts 登录区双重特征(isLoginSignal:路由特征 + 页面文本强标记,与 executor 每步复查同源)判定是否已登录。
|
|
146
|
+
* 标签页选择:优先与暂停流程同 host(用户在该站登录的页);无同 host → 首个 page 标签。
|
|
147
|
+
* 返回 true = 已登录(预检通过);false = 仍在登录区。
|
|
148
|
+
* 任何失败(浏览器不可达/无标签页/evaluate 失败)→ 抛错(调用方视为「预检不可判定」放行——评审定案 Q2)。
|
|
149
|
+
*/
|
|
150
|
+
export declare function probeLoginState(ctx: ExecCtx, flowId: string): Promise<boolean>;
|
|
151
|
+
/** T027/B2:resume 预检配置(detectLogin 注入式——mock/测试替换;缺省真实模式用 probeLoginState) */
|
|
152
|
+
export interface ResumePrecheck {
|
|
153
|
+
detectLogin?: () => Promise<boolean>;
|
|
154
|
+
}
|
|
138
155
|
/**
|
|
139
156
|
* T015 P0-2:resume_run——从暂停点继续执行(人工接管后调用)。
|
|
140
157
|
* 语义:
|
|
141
158
|
* - 仅接受 status=paused 的 run(执行中/非 paused → 明确拒绝;不重跑已完成步骤);
|
|
142
159
|
* - 先校验暂停超时(缺省 5 分钟可配置)→ 超时转 failed(防无限挂起);
|
|
160
|
+
* - T027/B2 登录态预检:pauseReason=login 时先探测引擎浏览器登录态——仍在登录区 → 拒绝本次 resume
|
|
161
|
+
* (返回 precheckRejected,run 保持 paused,不消耗真实执行轮次——防封视角:真实站点的无谓失败本身就是风险信号);
|
|
162
|
+
* 预检不可判定(浏览器不可达等)→ 放行走原路径(executor 每步登录复查兜底);mock 模式不预检;
|
|
143
163
|
* - 复用 vars(暂停时已持久化)与 resumeStepIndex/resumeLoop* 上下文,从暂停点继续;
|
|
144
164
|
* executor 每步前自动重新校验登录区/验证码(仍异常 → 再次 paused 并提示,不自动重试——防封不变);
|
|
145
165
|
* - 完成后正常走 done/failed 落盘 + L2 学习 + 自动上报(与普通 run 一致)。
|
|
146
166
|
* 返回 RunFlowResult(status: running / done / failed / paused)。
|
|
147
167
|
*/
|
|
148
|
-
export declare function resumeRun(ctx: ExecCtx, runId: string): Promise<RunFlowResult>;
|
|
168
|
+
export declare function resumeRun(ctx: ExecCtx, runId: string, precheck?: ResumePrecheck): Promise<RunFlowResult>;
|
|
149
169
|
/**
|
|
150
170
|
* T009 P0-1:会话轮换——重启引擎浏览器进程(同 profile data/edge-profile,登录态持久保留)。
|
|
151
171
|
* 语义:kill 当前 9222 Edge 调试实例 → 用同一 user-data-dir 重新拉起新会话(新进程/新 CDP 连接)。
|
|
@@ -153,8 +173,6 @@ export declare function resumeRun(ctx: ExecCtx, runId: string): Promise<RunFlowR
|
|
|
153
173
|
* 不破坏 open-browser/懒加载登录:登录态在 profile(重启保留);下次 open-browser/run 重新拉起。
|
|
154
174
|
*/
|
|
155
175
|
export declare function rotateBrowserSession(port: number, edgePath: string, userDataDir: string): Promise<void>;
|
|
156
|
-
/** 版本演进闭环:把本次 run 涉及的建议上传 md-forge(POST /api/suggestions,幂等);失败仅日志 */
|
|
157
|
-
export declare function autoUploadSuggestions(ctx: ExecCtx, flowId: string, suggestionIds: string[]): Promise<void>;
|
|
158
176
|
/** 流程的目标站点 host(取首个 navigate 步骤的 url;无 navigate 返回 undefined —— 不节流 mock) */
|
|
159
177
|
export declare function flowHost(ctx: ExecCtx, flowId: string): string | undefined;
|
|
160
178
|
/** 队列当前状态(自描述聚合用 D-S1;只读) */
|
package/dist/runner.js
CHANGED
|
@@ -7,12 +7,25 @@ import { fromEvents } from '@qing3a/flow-rpa-engine/src/record.js';
|
|
|
7
7
|
import { learnFromRun, learnFromBehavior, SuggestionStore } from '@qing3a/flow-rpa-engine/src/learning.js';
|
|
8
8
|
import { nowIso, RunStore, extractSink } from '@qing3a/flow-rpa-engine/src/storage.js';
|
|
9
9
|
import { cleanTmpFiles, retireRuns } from '@qing3a/flow-rpa-engine/src/housekeeping.js';
|
|
10
|
-
import {
|
|
10
|
+
import { ObservationExporter } from '@qing3a/flow-rpa-engine/src/export.js';
|
|
11
11
|
import { PerfGate } from '@qing3a/flow-rpa-engine/src/bench.js';
|
|
12
12
|
import { CooldownGate, hostOf, SiteGate } from '@qing3a/flow-rpa-engine/src/gate.js';
|
|
13
|
-
import { PlatformClient } from '@qing3a/flow-rpa-engine/src/platform.js';
|
|
14
13
|
import { BehaviorArchive } from '@qing3a/flow-rpa-engine/src/behavior.js';
|
|
15
14
|
import { FlowRegistry } from './registry.js';
|
|
15
|
+
/**
|
|
16
|
+
* T027/B2:pauseReason → 结构化下一步指引(人工接管交接,bsk human-in-the-loop 借鉴)。
|
|
17
|
+
* 只进工具返回 message / CLI 输出,绝不落 run.json(data/ 格式冻结);绝不自动 resume(无人值守边界)。
|
|
18
|
+
*/
|
|
19
|
+
export function pauseGuidance(reason, runId) {
|
|
20
|
+
const resumeHint = `flow-app resume ${runId}(或 MCP resume_run)从暂停点继续`;
|
|
21
|
+
if (reason === 'login') {
|
|
22
|
+
return `请在引擎浏览器(open-browser/run 弹出的专用浏览器)完成登录后执行 ${resumeHint}`;
|
|
23
|
+
}
|
|
24
|
+
if (reason === 'env_check') {
|
|
25
|
+
return `引擎检测到环境风险(验证码/风险弹窗,流程 envCheck 配置命中)——请人工查看页面并处理后执行 ${resumeHint};绝不自动重试(防封铁律)`;
|
|
26
|
+
}
|
|
27
|
+
return `请人工处理页面状态后执行 ${resumeHint}`;
|
|
28
|
+
}
|
|
16
29
|
/**
|
|
17
30
|
* 生成 run_id:r_<pid 36进制>_<毫秒>_<随机hex> —— 实例标识 + 时间戳 + 随机段
|
|
18
31
|
* (ARCHITECTURE #11 命名空间原则:多实例 pid 不同、同进程同毫秒随机段兜底,观察身份不碰撞)
|
|
@@ -179,38 +192,10 @@ export class MockPage {
|
|
|
179
192
|
return snapshotFromText(this.url);
|
|
180
193
|
}
|
|
181
194
|
}
|
|
182
|
-
/**
|
|
183
|
-
* 自动上报(自动注册闭环):平台已配置时,run 结束后自动 deliver + 上传观察包到 md-forge。
|
|
184
|
-
* 失败记台账 Failed(sync_pending_uploads / 启动 bootstrap 可重试);平台未配置 → 零开销 no-op。
|
|
185
|
-
*/
|
|
186
|
-
export async function autoUploadRun(ctx, runId) {
|
|
187
|
-
if (ctx.config.platformUrl.length === 0)
|
|
188
|
-
return;
|
|
189
|
-
const rec = ctx.store.loadRun(runId);
|
|
190
|
-
if (!rec)
|
|
191
|
-
return;
|
|
192
|
-
const allRuns = ctx.store
|
|
193
|
-
.listRunIds()
|
|
194
|
-
.map((id) => ctx.store.loadRun(id))
|
|
195
|
-
.filter((r) => !!r && r.flowId === rec.flowId);
|
|
196
|
-
try {
|
|
197
|
-
const snapshot = ctx.store.loadSnapshot(runId);
|
|
198
|
-
const dir = ctx.platform.deliver(rec, allRuns, undefined, snapshot);
|
|
199
|
-
const client = new PlatformClient(ctx.config.platformUrl, ctx.config.platformToken);
|
|
200
|
-
const up = await client.uploadObservation(dir);
|
|
201
|
-
ctx.store.markUploaded(runId, true);
|
|
202
|
-
// T020 P0-2:上传成功(台账 Uploaded)即删本地 outbox 包目录(传输暂存区,非存档区)
|
|
203
|
-
ctx.platform.removeObservation(dir);
|
|
204
|
-
console.log(`[flow-rpa] 观察已自动上报: ${up.dir}(${up.status})`);
|
|
205
|
-
}
|
|
206
|
-
catch (e) {
|
|
207
|
-
ctx.store.markUploaded(runId, false, e instanceof Error ? e.message : String(e));
|
|
208
|
-
console.log(`[flow-rpa] 观察自动上报失败(台账 Failed,outbox 保留可重试): ${e instanceof Error ? e.message : String(e)}`);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
195
|
/**
|
|
212
196
|
* T020 P0-2:run 完成后顺带清理——超窗 runs 归档到 data/archive、snapshots/extracted 删除、
|
|
213
|
-
* 残留 *.tmp
|
|
197
|
+
* 残留 *.tmp 清扫;失败仅日志(不阻断 run 收尾)。
|
|
198
|
+
* T029:观察包自动上传已随 md-forge 退役移除(export_observation 仍可本地导出)。
|
|
214
199
|
*/
|
|
215
200
|
export async function housekeepingAfterRun(ctx) {
|
|
216
201
|
try {
|
|
@@ -410,6 +395,7 @@ export async function executeRun(ctx, args, runId) {
|
|
|
410
395
|
pausedAt: result.pausedAt,
|
|
411
396
|
pauseReason: result.pauseReason,
|
|
412
397
|
owner: args.owner,
|
|
398
|
+
pauseGuidance: pauseGuidance(result.pauseReason, runId), // T027/B2:结构化指引(message 层)
|
|
413
399
|
};
|
|
414
400
|
ctx.runs.set(runId, pr);
|
|
415
401
|
return pr;
|
|
@@ -441,28 +427,50 @@ export async function executeRun(ctx, args, runId) {
|
|
|
441
427
|
ctx.coolGate.record(`${flow.id}#${step.stepId}#${step.cooldownKey}`);
|
|
442
428
|
}
|
|
443
429
|
}
|
|
444
|
-
// 自动上报(自动注册闭环):平台已配置时 run 结束即上传观察包(失败进台账可重试)
|
|
445
|
-
await autoUploadRun(ctx, runId);
|
|
446
|
-
// 版本演进闭环:L2 建议自动上传平台(幂等;失败仅日志,不阻断 run)
|
|
447
|
-
if (ctx.config.platformUrl.length > 0 && sugIds.length > 0) {
|
|
448
|
-
await autoUploadSuggestions(ctx, flow.id, sugIds);
|
|
449
|
-
}
|
|
450
430
|
// T020 P0-2:run 完成后顺带清理(超窗 runs 归档/删除 + 残留 tmp 清扫;失败不阻断收尾)
|
|
451
431
|
await housekeepingAfterRun(ctx);
|
|
452
432
|
// T010 P2-6:会话轮换已前移至 run 开始前(每次 run 新会话)——run 尾部不再轮换
|
|
453
433
|
return r;
|
|
454
434
|
}
|
|
435
|
+
/**
|
|
436
|
+
* T027/B2:登录态探测器(真实模式缺省实现)——连 9222 现有标签页,
|
|
437
|
+
* 用 engine region.ts 登录区双重特征(isLoginSignal:路由特征 + 页面文本强标记,与 executor 每步复查同源)判定是否已登录。
|
|
438
|
+
* 标签页选择:优先与暂停流程同 host(用户在该站登录的页);无同 host → 首个 page 标签。
|
|
439
|
+
* 返回 true = 已登录(预检通过);false = 仍在登录区。
|
|
440
|
+
* 任何失败(浏览器不可达/无标签页/evaluate 失败)→ 抛错(调用方视为「预检不可判定」放行——评审定案 Q2)。
|
|
441
|
+
*/
|
|
442
|
+
export async function probeLoginState(ctx, flowId) {
|
|
443
|
+
const { listTargets, CdpClient } = await import('@qing3a/flow-rpa-engine/src/cdp/client.js');
|
|
444
|
+
const { isLoginSignal } = await import('@qing3a/flow-rpa-engine/src/region.js');
|
|
445
|
+
const pages = await listTargets(ctx.config.cdpPort);
|
|
446
|
+
if (pages.length === 0)
|
|
447
|
+
throw new Error('调试端点无 page 标签页');
|
|
448
|
+
const host = flowHost(ctx, flowId);
|
|
449
|
+
const target = (host ? pages.find((t) => hostOf(t.url) === host) : undefined) ?? pages[0];
|
|
450
|
+
const client = await CdpClient.connect(target.wsUrl);
|
|
451
|
+
try {
|
|
452
|
+
const url = String(await client.evaluate('location.href').catch(() => ''));
|
|
453
|
+
const text = String(await client.evaluate("document.body ? document.body.innerText : ''").catch(() => ''));
|
|
454
|
+
return !isLoginSignal(url, text);
|
|
455
|
+
}
|
|
456
|
+
finally {
|
|
457
|
+
await client.close().catch(() => undefined);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
455
460
|
/**
|
|
456
461
|
* T015 P0-2:resume_run——从暂停点继续执行(人工接管后调用)。
|
|
457
462
|
* 语义:
|
|
458
463
|
* - 仅接受 status=paused 的 run(执行中/非 paused → 明确拒绝;不重跑已完成步骤);
|
|
459
464
|
* - 先校验暂停超时(缺省 5 分钟可配置)→ 超时转 failed(防无限挂起);
|
|
465
|
+
* - T027/B2 登录态预检:pauseReason=login 时先探测引擎浏览器登录态——仍在登录区 → 拒绝本次 resume
|
|
466
|
+
* (返回 precheckRejected,run 保持 paused,不消耗真实执行轮次——防封视角:真实站点的无谓失败本身就是风险信号);
|
|
467
|
+
* 预检不可判定(浏览器不可达等)→ 放行走原路径(executor 每步登录复查兜底);mock 模式不预检;
|
|
460
468
|
* - 复用 vars(暂停时已持久化)与 resumeStepIndex/resumeLoop* 上下文,从暂停点继续;
|
|
461
469
|
* executor 每步前自动重新校验登录区/验证码(仍异常 → 再次 paused 并提示,不自动重试——防封不变);
|
|
462
470
|
* - 完成后正常走 done/failed 落盘 + L2 学习 + 自动上报(与普通 run 一致)。
|
|
463
471
|
* 返回 RunFlowResult(status: running / done / failed / paused)。
|
|
464
472
|
*/
|
|
465
|
-
export async function resumeRun(ctx, runId) {
|
|
473
|
+
export async function resumeRun(ctx, runId, precheck) {
|
|
466
474
|
// 1) 校验 run 存在且处于 paused
|
|
467
475
|
const rec = ctx.store.loadRun(runId);
|
|
468
476
|
if (!rec) {
|
|
@@ -485,7 +493,29 @@ export async function resumeRun(ctx, runId) {
|
|
|
485
493
|
return r;
|
|
486
494
|
}
|
|
487
495
|
}
|
|
488
|
-
// 3)
|
|
496
|
+
// 3) T027/B2:登录态预检(pauseReason=login 时;探测失败 = 不可判定 → 放行兜底)
|
|
497
|
+
if (rec.pauseReason === 'login') {
|
|
498
|
+
const detect = precheck?.detectLogin ?? (ctx.config.mock ? undefined : () => probeLoginState(ctx, rec.flowId));
|
|
499
|
+
if (detect) {
|
|
500
|
+
try {
|
|
501
|
+
if (!(await detect())) {
|
|
502
|
+
return {
|
|
503
|
+
runId,
|
|
504
|
+
status: 'paused',
|
|
505
|
+
error: '登录态预检未通过:引擎浏览器仍在登录区——完成登录后再次 resume(本次未执行,run 保持暂停)',
|
|
506
|
+
pauseReason: 'login',
|
|
507
|
+
pauseGuidance: pauseGuidance('login', runId),
|
|
508
|
+
owner: rec.owner,
|
|
509
|
+
precheckRejected: true,
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
// 预检不可判定(浏览器不可达/无标签页等)→ 放行(executor 每步登录复查兜底;ABSORPTION-BSK 评审定案 Q2)
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
// 4) 组装 resume 上下文(vars 从暂停记录恢复;flowId/owner 沿用)
|
|
489
519
|
const flowId = rec.flowId;
|
|
490
520
|
const cached = ctx.registry.get(flowId);
|
|
491
521
|
if (!cached) {
|
|
@@ -499,7 +529,7 @@ export async function resumeRun(ctx, runId) {
|
|
|
499
529
|
loopIter: rec.resumeLoopIter,
|
|
500
530
|
loopSub: rec.resumeLoopSub,
|
|
501
531
|
};
|
|
502
|
-
//
|
|
532
|
+
// 5) 执行 resume(串行队列语义与普通 run 一致:wait=true 同步执行完返回)
|
|
503
533
|
const result = await executeRun(ctx, { flowId, vars, wait: true, owner: rec.owner, resume }, runId);
|
|
504
534
|
return result;
|
|
505
535
|
}
|
|
@@ -561,29 +591,6 @@ export async function rotateBrowserSession(port, edgePath, userDataDir) {
|
|
|
561
591
|
throw new Error(`浏览器新会话 ${port} 未就绪(${edgePath})`);
|
|
562
592
|
}
|
|
563
593
|
}
|
|
564
|
-
/** 版本演进闭环:把本次 run 涉及的建议上传 md-forge(POST /api/suggestions,幂等);失败仅日志 */
|
|
565
|
-
export async function autoUploadSuggestions(ctx, flowId, suggestionIds) {
|
|
566
|
-
const client = new PlatformClient(ctx.config.platformUrl, ctx.config.platformToken);
|
|
567
|
-
const known = new Set(suggestionIds);
|
|
568
|
-
const suggestions = ctx.suggestions.list(flowId).filter((s) => known.has(s.suggestionId));
|
|
569
|
-
for (const s of suggestions) {
|
|
570
|
-
try {
|
|
571
|
-
const up = await client.uploadSuggestion({
|
|
572
|
-
suggestion_id: s.suggestionId,
|
|
573
|
-
flow_id: s.flowId,
|
|
574
|
-
kind: s.kind,
|
|
575
|
-
step_id: s.stepId,
|
|
576
|
-
message: s.message,
|
|
577
|
-
reuse_count: s.reuseCount,
|
|
578
|
-
source: 'local',
|
|
579
|
-
});
|
|
580
|
-
console.log(`[flow-rpa] 建议已上报: ${s.suggestionId}(${up.status})`);
|
|
581
|
-
}
|
|
582
|
-
catch (e) {
|
|
583
|
-
console.log(`[flow-rpa] 建议上报失败: ${s.suggestionId} — ${e instanceof Error ? e.message : String(e)}`);
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
594
|
/** 流程的目标站点 host(取首个 navigate 步骤的 url;无 navigate 返回 undefined —— 不节流 mock) */
|
|
588
595
|
export function flowHost(ctx, flowId) {
|
|
589
596
|
const cached = ctx.registry.get(flowId);
|