@qing3a/flow-rpa-app 0.5.8 → 0.5.9
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qing3a/flow-rpa-app",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.9",
|
|
4
4
|
"engines": { "node": ">=20" },
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "flow-rpa 应用壳(原 app crate):MCP server + CLI",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"typecheck": "tsc --noEmit"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@qing3a/flow-rpa-engine": "^0.5.
|
|
29
|
+
"@qing3a/flow-rpa-engine": "^0.5.9",
|
|
30
30
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
31
31
|
"zod": "^4.4.3"
|
|
32
32
|
}
|
|
@@ -34,3 +34,5 @@
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
|
|
38
|
+
|
package/skill/flow-rpa-engine.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- 由 docs/SKILL-ENGINE.md 构建生成(M11c D-K1),勿手改;改 docs 真源后重跑 pnpm build -->
|
|
2
2
|
# 引擎级 skill:flow-rpa 本地 RPA 引擎(契约版)
|
|
3
3
|
|
|
4
|
-
> 状态:**定稿**(2026-08-29 按 0.5.
|
|
4
|
+
> 状态:**定稿**(2026-08-29 按 0.5.9 实现校对:14 工具签名核对(T015 resume_run 新增)、暂停-恢复语义、薪资加密标注(T017 P1-1)、标题过滤 matchText(T017 P1-2)、平台配置引导(T019 P2-3)、节流参数同步、D3 角色说明)
|
|
5
5
|
> 用途:挂载在 npm 包内作为「引擎级 skill」的唯一真源(ARCHITECTURE #10),安装时同步/链接到 Agent 平台的 skills 目录。
|
|
6
6
|
> 分工:本 skill 只讲「怎么调引擎」;业务编排(何时调、调哪个流程)在业务级 skill(外部/平台分发)。
|
|
7
7
|
|
|
@@ -59,6 +59,16 @@
|
|
|
59
59
|
- **正常初始态**:未跑流程前 `browser.connected=false`、`flows=[]`(或仅流程包内的)均为正常——
|
|
60
60
|
浏览器懒加载(首次 run_flow 才弹出),流程需先从 md-forge 获取(`pkg_update`)或放入 flows/
|
|
61
61
|
|
|
62
|
+
### 0.6 配置平台(md-forge:观察上报 + 流程/建议同步;T019 P2-3)
|
|
63
|
+
|
|
64
|
+
- **目的**:配置 `platform-url + platform-token` 后,引擎自动注册:run 结束自动上传观察包、`pkg_update` 拉取流程包、L2 建议同步回平台。未配置 = 本地模式正常使用(观察只落盘本地,`get_status` 的 `platform.configured=false`)。
|
|
65
|
+
- **配置方式(二选一,一次配置永久生效——自动持久化到 `data/platform.json`)**:
|
|
66
|
+
- **启动参数**:`flow-app --http ... --platform-url <url> --platform-token <token>`(token 已由平台方发放)
|
|
67
|
+
- **环境变量**:`FLOW_PLATFORM_URL=<url>` `FLOW_PLATFORM_TOKEN=<token>`(服务启动时读取)
|
|
68
|
+
- **验证配置生效**:`flow-app doctor` 显示「✅ 平台已配置」;或 `get_status` 返回 `platform.configured=true`(url 含地址,**不含 token**)。
|
|
69
|
+
- **配置后**:`pkg_update` 拉取平台流程包到 `flows/`(或本地 `flows/` 优先,pkg_update 只覆盖平台发布的版本);已配置后 run 结束自动上传观察包(`sync_pending_uploads` 可重试断网遗留)。
|
|
70
|
+
- ⚠️ 若 doctor 显示「⚠️ 平台未配置」而你已经拿到 token——说明 token 未传进引擎(启动命令缺 `--platform-url/--platform-token` 或环境变量未设),按上面方式补配后重启服务。
|
|
71
|
+
|
|
62
72
|
---
|
|
63
73
|
|
|
64
74
|
## 一、这是什么
|
|
@@ -148,7 +158,9 @@ Agent 按自己被赋予的角色调用,超出裁剪集的工具会报「工
|
|
|
148
158
|
- extract 步骤:`field`(字段标签)、`count`(命中数)、`saved`(是否落盘本地明细)
|
|
149
159
|
- `selectorHit`:实际生效的选择器(页面改版排查用)
|
|
150
160
|
- paused 记录额外字段:`pausedAt`(暂停时刻)、`pauseReason`(login/env_check/paused)、`resumeStepIndex`(resume 起点)
|
|
151
|
-
- **薪资加密(T017 P1-1)**:BOSS 薪资为字体加密字符(PUA 私用区 `\uE000-\uF8FF`,如 `\uE02E\uE02F-\uE02E\uF9K` 渲染为 "13-16K")——提取内容**保留原始加密字符**(不再删除),步骤记录 `salaryEncrypted: true`
|
|
161
|
+
- **薪资加密(T017 P1-1 + T018 决策 c)**:BOSS 薪资为字体加密字符(PUA 私用区 `\uE000-\uF8FF`,如 `\uE02E\uE02F-\uE02E\uF9K` 渲染为 "13-16K")——提取内容**保留原始加密字符**(不再删除),步骤记录 `salaryEncrypted: true` 标注「薪资加密」;**不要当作乱码/提取失败**。
|
|
162
|
+
- **消费口径(owner 拍板策略 c,2026-08-29)**:引擎**不解码** PUA 字体(解码映射在防封红线内不做);需要真实薪资时,**在引擎浏览器中实时读取**——用引擎浏览器当前页面的薪资元素查看真实数值,或引导用户人工查看登录态下的薪资显示(get_run 之外,引擎不提供解码)。
|
|
163
|
+
- **报告口径**:报告/表格中薪资统一标注「薪资加密 · 登录后可见」,**不填数值**(不做解码、不填乱码猜测值)。
|
|
152
164
|
- **标题过滤(T017 P1-2)**:click 步骤可用 `matchText: "{keyword}"`(region 寻址时跳过标题不含关键词的卡片——BOSS 搜索混入推荐位场景);表达式引擎内部为 `region:<标签> >> [match:<文本>] >> <n>`,index 作用于过滤后集合,凑够 limit 或列表耗尽自然终止
|
|
153
165
|
|
|
154
166
|
**失败处理**
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "liepin_search_resumes",
|
|
3
|
+
"name": "猎聘搜索候选人(HR 端)",
|
|
4
|
+
"platform": "liepin",
|
|
5
|
+
"version": 1,
|
|
6
|
+
"trigger": { "mode": "manual" },
|
|
7
|
+
"inputs": [
|
|
8
|
+
{ "name": "keyword", "required": true, "description": "搜索关键词(职位名,如 产品经理)" },
|
|
9
|
+
{ "name": "city", "required": false, "description": "城市名(如 珠海;缺省不带 → 平台默认城市)" },
|
|
10
|
+
{ "name": "limit", "required": false, "description": "提取数量上限,缺省 10" }
|
|
11
|
+
],
|
|
12
|
+
"envCheck": {
|
|
13
|
+
"verifyUrls": [
|
|
14
|
+
"safe.liepin.com/page/liepin/captchaPage_PC"
|
|
15
|
+
],
|
|
16
|
+
"dialogs": []
|
|
17
|
+
},
|
|
18
|
+
"steps": [
|
|
19
|
+
{
|
|
20
|
+
"id": "nav_home",
|
|
21
|
+
"type": "navigate",
|
|
22
|
+
"params": { "url": "https://h.liepin.com/resume/search" },
|
|
23
|
+
"verify": { "waitSelector": ".auto-input-wrap-v3, .search-btn, input[placeholder*=\"职位\" i]", "timeoutMs": 180000 }
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "input_keyword",
|
|
27
|
+
"type": "input",
|
|
28
|
+
"params": { "selector": ".auto-input-wrap-v3 input, input[placeholder*=\"职位\" i], input.input", "value": "{keyword}" },
|
|
29
|
+
"verify": { "textContains": "{keyword}" }
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "click_search",
|
|
33
|
+
"type": "click",
|
|
34
|
+
"params": { "selector": ".search-btn" },
|
|
35
|
+
"verify": { "waitSelector": ".detail-resume-card-wrap, [class*=\"resume-card\" i], .resume-list-container", "timeoutMs": 30000 }
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "loop_candidates",
|
|
39
|
+
"type": "loop",
|
|
40
|
+
"params": {
|
|
41
|
+
"steps": [
|
|
42
|
+
{
|
|
43
|
+
"id": "extract_list",
|
|
44
|
+
"type": "extract",
|
|
45
|
+
"params": { "selector": ".detail-resume-card-wrap, [class*=\"resume-card\" i]", "field": "candidateList" },
|
|
46
|
+
"verify": { "waitSelector": ".detail-resume-card-wrap, [class*=\"resume-card\" i]", "timeoutMs": 30000 }
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "click_candidate",
|
|
50
|
+
"type": "click",
|
|
51
|
+
"params": { "region": "候选列表区", "index": "{i}", "matchText": "{keyword}" },
|
|
52
|
+
"verify": { "waitSelector": "[class*=\"resume-detail\" i], [class*=\"resume-content\" i], .resume-detail-wrap", "textContains": "工作经历", "timeoutMs": 15000 }
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "extract_resume",
|
|
56
|
+
"type": "extract",
|
|
57
|
+
"params": { "selector": "[class*=\"resume-detail\" i], [class*=\"resume-content\" i], .resume-detail-wrap", "field": "resumeDetail", "save": true },
|
|
58
|
+
"verify": { "textContains": "工作经历", "timeoutMs": 15000 }
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "wait_breathe",
|
|
62
|
+
"type": "wait",
|
|
63
|
+
"params": { "ms": 3000 }
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "finalize",
|
|
70
|
+
"type": "finalize",
|
|
71
|
+
"params": { "closeTab": true }
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|