@qing3a/flow-rpa-app 0.5.12 → 0.7.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/README.md +16 -13
- package/dist/cli.d.ts +52 -19
- package/dist/cli.js +257 -93
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +4 -20
- package/dist/config.js +23 -45
- package/dist/config.js.map +1 -1
- package/dist/gate-key.d.ts +65 -0
- package/dist/gate-key.js +93 -0
- package/dist/gate-key.js.map +1 -0
- package/dist/gate-runtime.d.ts +27 -0
- package/dist/gate-runtime.js +44 -0
- package/dist/gate-runtime.js.map +1 -0
- 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/registry.d.ts +33 -2
- package/dist/registry.js +94 -10
- package/dist/registry.js.map +1 -1
- package/dist/runner.d.ts +59 -14
- package/dist/runner.js +158 -76
- package/dist/runner.js.map +1 -1
- package/dist/server.d.ts +11 -21
- package/dist/server.js +36 -132
- package/dist/server.js.map +1 -1
- package/dist/session-rotation.d.ts +58 -0
- package/dist/session-rotation.js +61 -0
- package/dist/session-rotation.js.map +1 -0
- package/dist/status.d.ts +55 -15
- package/dist/status.js +116 -65
- package/dist/status.js.map +1 -1
- package/package.json +2 -2
- package/skill/flow-rpa-engine.md +159 -50
- package/starter/baseline.json +18 -0
- package/starter/liepin_search_resumes/flow.json +34 -10
package/dist/config.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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
|
-
import { defaultProfileFile,
|
|
4
|
+
import { defaultProfileFile, loadSimProfileWith, profileKeyOf } from '@qing3a/flow-rpa-engine/src/simprofile.js';
|
|
5
5
|
/** 探测本机 Edge 可执行文件(Windows 常见安装路径) */
|
|
6
6
|
export function defaultEdgePath() {
|
|
7
7
|
for (const p of [
|
|
@@ -13,60 +13,38 @@ export function defaultEdgePath() {
|
|
|
13
13
|
}
|
|
14
14
|
return '';
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* 拟人人格日志出口(T037 修正,2026-09-11 监督层复核):
|
|
18
|
+
* **必须走 stderr**——stdio 模式下 stdout 是 MCP JSON-RPC 协议通道,任何非协议帧都会让客户端
|
|
19
|
+
* JSON.parse 失败(回归实证:缺省 console.log 导致 mcp-stdio.test.ts 5/5 failed)。
|
|
20
|
+
* stderr 在任何传输模式下都是安全诊断口(HTTP 模式同样如此)。
|
|
21
|
+
* 消息自带 `[flow-rpa]` 前缀,故这里不再重复加前缀。
|
|
22
|
+
*/
|
|
23
|
+
function personaLog(msg) {
|
|
24
|
+
console.error(msg);
|
|
25
|
+
}
|
|
16
26
|
/** 默认配置:真实浏览器驱动,profile 与 sim 参数在 data 目录 */
|
|
17
27
|
export function defaultRunConfig(dataDir, mock) {
|
|
28
|
+
return defaultRunConfigWith(dataDir, mock, personaLog);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 与 `defaultRunConfig` 同源,仅注入日志出口(测试可传静默/捕获 sink;
|
|
32
|
+
* T033 的 doctor 与真实运行配置同源纪律同样适用于此)。
|
|
33
|
+
*/
|
|
34
|
+
export function defaultRunConfigWith(dataDir, mock, log) {
|
|
18
35
|
const keepRaw = Number(process.env.FLOW_RPA_KEEP_RUNS);
|
|
36
|
+
// T037-1/4(0.7.0):人格按「真随机 salt + 账号标识(数据目录指纹)」加载——
|
|
37
|
+
// 同机不同 --data 目录 = 不同人格(账号级隔离);首次生成/迁移时打印一次 salt(可复现/排障)。
|
|
38
|
+
const loaded = loadSimProfileWith(defaultProfileFile(dataDir), profileKeyOf(dataDir), { dataDir, log });
|
|
19
39
|
return {
|
|
20
40
|
cdpPort: CDP_PORT,
|
|
21
41
|
edgePath: defaultEdgePath(),
|
|
22
42
|
userDataDir: join(dataDir, 'edge-profile'),
|
|
23
43
|
mock,
|
|
24
|
-
simProfile:
|
|
25
|
-
platformUrl: '',
|
|
26
|
-
platformToken: '',
|
|
44
|
+
simProfile: loaded.loaded.profile,
|
|
27
45
|
role: 'owner',
|
|
28
46
|
pauseTimeoutMs: 5 * 60_000,
|
|
29
47
|
keepRuns: Number.isInteger(keepRaw) && keepRaw > 0 ? keepRaw : 30,
|
|
30
48
|
};
|
|
31
49
|
}
|
|
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
50
|
//# 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,kBAAkB,EAAE,YAAY,EAAmB,MAAM,2CAA2C,CAAA;AA6BjI,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;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACpB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,IAAa;IAC7D,OAAO,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,IAAa,EACb,GAA0B;IAE1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IACtD,mDAAmD;IACnD,0DAA0D;IAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;IACvG,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,eAAe,EAAE;QAC3B,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;QAC1C,IAAI;QACJ,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QACjC,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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T035-1(ANTI-BAN-PRINCIPLES §五 S2):同站闸门的 **key 来源**收敛为一个纯函数。
|
|
3
|
+
*
|
|
4
|
+
* 缺陷(修复前):`runner.flowHost()` 只取**第一个** `navigate` 步骤的 URL host →
|
|
5
|
+
* ① 没有 navigate 的流程(手工导航后直接操作当前页)返回 `undefined`,`if (host)` 直接放过
|
|
6
|
+
* → 同站节流被完全绕过;② 跳站流程只闸第一站。
|
|
7
|
+
*
|
|
8
|
+
* 本模块把闸门 key 解析改成**运行时**口径(三级,永远返回 key,宁严不松):
|
|
9
|
+
* ① 运行时实际 host —— 该流程最近一次 run 起点读到的页面 URL(`gate-runtime.ts` 观测;探不到则跳过本级)
|
|
10
|
+
* ② 流程声明的 navigate host —— **全部** navigate 步骤里**最后一个**(= 最严:贴近 run 结束时所在站点)
|
|
11
|
+
* ③ 都没有 → `flow:<flowId>` 维度兜底(同一流程重复执行照样受节流)+ 一行告警日志
|
|
12
|
+
*
|
|
13
|
+
* 为什么「取最后一个」而不是第一个:跳站流程(如先 zhipin 再 liepin)的**最后**一站才是
|
|
14
|
+
* run 结束时真正被访问的站点,也是下一个 run 真正会再碰到的那一站;只闸第一站等于漏掉后面全部。
|
|
15
|
+
*
|
|
16
|
+
* 边界(不放松也不新增):闸门语义(跨站互不影响、随机 15~70s 窗口、深度翻页惩罚)完全不变——
|
|
17
|
+
* 本模块只决定「记哪个 key」。四条红线(验证码即中止 / 同站闸门 / 掩码前移 / 执行隔离)无一放松。
|
|
18
|
+
*/
|
|
19
|
+
/** `site:` = 解析到站点 host(真闸门);`flow:` = 兜底到 flowId 维度(无 host 可锚) */
|
|
20
|
+
export type GateKeySource = 'site' | 'flow';
|
|
21
|
+
/** 闸门 key 解析结果(`key` 已带维度前缀:`site:` / `flow:`) */
|
|
22
|
+
export interface GateKeyResolution {
|
|
23
|
+
/** 闸门台账 key(`site:<host>` 或 `flow:<flowId>`)——直接用作 SiteGate 的 host 参数 */
|
|
24
|
+
key: string;
|
|
25
|
+
source: GateKeySource;
|
|
26
|
+
/** 站点 host(`hostOf` 口径,含端口;source='flow' 时为空串)——只用于文案/日志 */
|
|
27
|
+
host: string;
|
|
28
|
+
}
|
|
29
|
+
/** 流程定义里可用于锚定站点的步骤(只用到这两个字段——引擎流程数据口径不变) */
|
|
30
|
+
export interface GateFlowStep {
|
|
31
|
+
type: string;
|
|
32
|
+
params: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
/** 优先级 ① 的入参:运行时实际页面的 URL(来源见 `gate-runtime.ts`;测试可直接注入) */
|
|
35
|
+
export interface GateKeyOptions {
|
|
36
|
+
/** 已读到的页面 URL(如该流程最近一次 run 起点观测到的 `location.href`) */
|
|
37
|
+
runtimeUrl?: string;
|
|
38
|
+
}
|
|
39
|
+
/** 未解析到站点 host 的告警文案(server / CLI / runner 三处同一文案源) */
|
|
40
|
+
export declare const NO_HOST_WARNING = "\u672A\u89E3\u6790\u5230\u7AD9\u70B9 host\uFF0C\u6309 flow \u7EF4\u5EA6\u8282\u6D41";
|
|
41
|
+
/** 闸门 key 的展示口径(日志/状态用;站点维度与流程维度一眼可分) */
|
|
42
|
+
export declare function gateKeyLabel(r: GateKeyResolution): string;
|
|
43
|
+
/** 闸门告警行(未解析到 host 时;返回 undefined = 无需告警)。调用方通常直接用 `reportGateFallback` */
|
|
44
|
+
export declare function gateWarning(r: GateKeyResolution, flowId: string): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* 「按 flow 维度兜底」告警输出(幂等:同一流程每次进程只喊一次——这个状态是流程属性而非事件,
|
|
47
|
+
* 每次 run 刷一遍会把日志淹掉)。返回本次是否真的打印了(供测试断言)。
|
|
48
|
+
*/
|
|
49
|
+
export declare function reportGateFallback(flowId: string, warn?: (msg: string) => void): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* 流程声明的 navigate host 链(优先级 ②):按步骤顺序取**全部** navigate URL 的 host,
|
|
52
|
+
* 返回**最后一个**(最严口径,见模块头)。无 navigate / URL 缺失 / host 抽不出来 → undefined。
|
|
53
|
+
*/
|
|
54
|
+
export declare function declaredNavigateHost(steps: readonly GateFlowStep[]): string | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* 解析闸门 key(**同步口径**):优先级 ① 只认已读到的 `opts.runtimeUrl`(入口层从
|
|
57
|
+
* `gate-runtime.ts` 的观测量取,或测试注入),没有就直接降级 ② / ③。
|
|
58
|
+
* 用于 acquire 发生在 run 之前的两处入口:`server.ts` 的 run_flow handler 与 CLI 的 precheckRun。
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveGateKey(flowId: string, steps: readonly GateFlowStep[], opts?: GateKeyOptions): GateKeyResolution;
|
|
61
|
+
/**
|
|
62
|
+
* `executeRun` 的闸门解析入口:调用方已解析过(server/CLI 的 run 前 acquire)就**原样返回**
|
|
63
|
+
* (零重复探测、零口径漂移);没传(如 resume_run)就按「运行时 host → 流程声明 host → flow 维度」现解析。
|
|
64
|
+
*/
|
|
65
|
+
export declare function resolveGateKeyInRun(resolved: GateKeyResolution | undefined, runtimeUrl: string | undefined, flowId: string, steps: readonly GateFlowStep[]): GateKeyResolution;
|
package/dist/gate-key.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { hostOf } from '@qing3a/flow-rpa-engine/src/gate.js';
|
|
2
|
+
/** 未解析到站点 host 的告警文案(server / CLI / runner 三处同一文案源) */
|
|
3
|
+
export const NO_HOST_WARNING = '未解析到站点 host,按 flow 维度节流';
|
|
4
|
+
/** 已报过「flow 维度兜底」告警的流程(同一流程只喊一次,避免每次 run 刷屏) */
|
|
5
|
+
const fallbackWarned = new Set();
|
|
6
|
+
/** 闸门 key 的展示口径(日志/状态用;站点维度与流程维度一眼可分) */
|
|
7
|
+
export function gateKeyLabel(r) {
|
|
8
|
+
return r.source === 'site' ? `${r.host}(站点维度)` : `${r.key}(流程维度兜底)`;
|
|
9
|
+
}
|
|
10
|
+
/** 闸门告警行(未解析到 host 时;返回 undefined = 无需告警)。调用方通常直接用 `reportGateFallback` */
|
|
11
|
+
export function gateWarning(r, flowId) {
|
|
12
|
+
return r.source === 'flow' ? `[flow-rpa] ${NO_HOST_WARNING}:流程 ${flowId}(key=${r.key})` : undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 「按 flow 维度兜底」告警输出(幂等:同一流程每次进程只喊一次——这个状态是流程属性而非事件,
|
|
16
|
+
* 每次 run 刷一遍会把日志淹掉)。返回本次是否真的打印了(供测试断言)。
|
|
17
|
+
*/
|
|
18
|
+
export function reportGateFallback(flowId, warn = console.log) {
|
|
19
|
+
if (fallbackWarned.has(flowId))
|
|
20
|
+
return false;
|
|
21
|
+
fallbackWarned.add(flowId);
|
|
22
|
+
warn(`[flow-rpa] ${NO_HOST_WARNING}:流程 ${flowId}(key=flow:${flowId})`);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* URL → 站点 host;**抽不出 host 形态则 undefined**(视为「本级探不到」,降级到下一级)。
|
|
27
|
+
* 判据(三条,刻意保守;宁可退到 flow 维度兜底,也不假装有站点闸门):
|
|
28
|
+
* - host 段不得含 `{`——流程里写插值占位(`https://{domain}/x`)时 `hostOf` 会退化成
|
|
29
|
+
* `{domain}:443`,用它当 key 等于「用一个永不会重复出现的 key 假装有闸门」;
|
|
30
|
+
* - host 段含 `.`(真域名)**或** URL 显式写了端口(`http://localhost:9222/` 这类本机调试端点
|
|
31
|
+
* 没有点但确是站点)——二者满足其一才认;
|
|
32
|
+
* - 去掉端口后不得为空。
|
|
33
|
+
* 真机口径不受影响:`location.href` 与真流程的 navigate URL 都是真 host。
|
|
34
|
+
*/
|
|
35
|
+
function hostFromUrl(url) {
|
|
36
|
+
if (typeof url !== 'string' || url.length === 0)
|
|
37
|
+
return undefined;
|
|
38
|
+
const h = hostOf(url);
|
|
39
|
+
const colon = h.lastIndexOf(':');
|
|
40
|
+
const explicitPort = colon !== -1 && /^[0-9]+$/.test(h.slice(colon + 1));
|
|
41
|
+
const name = explicitPort ? h.slice(0, colon) : h;
|
|
42
|
+
if (name.length === 0 || name.includes('{'))
|
|
43
|
+
return undefined;
|
|
44
|
+
if (!name.includes('.') && !explicitPort)
|
|
45
|
+
return undefined;
|
|
46
|
+
return h;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 流程声明的 navigate host 链(优先级 ②):按步骤顺序取**全部** navigate URL 的 host,
|
|
50
|
+
* 返回**最后一个**(最严口径,见模块头)。无 navigate / URL 缺失 / host 抽不出来 → undefined。
|
|
51
|
+
*/
|
|
52
|
+
export function declaredNavigateHost(steps) {
|
|
53
|
+
let last;
|
|
54
|
+
for (const s of steps) {
|
|
55
|
+
if (s.type !== 'navigate')
|
|
56
|
+
continue;
|
|
57
|
+
const h = hostFromUrl(typeof s.params?.url === 'string' ? s.params.url : undefined);
|
|
58
|
+
if (h)
|
|
59
|
+
last = h;
|
|
60
|
+
}
|
|
61
|
+
return last;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 解析闸门 key(**同步口径**):优先级 ① 只认已读到的 `opts.runtimeUrl`(入口层从
|
|
65
|
+
* `gate-runtime.ts` 的观测量取,或测试注入),没有就直接降级 ② / ③。
|
|
66
|
+
* 用于 acquire 发生在 run 之前的两处入口:`server.ts` 的 run_flow handler 与 CLI 的 precheckRun。
|
|
67
|
+
*/
|
|
68
|
+
export function resolveGateKey(flowId, steps, opts = {}) {
|
|
69
|
+
// ① 运行时实际 host(调用方已读到的页面 URL)
|
|
70
|
+
const runtime = hostFromUrl(opts.runtimeUrl);
|
|
71
|
+
if (runtime)
|
|
72
|
+
return { key: `site:${runtime}`, source: 'site', host: runtime };
|
|
73
|
+
// ② 流程声明的 navigate host(全部 navigate 取最后一个)
|
|
74
|
+
const declared = declaredNavigateHost(steps);
|
|
75
|
+
if (declared)
|
|
76
|
+
return { key: `site:${declared}`, source: 'site', host: declared };
|
|
77
|
+
// ③ flow 维度兜底(调用方按 reportGateFallback 打一行告警,同一流程只喊一次)
|
|
78
|
+
return { key: `flow:${flowId}`, source: 'flow', host: '' };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* `executeRun` 的闸门解析入口:调用方已解析过(server/CLI 的 run 前 acquire)就**原样返回**
|
|
82
|
+
* (零重复探测、零口径漂移);没传(如 resume_run)就按「运行时 host → 流程声明 host → flow 维度」现解析。
|
|
83
|
+
*/
|
|
84
|
+
export function resolveGateKeyInRun(resolved, runtimeUrl, flowId, steps) {
|
|
85
|
+
if (isResolution(resolved))
|
|
86
|
+
return resolved;
|
|
87
|
+
return resolveGateKey(flowId, steps, { runtimeUrl });
|
|
88
|
+
}
|
|
89
|
+
/** 判断入参是不是「已解析结果」(`resolveGateKeyInRun` 用:已解析就零重复探测地原样返回) */
|
|
90
|
+
function isResolution(v) {
|
|
91
|
+
return v !== undefined && typeof v.key === 'string';
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=gate-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-key.js","sourceRoot":"","sources":["../src/gate-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T035-1(S2):同站闸门 key 的 **① 运行时实际 host** 观测源。
|
|
3
|
+
*
|
|
4
|
+
* 问题:闸门的 `acquire`(run 前)发生在页面存在之前——
|
|
5
|
+
* - mock 模式 / resume:页面驱动由执行层临时构建,入口层拿不到;
|
|
6
|
+
* - 真实模式:每次 run 前会**会话轮换**(重启浏览器到 about:blank),此刻读到的
|
|
7
|
+
* 「当前标签 URL」是上一次会话的残留页,不是本次 run 真正会访问的站点。
|
|
8
|
+
* 在 run 前硬探一次浏览器只会把上一次的残留站点记成这次的闸门维度(错锚),所以入口层**不探测**。
|
|
9
|
+
*
|
|
10
|
+
* 做法:执行层在 run 起点把**运行时页面 URL**按 flowId 记成只读观测;
|
|
11
|
+
* 入口层(server run_flow / CLI precheckRun)下次解析闸门 key 时把它当优先级 ① 的来源。
|
|
12
|
+
*
|
|
13
|
+
* 边界:
|
|
14
|
+
* - 优先级 ②(流程声明的 navigate host)始终压得住它——有声明就用声明,观测只在**无声明**时生效;
|
|
15
|
+
* - 因此这条观测只影响「没有 navigate 步骤的流程」(正是 S2 的漏洞面),不会改写已有流程的闸门维度;
|
|
16
|
+
* - 按 flowId 分桶:A 流程观测到的站点不会被 B 流程借用(跨站不互相污染)。
|
|
17
|
+
*/
|
|
18
|
+
/** 记录一次运行时 URL 观测(测试注入缝:绕开页面驱动,直接设定「本流程上次所在站点」) */
|
|
19
|
+
export declare function setObservedRuntimeUrl(flowId: string, url: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* 记录一次运行时页面 URL 观测(执行层 run 起点调用;探针抛错 → 转为「无观测」,绝不阻断 run)。
|
|
22
|
+
* `page.currentUrl()` 由驱动提供:mock 页面如实回 URL,真实 CdpPage 在会话轮换后通常回 about:blank
|
|
23
|
+
* (此时记录空串 = 本流程暂时没有可用观测,入口层退回优先级 ② / ③)。
|
|
24
|
+
*/
|
|
25
|
+
export declare function observeRuntimeUrl(flowId: string, probe: () => Promise<string> | string, record?: (url: string) => void): Promise<string>;
|
|
26
|
+
/** 该流程最近一次 run 起点观测到的运行时页面 URL(无观测 → 空串) */
|
|
27
|
+
export declare function observedRuntimeUrl(flowId: string): string;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T035-1(S2):同站闸门 key 的 **① 运行时实际 host** 观测源。
|
|
3
|
+
*
|
|
4
|
+
* 问题:闸门的 `acquire`(run 前)发生在页面存在之前——
|
|
5
|
+
* - mock 模式 / resume:页面驱动由执行层临时构建,入口层拿不到;
|
|
6
|
+
* - 真实模式:每次 run 前会**会话轮换**(重启浏览器到 about:blank),此刻读到的
|
|
7
|
+
* 「当前标签 URL」是上一次会话的残留页,不是本次 run 真正会访问的站点。
|
|
8
|
+
* 在 run 前硬探一次浏览器只会把上一次的残留站点记成这次的闸门维度(错锚),所以入口层**不探测**。
|
|
9
|
+
*
|
|
10
|
+
* 做法:执行层在 run 起点把**运行时页面 URL**按 flowId 记成只读观测;
|
|
11
|
+
* 入口层(server run_flow / CLI precheckRun)下次解析闸门 key 时把它当优先级 ① 的来源。
|
|
12
|
+
*
|
|
13
|
+
* 边界:
|
|
14
|
+
* - 优先级 ②(流程声明的 navigate host)始终压得住它——有声明就用声明,观测只在**无声明**时生效;
|
|
15
|
+
* - 因此这条观测只影响「没有 navigate 步骤的流程」(正是 S2 的漏洞面),不会改写已有流程的闸门维度;
|
|
16
|
+
* - 按 flowId 分桶:A 流程观测到的站点不会被 B 流程借用(跨站不互相污染)。
|
|
17
|
+
*/
|
|
18
|
+
/** flowId → 最近一次 run 起点观测到的运行时页面 URL */
|
|
19
|
+
const observed = new Map();
|
|
20
|
+
/** 记录一次运行时 URL 观测(测试注入缝:绕开页面驱动,直接设定「本流程上次所在站点」) */
|
|
21
|
+
export function setObservedRuntimeUrl(flowId, url) {
|
|
22
|
+
observed.set(flowId, url);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 记录一次运行时页面 URL 观测(执行层 run 起点调用;探针抛错 → 转为「无观测」,绝不阻断 run)。
|
|
26
|
+
* `page.currentUrl()` 由驱动提供:mock 页面如实回 URL,真实 CdpPage 在会话轮换后通常回 about:blank
|
|
27
|
+
* (此时记录空串 = 本流程暂时没有可用观测,入口层退回优先级 ② / ③)。
|
|
28
|
+
*/
|
|
29
|
+
export async function observeRuntimeUrl(flowId, probe, record = (url) => observed.set(flowId, url)) {
|
|
30
|
+
let url = '';
|
|
31
|
+
try {
|
|
32
|
+
url = String(await probe());
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
url = ''; // 探针失败 = 探不到(降级到流程声明 / flow 维度),不是错误
|
|
36
|
+
}
|
|
37
|
+
record(url);
|
|
38
|
+
return url;
|
|
39
|
+
}
|
|
40
|
+
/** 该流程最近一次 run 起点观测到的运行时页面 URL(无观测 → 空串) */
|
|
41
|
+
export function observedRuntimeUrl(flowId) {
|
|
42
|
+
return observed.get(flowId) ?? '';
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=gate-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-runtime.js","sourceRoot":"","sources":["../src/gate-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,wCAAwC;AACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;AAE1C,mDAAmD;AACnD,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,GAAW;IAC/D,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,KAAqC,EACrC,SAAgC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAElE,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,GAAG,EAAE,CAAA,CAAC,qCAAqC;IAChD,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAA;IACX,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;AACnC,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/registry.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ import { type FlowPatch } from '@qing3a/flow-rpa-engine/src/schema.js';
|
|
|
5
5
|
* 扫描 flows/ 目录下各子目录的 flow.json,缓存解析结果。
|
|
6
6
|
* D5(2026-08-26):加载 flow.json 后合并用户覆盖层 flow.patch.json
|
|
7
7
|
* (按 stepId 定向整行替换 verify/params;patch 语法错误 → 警告不阻断,D1 fail-loud 复用)。
|
|
8
|
+
* T035-2(2026-09-10,ANTI-BAN-PRINCIPLES §五 S6):加载后比对**内置基线哈希**,
|
|
9
|
+
* 标注流程来源(`builtin` / `builtin-modified` / `local`)——本地改动**可见但不阻断**。
|
|
8
10
|
*/
|
|
9
11
|
/** 流程参数声明(D-R6;list_flows 返回,供 Agent 组装 vars) */
|
|
10
12
|
export interface FlowInputDecl {
|
|
@@ -12,7 +14,18 @@ export interface FlowInputDecl {
|
|
|
12
14
|
/** 必填(D-R6:缺省 false;缺 required 参数时 run_flow 报「缺少必填参数」) */
|
|
13
15
|
required: boolean;
|
|
14
16
|
description?: string;
|
|
17
|
+
/** T031C-1:缺省值(String 化后透传给 Agent)。有 default ⇒ 调用方可省略(required 也不例外) */
|
|
18
|
+
default?: string;
|
|
15
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* T035-2(S6):流程来源标注。
|
|
22
|
+
* - `builtin`:目录文件名与内容都与**内置基线**逐一致(原样分发的内置流程包)
|
|
23
|
+
* - `builtin-modified`:命中基线(是内置流程),但至少一个文件内容与基线不符(用户本地改过)
|
|
24
|
+
* - `local`:不在基线清单里(用户自建流程,或内置目录被改名)
|
|
25
|
+
* 无基线数据(用户目录里没有 `baseline.json`,或包内副本缺失)时统一标 `local`——
|
|
26
|
+
* **不可校验不等于有罪**:降级为无校验 + 一行日志,不告警、不阻断。
|
|
27
|
+
*/
|
|
28
|
+
export type FlowOrigin = 'builtin' | 'builtin-modified' | 'local';
|
|
16
29
|
/** 流程摘要(list_flows 返回) */
|
|
17
30
|
export interface FlowSummary {
|
|
18
31
|
id: string;
|
|
@@ -20,24 +33,42 @@ export interface FlowSummary {
|
|
|
20
33
|
version: number;
|
|
21
34
|
path: string;
|
|
22
35
|
inputs: FlowInputDecl[];
|
|
36
|
+
/** T035-2(S6):来源标注(工具面可见;不落 run.json) */
|
|
37
|
+
origin: FlowOrigin;
|
|
38
|
+
}
|
|
39
|
+
/** 基线清单(`flows/baseline.json`;由脚本生成,禁止手写) */
|
|
40
|
+
export interface FlowBaseline {
|
|
41
|
+
/** 清单格式版本(当前 1);未来格式变更靠它做兼容分支 */
|
|
42
|
+
version: number;
|
|
43
|
+
/** 生成时刻(ISO;仅供人看) */
|
|
44
|
+
generatedAt: string;
|
|
45
|
+
/** flowId → { 文件名 → sha256 } */
|
|
46
|
+
flows: Record<string, {
|
|
47
|
+
files: Record<string, string>;
|
|
48
|
+
}>;
|
|
23
49
|
}
|
|
50
|
+
/** 基线文件名(与流程目录同级,即 flows/ 下) */
|
|
51
|
+
export declare const BASELINE_FILE = "baseline.json";
|
|
52
|
+
/** 解析基线清单(缺失/损坏/格式不符 → undefined = 无校验;**绝不抛错**) */
|
|
53
|
+
export declare function loadBaseline(flowsDir: string): FlowBaseline | undefined;
|
|
24
54
|
/** D5 整行替换合并:patch.steps[id].verify / params 整体替换原值(dsh 整行语义) */
|
|
25
55
|
export declare function applyPatch(flow: Flow, patch: FlowPatch | undefined): Flow;
|
|
26
56
|
export declare class FlowRegistry {
|
|
27
57
|
private readonly flowsDir;
|
|
28
58
|
/** flow_id → 已解析的流程定义(缓存;flow 为 patch 合并后的最终形态) */
|
|
29
59
|
private cache;
|
|
30
|
-
/** 最近一次扫描的流程加载警告(坏 flow.json / 坏 patch
|
|
60
|
+
/** 最近一次扫描的流程加载警告(坏 flow.json / 坏 patch / 偏离内置基线等;fail-loud 警告态,get_status 呈现) */
|
|
31
61
|
private _warnings;
|
|
32
62
|
constructor(flowsDir: string);
|
|
33
63
|
/** 最近一次扫描的警告(D1 fail-loud:坏流程启动即呈现,不静默跳过) */
|
|
34
64
|
warnings(): string[];
|
|
35
|
-
/** 扫描 flows/ 下各子目录的 flow.json(含 D5 patch
|
|
65
|
+
/** 扫描 flows/ 下各子目录的 flow.json(含 D5 patch 合并 + T035-2 基线比对) */
|
|
36
66
|
list(): FlowSummary[];
|
|
37
67
|
get(flowId: string): {
|
|
38
68
|
version: number;
|
|
39
69
|
raw: string;
|
|
40
70
|
flow: Flow;
|
|
71
|
+
origin: FlowOrigin;
|
|
41
72
|
} | undefined;
|
|
42
73
|
/** 流程目录(pkg_update 替换用) */
|
|
43
74
|
flowsDirOf(): string;
|