@qing3a/flow-rpa-app 0.1.0 → 0.3.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 +3 -1
- package/dist/cli.js +13 -4
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +22 -0
- package/dist/config.js +42 -1
- package/dist/config.js.map +1 -1
- package/dist/http.js +61 -9
- package/dist/http.js.map +1 -1
- package/dist/registry.d.ts +11 -2
- package/dist/registry.js +52 -6
- package/dist/registry.js.map +1 -1
- package/dist/runner.d.ts +25 -4
- package/dist/runner.js +117 -14
- package/dist/runner.js.map +1 -1
- package/dist/server.d.ts +15 -2
- package/dist/server.js +106 -42
- package/dist/server.js.map +1 -1
- package/dist/status.d.ts +7 -2
- package/dist/status.js +17 -1
- package/dist/status.js.map +1 -1
- package/package.json +6 -3
- package/skill/flow-rpa-engine.md +4 -3
package/dist/cli.d.ts
CHANGED
|
@@ -24,6 +24,8 @@ export interface CliOptions {
|
|
|
24
24
|
httpPort?: number;
|
|
25
25
|
/** --http-token(可选认证) */
|
|
26
26
|
httpToken?: string;
|
|
27
|
+
/** D3:工具面角色(owner 缺省 / hunter 裁剪集) */
|
|
28
|
+
role?: string;
|
|
27
29
|
/** 位置参数(list / validate <path> / install-skill <dir>) */
|
|
28
30
|
positionals?: string[];
|
|
29
31
|
}
|
|
@@ -33,7 +35,7 @@ export declare function defaultDirs(): {
|
|
|
33
35
|
dataDir: string;
|
|
34
36
|
};
|
|
35
37
|
export declare function parseCli(argv: string[]): CliOptions;
|
|
36
|
-
/** 从 CLI 选项构造 RunConfig
|
|
38
|
+
/** 从 CLI 选项构造 RunConfig(含环境变量兜底 + 平台配置持久化自动加载) */
|
|
37
39
|
export declare function configFromCli(opts: CliOptions): RunConfig;
|
|
38
40
|
/**
|
|
39
41
|
* M11c D-K2:install-skill —— 拷贝引擎级 skill 到 Agent 平台的 skills 目录。
|
package/dist/cli.js
CHANGED
|
@@ -5,7 +5,7 @@ import { join, dirname } from 'node:path';
|
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { parseFlow } from '@qing3a/flow-rpa-engine/src/validate.js';
|
|
7
7
|
import { FlowRegistry } from './registry.js';
|
|
8
|
-
import { defaultRunConfig } from './config.js';
|
|
8
|
+
import { defaultRunConfig, resolvePlatformConfig } from './config.js';
|
|
9
9
|
/** D-N3:缺省目录(本地开发 → 仓库根;全局 → ~/.flow-rpa) */
|
|
10
10
|
export function defaultDirs() {
|
|
11
11
|
const home = process.env.FLOW_RPA_HOME;
|
|
@@ -34,6 +34,7 @@ export function parseCli(argv) {
|
|
|
34
34
|
http: { type: 'boolean', default: false },
|
|
35
35
|
'http-port': { type: 'string' },
|
|
36
36
|
'http-token': { type: 'string' },
|
|
37
|
+
role: { type: 'string' },
|
|
37
38
|
},
|
|
38
39
|
allowPositionals: true,
|
|
39
40
|
strict: false,
|
|
@@ -51,18 +52,26 @@ export function parseCli(argv) {
|
|
|
51
52
|
http: values.http === true,
|
|
52
53
|
httpPort: str(values['http-port']) !== undefined ? Number(str(values['http-port'])) : undefined,
|
|
53
54
|
httpToken: str(values['http-token']),
|
|
55
|
+
role: str(values.role),
|
|
54
56
|
positionals,
|
|
55
57
|
};
|
|
56
58
|
}
|
|
57
|
-
/** 从 CLI 选项构造 RunConfig
|
|
59
|
+
/** 从 CLI 选项构造 RunConfig(含环境变量兜底 + 平台配置持久化自动加载) */
|
|
58
60
|
export function configFromCli(opts) {
|
|
59
61
|
const config = defaultRunConfig(opts.dataDir, opts.mock);
|
|
60
62
|
if (opts.cdpPort !== undefined && !Number.isNaN(opts.cdpPort))
|
|
61
63
|
config.cdpPort = opts.cdpPort;
|
|
62
64
|
if (opts.edgePath !== undefined && opts.edgePath.length > 0)
|
|
63
65
|
config.edgePath = opts.edgePath;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
// 平台配置:CLI/env 显式提供(并自动持久化)> data/platform.json 自动加载
|
|
67
|
+
const explicitUrl = opts.platformUrl ?? process.env.FLOW_PLATFORM_URL ?? '';
|
|
68
|
+
const explicitToken = opts.platformToken ?? process.env.FLOW_PLATFORM_TOKEN ?? '';
|
|
69
|
+
const resolved = resolvePlatformConfig(opts.dataDir, explicitUrl, explicitToken);
|
|
70
|
+
config.platformUrl = resolved.url;
|
|
71
|
+
config.platformToken = resolved.token;
|
|
72
|
+
// D3 角色:hunter 裁剪工具面;其它值(含缺省)→ owner(向后兼容)
|
|
73
|
+
if (opts.role === 'hunter')
|
|
74
|
+
config.role = 'hunter';
|
|
66
75
|
return config;
|
|
67
76
|
}
|
|
68
77
|
/**
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAkB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { type SimProfile } from '@qing3a/flow-rpa-engine/src/simprofile.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* 运行配置(浏览器/驱动选择;移植 Rust `server.rs` RunConfig)。
|
|
4
4
|
*/
|
|
5
|
+
/** 工具面角色(D3:owner 全量 12 工具;hunter 裁剪集,ARCHITECTURE #10 红线 4 代码化) */
|
|
6
|
+
export type ToolRole = 'owner' | 'hunter';
|
|
5
7
|
export interface RunConfig {
|
|
6
8
|
/** CDP 调试端口 */
|
|
7
9
|
cdpPort: number;
|
|
@@ -17,8 +19,28 @@ export interface RunConfig {
|
|
|
17
19
|
platformUrl: string;
|
|
18
20
|
/** md-forge 共享令牌 */
|
|
19
21
|
platformToken: string;
|
|
22
|
+
/** 工具面角色(D3;owner 缺省) */
|
|
23
|
+
role: ToolRole;
|
|
20
24
|
}
|
|
21
25
|
/** 探测本机 Edge 可执行文件(Windows 常见安装路径) */
|
|
22
26
|
export declare function defaultEdgePath(): string;
|
|
23
27
|
/** 默认配置:真实浏览器驱动,profile 与 sim 参数在 data 目录 */
|
|
24
28
|
export declare function defaultRunConfig(dataDir: string, mock: boolean): RunConfig;
|
|
29
|
+
export interface PlatformConfig {
|
|
30
|
+
url: string;
|
|
31
|
+
token: string;
|
|
32
|
+
}
|
|
33
|
+
/** data/platform.json 路径 */
|
|
34
|
+
export declare function platformConfigFile(dataDir: string): string;
|
|
35
|
+
/** 读取持久化平台配置(文件不存在 → undefined) */
|
|
36
|
+
export declare function loadPlatformConfig(dataDir: string): PlatformConfig | undefined;
|
|
37
|
+
/** 保存平台配置(token 本地明文;data/ 目录 gitignore,文档注明) */
|
|
38
|
+
export declare function savePlatformConfig(dataDir: string, url: string, token: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* 平台配置解析(优先级:CLI/env 显式提供 > 持久化 data/platform.json)。
|
|
41
|
+
* 显式提供且与持久化不同 → 自动持久化(下次启动免参,即「自动被 flow-rpa 注册」的配置面)。
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolvePlatformConfig(dataDir: string, explicitUrl: string, explicitToken: string): {
|
|
44
|
+
url: string;
|
|
45
|
+
token: string;
|
|
46
|
+
};
|
package/dist/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } 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';
|
|
@@ -23,6 +23,47 @@ export function defaultRunConfig(dataDir, mock) {
|
|
|
23
23
|
simProfile: loadSimProfile(defaultProfileFile(dataDir)).profile,
|
|
24
24
|
platformUrl: '',
|
|
25
25
|
platformToken: '',
|
|
26
|
+
role: 'owner',
|
|
26
27
|
};
|
|
27
28
|
}
|
|
29
|
+
/** data/platform.json 路径 */
|
|
30
|
+
export function platformConfigFile(dataDir) {
|
|
31
|
+
return join(dataDir, 'platform.json');
|
|
32
|
+
}
|
|
33
|
+
/** 读取持久化平台配置(文件不存在 → undefined) */
|
|
34
|
+
export function loadPlatformConfig(dataDir) {
|
|
35
|
+
const file = platformConfigFile(dataDir);
|
|
36
|
+
try {
|
|
37
|
+
const v = JSON.parse(readFileSync(file, 'utf8'));
|
|
38
|
+
if (typeof v.url === 'string' && v.url.length > 0 && typeof v.token === 'string' && v.token.length > 0) {
|
|
39
|
+
return { url: v.url, token: v.token };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// 文件缺失/损坏 → 未配置
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
/** 保存平台配置(token 本地明文;data/ 目录 gitignore,文档注明) */
|
|
48
|
+
export function savePlatformConfig(dataDir, url, token) {
|
|
49
|
+
mkdirSync(dataDir, { recursive: true });
|
|
50
|
+
writeFileSync(platformConfigFile(dataDir), JSON.stringify({ url, token, savedAt: new Date().toISOString() }, null, 2), 'utf8');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 平台配置解析(优先级:CLI/env 显式提供 > 持久化 data/platform.json)。
|
|
54
|
+
* 显式提供且与持久化不同 → 自动持久化(下次启动免参,即「自动被 flow-rpa 注册」的配置面)。
|
|
55
|
+
*/
|
|
56
|
+
export function resolvePlatformConfig(dataDir, explicitUrl, explicitToken) {
|
|
57
|
+
if (explicitUrl.length > 0 && explicitToken.length > 0) {
|
|
58
|
+
const saved = loadPlatformConfig(dataDir);
|
|
59
|
+
if (!saved || saved.url !== explicitUrl || saved.token !== explicitToken) {
|
|
60
|
+
savePlatformConfig(dataDir, explicitUrl, explicitToken);
|
|
61
|
+
}
|
|
62
|
+
return { url: explicitUrl, token: explicitToken };
|
|
63
|
+
}
|
|
64
|
+
const saved = loadPlatformConfig(dataDir);
|
|
65
|
+
if (saved)
|
|
66
|
+
return saved;
|
|
67
|
+
return { url: '', token: '' };
|
|
68
|
+
}
|
|
28
69
|
//# 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,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/http.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
2
4
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
5
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
4
6
|
import { acquireInstanceLock, releaseInstanceLock } from './runner.js';
|
|
5
|
-
import { buildCtx, registerTools } from './server.js';
|
|
7
|
+
import { buildCtx, bootstrapPlatform, registerTools } from './server.js';
|
|
6
8
|
import { collectStatus, renderStatusHtml } from './status.js';
|
|
7
9
|
/**
|
|
8
10
|
* M11d D-H1/D-H2/D-H3:--http 常驻模式(StreamableHTTPServerTransport)。
|
|
@@ -30,6 +32,8 @@ export async function serveHttp(opts) {
|
|
|
30
32
|
}
|
|
31
33
|
const port = opts.port ?? DEFAULT_HTTP_PORT;
|
|
32
34
|
const ctx = buildCtx(opts.flowsDir, opts.dataDir, opts.config, 'http');
|
|
35
|
+
// 启动自动注册(平台已配置时:健康探测 + 自动补传待上传台账;不阻断启动)
|
|
36
|
+
void bootstrapPlatform(ctx).catch(() => undefined);
|
|
33
37
|
const transports = new Set();
|
|
34
38
|
let closed = false;
|
|
35
39
|
const closeAll = async () => {
|
|
@@ -75,7 +79,7 @@ export async function serveHttp(opts) {
|
|
|
75
79
|
transports.delete(transport);
|
|
76
80
|
};
|
|
77
81
|
const sessionServer = new Server({ name: 'flow-rpa', version: '0.1.0-ts' }, { capabilities: { tools: {} } });
|
|
78
|
-
registerTools(sessionServer, ctx);
|
|
82
|
+
registerTools(sessionServer, ctx, ctx.config.role);
|
|
79
83
|
// 收集 body(POST JSON-RPC)
|
|
80
84
|
let body = undefined;
|
|
81
85
|
if (req.method === 'POST') {
|
|
@@ -106,14 +110,62 @@ export async function serveHttp(opts) {
|
|
|
106
110
|
};
|
|
107
111
|
process.on('SIGINT', shutdown);
|
|
108
112
|
process.on('SIGTERM', shutdown);
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
// 端口占用自动递增(任务 2):默认端口被占 → +1 重试(最多 10 次);
|
|
114
|
+
// 非占用错误 fail-loud 上抛;实际端口落盘 data/http-port.json 供 Agent/用户读取
|
|
115
|
+
const startPort = port === 0 ? 0 : port; // 0 = 随机端口(测试用,不递增)
|
|
116
|
+
let actualPort = startPort;
|
|
117
|
+
if (startPort === 0) {
|
|
118
|
+
actualPort = await new Promise((resolve, reject) => {
|
|
119
|
+
httpServer.once('error', (err) => {
|
|
120
|
+
console.error(`[flow-rpa] HTTP 服务启动失败: ${err.message}`);
|
|
121
|
+
reject(err);
|
|
122
|
+
});
|
|
123
|
+
httpServer.listen(0, () => {
|
|
124
|
+
const addr = httpServer.address();
|
|
125
|
+
resolve(typeof addr === 'object' && addr !== null ? addr.port : 0);
|
|
126
|
+
});
|
|
115
127
|
});
|
|
116
|
-
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
let bound = false;
|
|
131
|
+
for (let attempt = 0; attempt < 10 && !bound; attempt++) {
|
|
132
|
+
const tryPort = startPort + attempt;
|
|
133
|
+
try {
|
|
134
|
+
await new Promise((resolve, reject) => {
|
|
135
|
+
httpServer.once('error', reject);
|
|
136
|
+
httpServer.once('listening', resolve);
|
|
137
|
+
httpServer.listen(tryPort);
|
|
138
|
+
});
|
|
139
|
+
actualPort = tryPort;
|
|
140
|
+
bound = true;
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
const code = e.code;
|
|
144
|
+
if (code !== 'EADDRINUSE') {
|
|
145
|
+
// D1 fail-loud(USAGE-ISSUES #3):非占用错误明确报错退出,不静默
|
|
146
|
+
console.error(`[flow-rpa] HTTP 服务启动失败(端口 ${tryPort}): ${e instanceof Error ? e.message : String(e)}`);
|
|
147
|
+
void closeAll().then(() => process.exit(1));
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.log(`[flow-rpa] 端口 ${tryPort} 被占用,尝试 ${tryPort + 1}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (!bound) {
|
|
155
|
+
console.error(`[flow-rpa] HTTP 服务启动失败: 端口 ${startPort}~${startPort + 9} 均被占用`);
|
|
156
|
+
void closeAll().then(() => process.exit(1));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
opts.onListen?.(actualPort);
|
|
160
|
+
// 端口传递:落盘 data/http-port.json(Agent/状态页可读)
|
|
161
|
+
try {
|
|
162
|
+
mkdirSync(opts.dataDir, { recursive: true });
|
|
163
|
+
writeFileSync(join(opts.dataDir, 'http-port.json'), JSON.stringify({ port: actualPort, pid: process.pid, at: Date.now() }, null, 2), 'utf8');
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// 落盘失败不阻断(端口已就绪)
|
|
167
|
+
}
|
|
168
|
+
console.log(`[flow-rpa] HTTP 服务已启动: http://127.0.0.1:${actualPort}`);
|
|
117
169
|
return closeAll;
|
|
118
170
|
}
|
|
119
171
|
//# sourceMappingURL=http.js.map
|
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,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAA;AAClG,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAA;
|
|
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,MAAM,aAAa,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAA;AACzF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG7D;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAA;AAerC,oDAAoD;AACpD,SAAS,UAAU,CAAC,GAAoB,EAAE,KAAa;IACrD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAA;IAC5C,OAAO,IAAI,KAAK,UAAU,KAAK,EAAE,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAsB;IACpD,sBAAsB;IACtB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAA;IAC3C,MAAM,GAAG,GAAe,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClF,wCAAwC;IACxC,KAAK,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAElD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAA;IAC3D,IAAI,MAAM,GAAG,KAAK,CAAA;IAElB,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,IAAI,MAAM;YAAE,OAAM;QAClB,MAAM,GAAG,IAAI,CAAA;QACb,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC/E,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnC,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjD,yBAAyB;QACzB,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC1D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;YAClD,OAAM;QACR,CAAC;QACD,wBAAwB;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAClD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC1D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YACzD,OAAM;QACR,CAAC;QACD,sCAAsC;QACtC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,cAAc,EAAE,CAAC;YACvD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,CAAC,CAAA;YACzE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC1D,OAAM;QACR,CAAC;QACD,8BAA8B;QAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC5C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAA;YAClE,GAAG,CAAC,GAAG,CAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;YACpC,OAAM;QACR,CAAC;QACD,qDAAqD;QACrD,wEAAwE;QACxE,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;YAC1E,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAClD,kBAAkB,EAAE,SAAS;aAC9B,CAAC,CAAA;YACF,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACzB,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACvB,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC9B,CAAC,CAAA;YACD,MAAM,aAAa,GAAG,IAAI,MAAM,CAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,EACzC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAA;YACD,aAAa,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAClD,yBAAyB;YACzB,IAAI,IAAI,GAAY,SAAS,CAAA;YAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1B,IAAI,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACpD,MAAM,MAAM,GAAa,EAAE,CAAA;oBAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;oBAC7C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;wBACjB,IAAI,CAAC;4BACH,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;wBAC7F,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,MAAM,CAAC,CAAC,CAAC,CAAA;wBACX,CAAC;oBACH,CAAC,CAAC,CAAA;oBACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBACzB,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YACtC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC7C,OAAM;QACR,CAAC;QACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAA;QACpD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,yCAAyC;IACzC,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,KAAK,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA;IAChD,CAAC,CAAA;IACD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAE/B,0CAA0C;IAC1C,6DAA6D;IAC7D,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA,CAAC,oBAAoB;IAC5D,IAAI,UAAU,GAAG,SAAS,CAAA;IAC1B,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,UAAU,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC/B,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBACvD,MAAM,CAAC,GAAG,CAAC,CAAA;YACb,CAAC,CAAC,CAAA;YACF,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;gBACxB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAA;gBACjC,OAAO,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACpE,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,GAAG,KAAK,CAAA;QACjB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;YACnC,IAAI,CAAC;gBACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAC1C,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;oBAChC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;oBACrC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAC5B,CAAC,CAAC,CAAA;gBACF,UAAU,GAAG,OAAO,CAAA;gBACpB,KAAK,GAAG,IAAI,CAAA;YACd,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,GAAI,CAA2B,CAAC,IAAI,CAAA;gBAC9C,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC1B,gDAAgD;oBAChD,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;oBACrG,KAAK,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC7C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,WAAW,OAAO,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,SAAS,IAAI,SAAS,GAAG,CAAC,OAAO,CAAC,CAAA;YAC9E,KAAK,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAA;IAC3B,2CAA2C;IAC3C,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,EACpC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAC/E,MAAM,CACP,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAA;IAEpE,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { type Flow } from '@qing3a/flow-rpa-engine/src/validate.js';
|
|
2
|
+
import { type FlowPatch } from '@qing3a/flow-rpa-engine/src/schema.js';
|
|
2
3
|
/**
|
|
3
4
|
* FlowRegistry —— 流程注册表(移植 Rust `server.rs` FlowRegistry)。
|
|
4
5
|
* 扫描 flows/ 目录下各子目录的 flow.json,缓存解析结果。
|
|
6
|
+
* D5(2026-08-26):加载 flow.json 后合并用户覆盖层 flow.patch.json
|
|
7
|
+
* (按 stepId 定向整行替换 verify/params;patch 语法错误 → 警告不阻断,D1 fail-loud 复用)。
|
|
5
8
|
*/
|
|
6
9
|
/** 流程参数声明(D-R6;list_flows 返回,供 Agent 组装 vars) */
|
|
7
10
|
export interface FlowInputDecl {
|
|
@@ -18,12 +21,18 @@ export interface FlowSummary {
|
|
|
18
21
|
path: string;
|
|
19
22
|
inputs: FlowInputDecl[];
|
|
20
23
|
}
|
|
24
|
+
/** D5 整行替换合并:patch.steps[id].verify / params 整体替换原值(dsh 整行语义) */
|
|
25
|
+
export declare function applyPatch(flow: Flow, patch: FlowPatch | undefined): Flow;
|
|
21
26
|
export declare class FlowRegistry {
|
|
22
27
|
private readonly flowsDir;
|
|
23
|
-
/** flow_id →
|
|
28
|
+
/** flow_id → 已解析的流程定义(缓存;flow 为 patch 合并后的最终形态) */
|
|
24
29
|
private cache;
|
|
30
|
+
/** 最近一次扫描的流程加载警告(坏 flow.json / 坏 patch 等;fail-loud 警告态,get_status 呈现) */
|
|
31
|
+
private _warnings;
|
|
25
32
|
constructor(flowsDir: string);
|
|
26
|
-
/**
|
|
33
|
+
/** 最近一次扫描的警告(D1 fail-loud:坏流程启动即呈现,不静默跳过) */
|
|
34
|
+
warnings(): string[];
|
|
35
|
+
/** 扫描 flows/ 下各子目录的 flow.json(含 D5 patch 合并) */
|
|
27
36
|
list(): FlowSummary[];
|
|
28
37
|
get(flowId: string): {
|
|
29
38
|
version: number;
|
package/dist/registry.js
CHANGED
|
@@ -1,15 +1,58 @@
|
|
|
1
1
|
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { parseFlow } from '@qing3a/flow-rpa-engine/src/validate.js';
|
|
4
|
+
import { FlowPatchSchema } from '@qing3a/flow-rpa-engine/src/schema.js';
|
|
5
|
+
/** 读取用户覆盖层(flows/<name>/flow.patch.json;不存在 → undefined;解析失败 → 警告信息 + undefined) */
|
|
6
|
+
function loadPatch(flowDir, name, warnings) {
|
|
7
|
+
const patchPath = join(flowDir, 'flow.patch.json');
|
|
8
|
+
let raw;
|
|
9
|
+
try {
|
|
10
|
+
raw = readFileSync(patchPath, 'utf8');
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return undefined; // 无 patch(正常)
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
return FlowPatchSchema.parse(JSON.parse(raw));
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
// D5/D1:patch 语法错误 → 警告(不阻断,原 flow 生效)
|
|
20
|
+
warnings.push(`${name}/flow.patch.json 解析失败,已忽略 patch: ${e instanceof Error ? e.message : String(e)}`);
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** D5 整行替换合并:patch.steps[id].verify / params 整体替换原值(dsh 整行语义) */
|
|
25
|
+
export function applyPatch(flow, patch) {
|
|
26
|
+
if (!patch)
|
|
27
|
+
return flow;
|
|
28
|
+
const steps = flow.steps.map((s) => {
|
|
29
|
+
const p = patch.steps[s.id];
|
|
30
|
+
if (!p)
|
|
31
|
+
return s;
|
|
32
|
+
return {
|
|
33
|
+
...s,
|
|
34
|
+
...(p.verify !== undefined ? { verify: p.verify } : {}),
|
|
35
|
+
...(p.params !== undefined ? { params: p.params } : {}),
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
return { ...flow, steps };
|
|
39
|
+
}
|
|
4
40
|
export class FlowRegistry {
|
|
5
41
|
flowsDir;
|
|
6
|
-
/** flow_id →
|
|
42
|
+
/** flow_id → 已解析的流程定义(缓存;flow 为 patch 合并后的最终形态) */
|
|
7
43
|
cache = new Map();
|
|
44
|
+
/** 最近一次扫描的流程加载警告(坏 flow.json / 坏 patch 等;fail-loud 警告态,get_status 呈现) */
|
|
45
|
+
_warnings = [];
|
|
8
46
|
constructor(flowsDir) {
|
|
9
47
|
this.flowsDir = flowsDir;
|
|
10
48
|
}
|
|
11
|
-
/**
|
|
49
|
+
/** 最近一次扫描的警告(D1 fail-loud:坏流程启动即呈现,不静默跳过) */
|
|
50
|
+
warnings() {
|
|
51
|
+
return this._warnings;
|
|
52
|
+
}
|
|
53
|
+
/** 扫描 flows/ 下各子目录的 flow.json(含 D5 patch 合并) */
|
|
12
54
|
list() {
|
|
55
|
+
this._warnings = [];
|
|
13
56
|
const out = [];
|
|
14
57
|
let entries;
|
|
15
58
|
try {
|
|
@@ -21,7 +64,8 @@ export class FlowRegistry {
|
|
|
21
64
|
return [];
|
|
22
65
|
}
|
|
23
66
|
for (const name of entries) {
|
|
24
|
-
const
|
|
67
|
+
const flowDir = join(this.flowsDir, name);
|
|
68
|
+
const flowPath = join(flowDir, 'flow.json');
|
|
25
69
|
let raw;
|
|
26
70
|
try {
|
|
27
71
|
raw = readFileSync(flowPath, 'utf8');
|
|
@@ -30,7 +74,7 @@ export class FlowRegistry {
|
|
|
30
74
|
continue;
|
|
31
75
|
}
|
|
32
76
|
try {
|
|
33
|
-
const flow = parseFlow(raw);
|
|
77
|
+
const flow = applyPatch(parseFlow(raw), loadPatch(flowDir, name, this._warnings));
|
|
34
78
|
out.push({
|
|
35
79
|
id: flow.id,
|
|
36
80
|
name: flow.name,
|
|
@@ -44,8 +88,10 @@ export class FlowRegistry {
|
|
|
44
88
|
});
|
|
45
89
|
this.cache.set(flow.id, { version: flow.version, raw, flow });
|
|
46
90
|
}
|
|
47
|
-
catch {
|
|
48
|
-
//
|
|
91
|
+
catch (e) {
|
|
92
|
+
// D1:解析失败不静默跳过——收集警告(启动/状态页呈现),等 run_flow 才暴露太晚
|
|
93
|
+
this._warnings.push(`${name}/flow.json 解析失败: ${e instanceof Error ? e.message : String(e)}`);
|
|
94
|
+
continue;
|
|
49
95
|
}
|
|
50
96
|
}
|
|
51
97
|
out.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAa,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -19,15 +19,19 @@ import type { RunConfig } from './config.js';
|
|
|
19
19
|
/** 运行结果(内存态;running 期间 get_run 从这读) */
|
|
20
20
|
export interface RunFlowResult {
|
|
21
21
|
runId: string;
|
|
22
|
-
/** running / done / failed */
|
|
23
|
-
status: 'running' | 'done' | 'failed';
|
|
22
|
+
/** running / done / failed / cancelled(D7:排队中任务可取消) */
|
|
23
|
+
status: 'running' | 'done' | 'failed' | 'cancelled';
|
|
24
24
|
error?: string;
|
|
25
25
|
perfNote?: string;
|
|
26
|
+
/** D7:发起者标识(run_flow owner 参数,缺省 'local') */
|
|
27
|
+
owner?: string;
|
|
26
28
|
}
|
|
27
29
|
export interface RunFlowArgs {
|
|
28
30
|
flowId: string;
|
|
29
31
|
vars: Record<string, string>;
|
|
30
32
|
wait: boolean;
|
|
33
|
+
/** D7:发起者标识(agent/session;缺省 'local') */
|
|
34
|
+
owner?: string;
|
|
31
35
|
}
|
|
32
36
|
/** 执行上下文(runner 持有全部共享状态) */
|
|
33
37
|
export interface ExecCtx {
|
|
@@ -41,7 +45,10 @@ export interface ExecCtx {
|
|
|
41
45
|
perf: PerfGate;
|
|
42
46
|
config: RunConfig;
|
|
43
47
|
}
|
|
44
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* 生成 run_id:r_<pid 36进制>_<毫秒>_<随机hex> —— 实例标识 + 时间戳 + 随机段
|
|
50
|
+
* (ARCHITECTURE #11 命名空间原则:多实例 pid 不同、同进程同毫秒随机段兜底,观察身份不碰撞)
|
|
51
|
+
*/
|
|
45
52
|
export declare function newRunId(): string;
|
|
46
53
|
/**
|
|
47
54
|
* D-S1:DOM 快照采集并落盘(snapshots/<runId>.json)。
|
|
@@ -86,15 +93,29 @@ export declare class MockPage implements PageOps {
|
|
|
86
93
|
/** mock 的 snapshotDom(D-S1 验收:mock 模式不采集 → 返回 undefined 语义由 executeRun 跳过处理) */
|
|
87
94
|
snapshotDom(): Promise<DomSnapshot>;
|
|
88
95
|
}
|
|
89
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* 自动上报(自动注册闭环):平台已配置时,run 结束后自动 deliver + 上传观察包到 md-forge。
|
|
98
|
+
* 失败记台账 Failed(sync_pending_uploads / 启动 bootstrap 可重试);平台未配置 → 零开销 no-op。
|
|
99
|
+
*/
|
|
100
|
+
export declare function autoUploadRun(ctx: ExecCtx, runId: string): Promise<void>;
|
|
101
|
+
/** 同步执行一个 run(构造驱动 → 解释执行 → 落盘 → 自动上报 → 更新运行状态) */
|
|
90
102
|
export declare function executeRun(ctx: ExecCtx, args: RunFlowArgs, runId: string): Promise<RunFlowResult>;
|
|
103
|
+
/** 版本演进闭环:把本次 run 涉及的建议上传 md-forge(POST /api/suggestions,幂等);失败仅日志 */
|
|
104
|
+
export declare function autoUploadSuggestions(ctx: ExecCtx, flowId: string, suggestionIds: string[]): Promise<void>;
|
|
91
105
|
/** 流程的目标站点 host(取首个 navigate 步骤的 url;无 navigate 返回 undefined —— 不节流 mock) */
|
|
92
106
|
export declare function flowHost(ctx: ExecCtx, flowId: string): string | undefined;
|
|
93
107
|
/** 队列当前状态(自描述聚合用 D-S1;只读) */
|
|
94
108
|
export declare function queueState(): {
|
|
95
109
|
running: boolean;
|
|
96
110
|
pending: number;
|
|
111
|
+
runningRunId?: string;
|
|
112
|
+
runningOwner?: string;
|
|
97
113
|
};
|
|
114
|
+
/**
|
|
115
|
+
* D7 取消排队中的任务(执行中任务不支持——页面层 abort 留待阶段 4 后)。
|
|
116
|
+
* 返回结果文案(MCP 工具直接透传)。
|
|
117
|
+
*/
|
|
118
|
+
export declare function cancelRun(ctx: ExecCtx, runId: string): string;
|
|
98
119
|
/**
|
|
99
120
|
* 启动异步 run:入串行 FIFO 队列。
|
|
100
121
|
* wait=false → 立即返回 running(排队/后台执行);wait=true → 队列空闲则同步执行完返回,
|