@qing3a/flow-rpa-app 0.1.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/server.js ADDED
@@ -0,0 +1,386 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
+ import { parseFlow } from '@qing3a/flow-rpa-engine/src/validate.js';
5
+ import { PlatformClient, pkgUpdate } from '@qing3a/flow-rpa-engine/src/platform.js';
6
+ import { GLOBAL_INTER_MIN_SECS, waitDurationLabel } from '@qing3a/flow-rpa-engine/src/gate.js';
7
+ import { MIN_SAMPLE_THRESHOLD } from '@qing3a/flow-rpa-engine/src/export.js';
8
+ import { RunStore } from '@qing3a/flow-rpa-engine/src/storage.js';
9
+ import { SuggestionStore } from '@qing3a/flow-rpa-engine/src/learning.js';
10
+ import { LocalPlatform } from '@qing3a/flow-rpa-engine/src/export.js';
11
+ import { SiteGate, CooldownGate } from '@qing3a/flow-rpa-engine/src/gate.js';
12
+ import { PerfGate } from '@qing3a/flow-rpa-engine/src/bench.js';
13
+ import { collectStatus } from './status.js';
14
+ import { FlowRegistry } from './registry.js';
15
+ import { acquireInstanceLock, flowHost, newRunId, releaseInstanceLock, spawnRun } from './runner.js';
16
+ import { readFileSync } from 'node:fs';
17
+ /** 构造执行上下文(供 serveStdio 与测试复用) */
18
+ export function buildCtx(flowsDir, dataDir, config, mode = 'stdio') {
19
+ return {
20
+ registry: new FlowRegistry(flowsDir),
21
+ store: new RunStore(dataDir),
22
+ runs: new Map(),
23
+ suggestions: new SuggestionStore(dataDir),
24
+ platform: new LocalPlatform(dataDir),
25
+ siteGate: new SiteGate(dataDir),
26
+ coolGate: new CooldownGate(dataDir),
27
+ perf: new PerfGate(dataDir),
28
+ config,
29
+ mode,
30
+ };
31
+ }
32
+ /** 文本响应工具 */
33
+ function text(text) {
34
+ return { content: [{ type: 'text', text }] };
35
+ }
36
+ export function buildTools(ctx) {
37
+ return [
38
+ {
39
+ name: 'list_flows',
40
+ description: '列出 flow-rpa 中可用的流程定义(id/name/version + inputs 参数声明,供 Agent 组装 vars)。无参数。',
41
+ inputSchema: { type: 'object', properties: {} },
42
+ handler: async () => {
43
+ const flows = ctx.registry.list();
44
+ if (flows.length === 0)
45
+ return text('没有可用的流程(flows/ 目录下无 flow.json)');
46
+ const lines = ['可用流程:'];
47
+ for (const f of flows) {
48
+ lines.push(`- ${f.id}(v${f.version}): ${f.name}`);
49
+ if (f.inputs.length > 0) {
50
+ const decl = f.inputs
51
+ .map((i) => `${i.name}(${i.required ? '必填' : '可选'})${i.description ? `: ${i.description}` : ''}`)
52
+ .join(';');
53
+ lines.push(` 参数: ${decl}`);
54
+ }
55
+ }
56
+ return text(lines.join('\n'));
57
+ },
58
+ },
59
+ {
60
+ name: 'run_flow',
61
+ description: '执行流程,异步返回 run_id(流程含 30~60s 冷却,同步会撞 MCP 超时)。vars 为 {keyword} 等变量;wait=true 时同步执行(仅调试)。同站任务间隔 ≥10 分钟(server 侧强制),不足则拒绝;串行队列,wait:true 且队列忙则拒绝。',
62
+ inputSchema: {
63
+ type: 'object',
64
+ properties: {
65
+ flowId: { type: 'string', description: '流程 id(flow.json 的 id 字段)' },
66
+ vars: { type: 'object', additionalProperties: { type: 'string' }, description: '变量插值 {keyword} 等' },
67
+ wait: { type: 'boolean', description: 'true=同步执行完返回(仅调试);缺省 false 异步排队' },
68
+ },
69
+ required: ['flowId'],
70
+ },
71
+ handler: async (args) => {
72
+ const flowId = args.flowId;
73
+ if (typeof flowId !== 'string' || flowId.length === 0) {
74
+ return text('参数错误: flowId 必填');
75
+ }
76
+ const vars = {};
77
+ if (args.vars && typeof args.vars === 'object') {
78
+ for (const [k, v] of Object.entries(args.vars)) {
79
+ if (typeof v === 'string')
80
+ vars[k] = v;
81
+ }
82
+ }
83
+ const wait = args.wait === true;
84
+ // 流程存在性检查:未知流程立即 failed(不等进队列)
85
+ const cached = ctx.registry.get(flowId);
86
+ if (!cached) {
87
+ return text(JSON.stringify({ runId: '', status: 'failed', error: `流程不存在: ${flowId}` }));
88
+ }
89
+ // D-R6:vars 缺 required 的 input → 明确报错(Agent 组装 vars 的信息缺口收口)
90
+ const missing = (cached.flow.inputs ?? []).filter((i) => i.required === true && vars[i.name] === undefined);
91
+ if (missing.length > 0) {
92
+ return text(JSON.stringify({ runId: '', status: 'failed', error: `缺少必填参数: ${missing[0].name}` }));
93
+ }
94
+ // 任务间同站闸门(防封铁律,server 侧强制)
95
+ const host = flowHost(ctx, flowId);
96
+ if (host) {
97
+ const waitSecs = ctx.siteGate.acquire(host);
98
+ if (typeof waitSecs === 'number') {
99
+ return text(JSON.stringify({
100
+ runId: '',
101
+ status: 'failed',
102
+ error: `同站节流:${host} 距上次执行不足 ${waitDurationLabel(GLOBAL_INTER_MIN_SECS)},还需等待 ${waitDurationLabel(waitSecs)}`,
103
+ }));
104
+ }
105
+ }
106
+ const runId = newRunId();
107
+ const result = await spawnRun(ctx, { flowId, vars, wait }, runId);
108
+ return text(JSON.stringify(result));
109
+ },
110
+ },
111
+ {
112
+ name: 'get_run',
113
+ description: '查询执行记录(run.json 全量,含每步 verify 结果与耗时)。running 期间返回内存状态,完成后返回落盘记录。',
114
+ inputSchema: { type: 'object', properties: { runId: { type: 'string' } }, required: ['runId'] },
115
+ handler: async (args) => {
116
+ if (typeof args.runId !== 'string' || args.runId.length === 0) {
117
+ return text('参数错误: runId 必填');
118
+ }
119
+ const mem = ctx.runs.get(args.runId);
120
+ if (mem?.status === 'running')
121
+ return text(JSON.stringify(mem));
122
+ const rec = ctx.store.loadRun(args.runId);
123
+ if (rec)
124
+ return text(JSON.stringify(rec, null, 2));
125
+ return text(`执行记录不存在: ${args.runId}(runs/ 目录下无对应文件)`);
126
+ },
127
+ },
128
+ {
129
+ name: 'validate_flow',
130
+ description: '校验流程定义(传 json 内容或 path 指向 flow.json),返回是否合法与错误信息。',
131
+ inputSchema: {
132
+ type: 'object',
133
+ properties: {
134
+ json: { type: 'string', description: '流程 JSON 内容' },
135
+ path: { type: 'string', description: 'flow.json 路径' },
136
+ },
137
+ },
138
+ handler: async (args) => {
139
+ let raw = null;
140
+ if (typeof args.json === 'string' && args.json.length > 0)
141
+ raw = args.json;
142
+ else if (typeof args.path === 'string' && args.path.length > 0) {
143
+ try {
144
+ raw = readFileSync(args.path, 'utf8');
145
+ }
146
+ catch (e) {
147
+ raw = e instanceof Error ? e : new Error(String(e));
148
+ }
149
+ }
150
+ if (raw === null)
151
+ return text(JSON.stringify({ valid: false, error: '需要 json 或 path 参数' }));
152
+ if (raw instanceof Error)
153
+ return text(JSON.stringify({ valid: false, error: `读取文件失败: ${raw.message}` }));
154
+ try {
155
+ const flow = parseFlow(raw);
156
+ return text(JSON.stringify({ valid: true, flowId: flow.id }));
157
+ }
158
+ catch (e) {
159
+ return text(JSON.stringify({ valid: false, error: e instanceof Error ? e.message : String(e) }));
160
+ }
161
+ },
162
+ },
163
+ {
164
+ name: 'list_suggestions',
165
+ description: '列出改进建议(L2 学习产物,标注来源 local/platform;pending 待人工确认,mature 可自动执行)。flow_id 可选,缺省返回全部。',
166
+ inputSchema: { type: 'object', properties: { flowId: { type: 'string' } } },
167
+ handler: async (args) => {
168
+ const all = typeof args.flowId === 'string' && args.flowId.length > 0 ? ctx.suggestions.list(args.flowId) : ctx.suggestions.listAll();
169
+ if (all.length === 0)
170
+ return text('没有建议(L2 学习管线暂无输出;执行失败 run 后会产生)');
171
+ return text(all
172
+ .map((s) => `- [${s.suggestionId}] ${s.status} | ${s.kind} | 步骤 ${s.stepId} | 来源 ${s.source} | 样本 ${s.reuseCount}/5 | ${s.message}`)
173
+ .join('\n'));
174
+ },
175
+ },
176
+ {
177
+ name: 'apply_suggestion',
178
+ description: '应用改进建议。未成熟建议必须 confirm=true(人工确认,结构改动铁律);成熟建议(样本≥门槛)可 confirm=false 自动执行。',
179
+ inputSchema: {
180
+ type: 'object',
181
+ properties: { suggestionId: { type: 'string' }, confirm: { type: 'boolean' } },
182
+ required: ['suggestionId'],
183
+ },
184
+ handler: async (args) => {
185
+ if (typeof args.suggestionId !== 'string' || args.suggestionId.length === 0) {
186
+ return text('参数错误: suggestionId 必填');
187
+ }
188
+ try {
189
+ return text(ctx.suggestions.apply(args.suggestionId, args.confirm === true));
190
+ }
191
+ catch (e) {
192
+ return text(`应用失败: ${e instanceof Error ? e.message : String(e)}`);
193
+ }
194
+ },
195
+ },
196
+ {
197
+ name: 'dismiss_suggestion',
198
+ description: '忽略一条建议(人工处置,不再展示)。',
199
+ inputSchema: { type: 'object', properties: { suggestionId: { type: 'string' } }, required: ['suggestionId'] },
200
+ handler: async (args) => {
201
+ if (typeof args.suggestionId !== 'string' || args.suggestionId.length === 0) {
202
+ return text('参数错误: suggestionId 必填');
203
+ }
204
+ try {
205
+ return text(ctx.suggestions.dismiss(args.suggestionId));
206
+ }
207
+ catch (e) {
208
+ return text(`忽略失败: ${e instanceof Error ? e.message : String(e)}`);
209
+ }
210
+ },
211
+ },
212
+ {
213
+ name: 'export_observation',
214
+ description: '把一次执行记录导出为观察报告包(observations/<flow>_v<version>_<run>/:stats.json 脱敏统计 + run.json + manifest.json + dom_snapshot.json)并标记台账已上传。dom_text 为可选页面文本快照。',
215
+ inputSchema: {
216
+ type: 'object',
217
+ properties: { runId: { type: 'string' }, domText: { type: 'string' } },
218
+ required: ['runId'],
219
+ },
220
+ handler: async (args) => {
221
+ if (typeof args.runId !== 'string' || args.runId.length === 0)
222
+ return text('参数错误: runId 必填');
223
+ const rec = ctx.store.loadRun(args.runId);
224
+ if (!rec)
225
+ return text(`执行记录不存在: ${args.runId}`);
226
+ // D-S3:优先读 data/snapshots/<runId>.json(含编号元素);无快照回退 domText 语义
227
+ const snapshot = ctx.store.loadSnapshot(args.runId);
228
+ const allRuns = ctx.store
229
+ .listRunIds()
230
+ .map((id) => ctx.store.loadRun(id))
231
+ .filter((r) => !!r && r.flowId === rec.flowId);
232
+ try {
233
+ const dir = ctx.platform.deliver(rec, allRuns, typeof args.domText === 'string' ? args.domText : undefined, snapshot);
234
+ const statsNote = allRuns.length < MIN_SAMPLE_THRESHOLD ? `(样本 ${allRuns.length} < 门槛 ${MIN_SAMPLE_THRESHOLD},统计通道未携带)` : '';
235
+ const snapNote = snapshot ? '(含编号元素快照)' : '';
236
+ // M10 D-O1 接线:配置了平台地址 → 真实上传(accepted/duplicate 均 Uploaded,deliver 已记)
237
+ let uploadNote = '';
238
+ if (ctx.config.platformUrl.length > 0) {
239
+ const client = new PlatformClient(ctx.config.platformUrl, ctx.config.platformToken);
240
+ try {
241
+ const up = await client.uploadObservation(dir);
242
+ uploadNote = ` 平台${up.status === 'accepted' ? '已接收' : '重复'}(${up.dir})`;
243
+ ctx.store.markUploaded(rec.runId, true);
244
+ }
245
+ catch (e) {
246
+ ctx.store.markUploaded(rec.runId, false, e instanceof Error ? e.message : String(e));
247
+ return text(`导出完成但上传失败: ${dir}(${e instanceof Error ? e.message : String(e)});台账已记 Failed,可 sync_pending_uploads 重试`);
248
+ }
249
+ }
250
+ return text(`观察报告已导出: ${dir}${snapNote}${statsNote}${uploadNote}`);
251
+ }
252
+ catch (e) {
253
+ return text(`导出失败: ${e instanceof Error ? e.message : String(e)}`);
254
+ }
255
+ },
256
+ },
257
+ {
258
+ name: 'sync_pending_uploads',
259
+ description: '重试上传台账中待上传(Pending/Failed)的观察包到本地模拟平台(断网重试入口)。',
260
+ inputSchema: { type: 'object', properties: {} },
261
+ handler: async () => {
262
+ const pending = ctx.platform.pending();
263
+ if (pending.length === 0)
264
+ return text('没有待上传的观察包');
265
+ let ok = 0;
266
+ const failed = [];
267
+ for (const runId of pending) {
268
+ const rec = ctx.store.loadRun(runId);
269
+ if (!rec)
270
+ continue;
271
+ const allRuns = ctx.store
272
+ .listRunIds()
273
+ .map((id) => ctx.store.loadRun(id))
274
+ .filter((r) => !!r && r.flowId === rec.flowId);
275
+ try {
276
+ // M10 D-O1 接线:配置了平台地址 → 真实上传;否则本地模拟(deliver)
277
+ if (ctx.config.platformUrl.length > 0) {
278
+ const client = new PlatformClient(ctx.config.platformUrl, ctx.config.platformToken);
279
+ const dir = ctx.platform.deliver(rec, allRuns);
280
+ await client.uploadObservation(dir);
281
+ ctx.store.markUploaded(runId, true);
282
+ }
283
+ else {
284
+ ctx.platform.deliver(rec, allRuns);
285
+ }
286
+ ok++;
287
+ }
288
+ catch (e) {
289
+ failed.push(`${runId}: ${e instanceof Error ? e.message : String(e)}`);
290
+ }
291
+ }
292
+ return text(failed.length === 0 ? `已重试上传 ${ok} 个观察包` : `上传完成 ${ok} 个,失败 ${failed.length} 个: ${failed.join('; ')}`);
293
+ },
294
+ },
295
+ {
296
+ name: 'get_perf',
297
+ description: '查询端到端性能基准(各流程平均耗时/平均步骤数/样本数;质量门数据)。',
298
+ inputSchema: { type: 'object', properties: {} },
299
+ handler: async () => {
300
+ const all = ctx.perf.all();
301
+ if (all.length === 0)
302
+ return text('暂无性能基准(执行 run 后产生)');
303
+ return text(all
304
+ .map((p) => `- ${p.flowId}:样本 ${p.sampleCount},平均耗时 ${p.avgDurationMs}ms,平均步骤 ${p.avgSteps},最近耗时 ${p.lastDurationMs}ms`)
305
+ .join('\n'));
306
+ },
307
+ },
308
+ {
309
+ name: 'pkg_update',
310
+ description: '从 md-forge 平台更新流程包(flow_id 可选;缺省更新全部已安装流程)。拉 manifest → 版本比对 → 下载 → 哈希校验 → 替换本地 flows/<name>/(软件包仅提示)。',
311
+ inputSchema: { type: 'object', properties: { flowId: { type: 'string' } } },
312
+ handler: async (args) => {
313
+ const client = new PlatformClient(ctx.config.platformUrl, ctx.config.platformToken);
314
+ if (ctx.config.platformUrl.length === 0) {
315
+ return text('pkg_update 未配置平台地址(启动时加 --platform-url <url> --platform-token <token>)');
316
+ }
317
+ const flowsDir = ctx.registry.flowsDirOf();
318
+ const targets = typeof args.flowId === 'string' && args.flowId.trim().length > 0
319
+ ? [args.flowId.trim()]
320
+ : ctx.registry.list().map((f) => f.id);
321
+ if (targets.length === 0)
322
+ return text('没有已安装的流程(flows/ 下无 flow.json)');
323
+ const out = [];
324
+ for (const name of targets) {
325
+ try {
326
+ const r = await pkgUpdate(client, flowsDir, name);
327
+ out.push(`- ${r.name}: ${r.status}(本地 v${r.localVersion ?? '?'} → 平台 v${r.platformVersion ?? '?'},hash ${r.hash.slice(0, 8)})${r.message ? ` ${r.message}` : ''}`);
328
+ }
329
+ catch (e) {
330
+ out.push(`- ${name}: 错误 ${e instanceof Error ? e.message : String(e)}`);
331
+ }
332
+ }
333
+ return text(out.join('\n').trimEnd());
334
+ },
335
+ },
336
+ {
337
+ name: 'get_status',
338
+ description: '查询引擎当前状态(版本/skill 版本/浏览器连接/队列/锁/流程列表/上传台账)——调用流程前预检环境。无参数,返回与 /status.json 同构的 JSON。',
339
+ inputSchema: { type: 'object', properties: {} },
340
+ handler: async () => {
341
+ return text(JSON.stringify(await collectStatus(ctx), null, 2));
342
+ },
343
+ },
344
+ ];
345
+ }
346
+ /** 注册全部工具(tools/list + tools/call 两个 handler,SDK 1.30 setRequestHandler) */
347
+ export function registerTools(server, ctx) {
348
+ const tools = buildTools(ctx);
349
+ const toolDefs = tools.map((t) => ({
350
+ name: t.name,
351
+ description: t.description,
352
+ inputSchema: t.inputSchema,
353
+ }));
354
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: toolDefs }));
355
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
356
+ const { name, arguments: args } = request.params;
357
+ const tool = tools.find((t) => t.name === name);
358
+ if (!tool) {
359
+ return { content: [{ type: 'text', text: `未知工具: ${name}` }], isError: true };
360
+ }
361
+ try {
362
+ return await tool.handler((args ?? {}));
363
+ }
364
+ catch (e) {
365
+ return { content: [{ type: 'text', text: `工具执行失败: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
366
+ }
367
+ });
368
+ }
369
+ /** 启动 MCP server(stdio 传输)。阻塞直到连接结束(EOF)→ 优雅退出。 */
370
+ export async function serveStdio(flowsDir, dataDir, config) {
371
+ // D-R2 单实例锁
372
+ if (!acquireInstanceLock(dataDir)) {
373
+ throw new Error('另一个 flow-rpa 实例正在运行(data/.lock 锁持有中);请先退出再启动');
374
+ }
375
+ const ctx = buildCtx(flowsDir, dataDir, config);
376
+ const server = new Server({ name: 'flow-rpa', version: '0.1.0-ts' }, { capabilities: { tools: {} } });
377
+ registerTools(server, ctx);
378
+ const transport = new StdioServerTransport();
379
+ await server.connect(transport);
380
+ // D-R5:等连接关闭(EOF)→ 优雅退出
381
+ await new Promise((resolve) => {
382
+ transport.onclose = () => resolve();
383
+ });
384
+ releaseInstanceLock(dataDir);
385
+ }
386
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { FlowMcpCtx } from './server.js';
2
+ /**
3
+ * M11e 只读状态页(D-P1/D-P2/D-P3)+ 自描述(EXECUTION-SPEC-STATUS D-S1)。
4
+ * - GET / 返回 HTML:流程列表 + 最近运行 + 浏览器 9222 状态 + 上传台账摘要
5
+ * - GET /status.json 返回 collectStatus 聚合的引擎状态 JSON(与状态页同一数据源)
6
+ * - 只读铁律:无任何写操作端点(无编辑/执行/管理动作)
7
+ * - 数据来源:config/registry/store/gate/lock,不新增服务端状态(只读聚合)
8
+ */
9
+ /** 自描述 JSON(D-S1 结构;/status.json 与 get_status 同构) */
10
+ export interface StatusJson {
11
+ /** 应用(app 包)版本 */
12
+ version: string;
13
+ /** 引擎级 skill 版本(v<version>,对齐 install-skill 文件头 D-K3) */
14
+ skillVersion: string;
15
+ /** 浏览器 9222 健康探测(listTargets;不做自动重启——无人值守边界) */
16
+ browser: {
17
+ connected: boolean;
18
+ port: number;
19
+ edgePath: string;
20
+ /** 独立浏览器 profile 目录(config.userDataDir) */
21
+ profile: string;
22
+ };
23
+ /** 串行 FIFO 队列状态(D-R1) */
24
+ queue: {
25
+ running: boolean;
26
+ pending: number;
27
+ };
28
+ /** 单实例锁(data/.lock):held=当前进程持有;otherPid 存在=被其他实例持有 */
29
+ lock: {
30
+ held: boolean;
31
+ /** 当前运行模式(stdio / http) */
32
+ mode: 'stdio' | 'http';
33
+ pid?: number;
34
+ otherPid?: number;
35
+ ageMs: number;
36
+ };
37
+ flows: Array<{
38
+ id: string;
39
+ name: string;
40
+ version: number;
41
+ inputs: Array<{
42
+ name: string;
43
+ required: boolean;
44
+ description?: string;
45
+ }>;
46
+ }>;
47
+ runs: {
48
+ recent: number;
49
+ pendingUploads: number;
50
+ };
51
+ ledger: {
52
+ pending: number;
53
+ uploaded: number;
54
+ failed: number;
55
+ };
56
+ /** 平台配置(脱敏口径:不含 token) */
57
+ platform: {
58
+ configured: boolean;
59
+ url: string;
60
+ };
61
+ }
62
+ /** 聚合引擎当前状态(自描述;/status.json 与 get_status 共用同一数据源) */
63
+ export declare function collectStatus(ctx: FlowMcpCtx): Promise<StatusJson>;
64
+ /** 生成状态页 HTML(内嵌数据,只读;数据源 = collectStatus) */
65
+ export declare function renderStatusHtml(ctx: FlowMcpCtx): Promise<string>;
package/dist/status.js ADDED
@@ -0,0 +1,150 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { listTargets } from '@qing3a/flow-rpa-engine/src/cdp/client.js';
5
+ import { queueState } from './runner.js';
6
+ /** HTML 转义(防注入) */
7
+ function esc(s) {
8
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
9
+ }
10
+ function recentRuns(ctx, n) {
11
+ const ids = ctx.store.listRunIds().reverse().slice(0, n);
12
+ const out = [];
13
+ for (const id of ids) {
14
+ const rec = ctx.store.loadRun(id);
15
+ if (rec)
16
+ out.push({ runId: rec.runId, flowId: rec.flowId, status: rec.status, startedAt: rec.startedAt, error: rec.error });
17
+ }
18
+ return out;
19
+ }
20
+ /** 浏览器 9222 健康探测(listTargets;只读,不拉起) */
21
+ async function browserProbe(ctx) {
22
+ try {
23
+ await listTargets(ctx.config.cdpPort);
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ /** 上传台账摘要 */
31
+ function ledgerSummary(ctx) {
32
+ const entries = ctx.store.loadLedger().entries;
33
+ return {
34
+ uploaded: entries.filter((e) => e.state === 'uploaded').length,
35
+ pending: entries.filter((e) => e.state === 'pending').length,
36
+ failed: entries.filter((e) => e.state === 'failed').length,
37
+ };
38
+ }
39
+ /** 应用(app 包)版本:读包根 package.json(src/ 或 dist/ → 上一级即包根) */
40
+ function appVersion() {
41
+ try {
42
+ const here = dirname(fileURLToPath(import.meta.url));
43
+ const pkg = JSON.parse(readFileSync(join(dirname(here), 'package.json'), 'utf8'));
44
+ return pkg.version ?? '0.0.0';
45
+ }
46
+ catch {
47
+ return '0.0.0';
48
+ }
49
+ }
50
+ /** 单实例锁当前状态(只读 data/.lock;held=当前进程持有,otherPid=被其他实例持有) */
51
+ function lockState(ctx) {
52
+ const empty = { held: false, mode: ctx.mode, ageMs: 0 };
53
+ let raw;
54
+ try {
55
+ raw = readFileSync(join(ctx.store.root, '.lock'), 'utf8');
56
+ }
57
+ catch {
58
+ return empty;
59
+ }
60
+ try {
61
+ const v = JSON.parse(raw);
62
+ const lockPid = typeof v.pid === 'number' ? v.pid : undefined;
63
+ const at = typeof v.at === 'number' ? v.at : undefined;
64
+ const ageMs = at !== undefined ? Math.max(0, Date.now() - at) : 0;
65
+ if (lockPid === process.pid)
66
+ return { held: true, mode: ctx.mode, pid: lockPid, ageMs };
67
+ if (lockPid !== undefined)
68
+ return { held: false, mode: ctx.mode, otherPid: lockPid, ageMs };
69
+ return empty;
70
+ }
71
+ catch {
72
+ // 锁文件损坏 → 视为无锁
73
+ return empty;
74
+ }
75
+ }
76
+ /** 聚合引擎当前状态(自描述;/status.json 与 get_status 共用同一数据源) */
77
+ export async function collectStatus(ctx) {
78
+ const version = appVersion();
79
+ const ledger = ledgerSummary(ctx);
80
+ return {
81
+ version,
82
+ skillVersion: `v${version}`,
83
+ browser: {
84
+ connected: await browserProbe(ctx),
85
+ port: ctx.config.cdpPort,
86
+ edgePath: ctx.config.edgePath,
87
+ profile: ctx.config.userDataDir,
88
+ },
89
+ queue: queueState(),
90
+ lock: lockState(ctx),
91
+ flows: ctx.registry.list().map((f) => ({ id: f.id, name: f.name, version: f.version, inputs: f.inputs })),
92
+ runs: { recent: ctx.store.listRunIds().length, pendingUploads: ctx.store.pendingUploads().length },
93
+ ledger,
94
+ platform: { configured: ctx.config.platformUrl.length > 0, url: ctx.config.platformUrl },
95
+ };
96
+ }
97
+ /** 生成状态页 HTML(内嵌数据,只读;数据源 = collectStatus) */
98
+ export async function renderStatusHtml(ctx) {
99
+ const s = await collectStatus(ctx);
100
+ const runs = recentRuns(ctx, 10);
101
+ const browser = s.browser;
102
+ const ledger = s.ledger;
103
+ const rows = runs
104
+ .map((r) => `<tr><td>${esc(r.runId)}</td><td>${esc(r.flowId)}</td><td class="st-${esc(r.status)}">${esc(r.status)}</td><td>${esc(r.startedAt)}</td><td>${esc(r.error ?? '')}</td></tr>`)
105
+ .join('\n');
106
+ const flowItems = s.flows
107
+ .map((f) => `<li>${esc(f.id)}(v${f.version}): ${esc(f.name)}</li>`)
108
+ .join('\n');
109
+ return `<!DOCTYPE html>
110
+ <html lang="zh">
111
+ <head>
112
+ <meta charset="utf-8">
113
+ <title>flow-rpa 状态页</title>
114
+ <style>
115
+ body { font-family: system-ui, sans-serif; margin: 2rem; color: #222; }
116
+ h1 { border-bottom: 2px solid #eee; padding-bottom: .5rem; }
117
+ .card { border: 1px solid #ddd; border-radius: 8px; padding: 1rem 1.2rem; margin-bottom: 1.2rem; }
118
+ table { border-collapse: collapse; width: 100%; font-size: .9rem; }
119
+ th, td { border: 1px solid #eee; padding: .4rem .6rem; text-align: left; }
120
+ .st-done { color: #1a7f37; } .st-failed { color: #cf222e; } .st-running { color: #9a6700; }
121
+ ul { margin: 0; padding-left: 1.2rem; }
122
+ .badge-up { color: #1a7f37; font-weight: bold; } .badge-down { color: #cf222e; font-weight: bold; }
123
+ </style>
124
+ </head>
125
+ <body>
126
+ <h1>flow-rpa 状态</h1>
127
+ <div class="card">
128
+ <strong>浏览器</strong>:<span class="${browser.connected ? 'badge-up' : 'badge-down'}">${browser.connected ? '运行中' : '未连接'}</span>
129
+ <span style="color:#888">(端口 ${browser.port})</span>
130
+ &nbsp;&nbsp;<strong>上传台账</strong>:uploaded ${ledger.uploaded} / pending ${ledger.pending} / failed ${ledger.failed}
131
+ </div>
132
+ <div class="card">
133
+ <strong>流程列表</strong>(${s.flows.length})
134
+ <ul>${flowItems || '<li>(无流程)</li>'}</ul>
135
+ </div>
136
+ <div class="card">
137
+ <strong>最近运行</strong>(${runs.length})
138
+ <table>
139
+ <tr><th>runId</th><th>flowId</th><th>status</th><th>startedAt</th><th>error</th></tr>
140
+ ${rows || '<tr><td colspan="5">(无运行记录)</td></tr>'}
141
+ </table>
142
+ </div>
143
+ <div class="card" style="color:#888;font-size:.8rem">
144
+ 只读状态页:无编辑/执行/管理动作。数据来源 data/(runs/、flows/、台账)。
145
+ </div>
146
+ </body>
147
+ </html>
148
+ `;
149
+ }
150
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}