Files

128 lines
2.8 KiB
Markdown

# 任务流程控制
> [返回文档中心](README.md) · [任务协议](protocol.md) · [执行与结果](execution.md)
## 1. 当前状态
协议 v1 只支持线性 `steps` 和 `optional`。`when`、`BRANCH`、`nextStepId` 和 `onFailure` 均为 **[提案]**。
流程控制只在出现实际条件流程时实现,不提前引入循环、脚本表达式或复杂工作流引擎。
## 2. Condition **[提案]**
WAIT、动作 `after`、`when` 和 BRANCH 共用简单 Condition。
节点条件:
~~~json
{
"state": "VISIBLE",
"selector": {
"text": {
"mode": "CONTAINS",
"value": "操作完成"
}
}
}
~~~
组合条件:
~~~json
{
"mode": "ALL",
"items": [
{
"type": "PACKAGE_IS",
"value": "com.example.target"
},
{
"state": "VISIBLE",
"selector": {
"resourceId": "com.example.target:id/result"
}
}
]
}
~~~
首批只需要:
- `ALL`、`ANY`。
- 节点状态:`PRESENT`、`GONE`、`VISIBLE`、`ENABLED`、`SELECTED`、`CHECKED`。
- 上下文:`PACKAGE_IS`、`ACTIVITY_IS`。
- 结果:`STEP_SUCCESS_IS`、`STEP_CODE_IS`。
- 输出比较:`EQ`、`NE`,需要时再增加数值比较。
Condition 返回 `MATCHED`、`NOT_MATCHED` 或 `ERROR`。引用缺失和读取失败属于 ERROR,不能当成条件不成立。
## 3. when **[提案]**
~~~json
{
"id": "click-confirm",
"action": "CLICK",
"packageName": "com.example.target",
"when": {
"type": "STEP_SUCCESS_IS",
"stepId": "prepare",
"value": true
},
"selector": {
"text": "确认"
}
}
~~~
- MATCHED:执行动作。
- NOT_MATCHED:跳过步骤。
- ERROR:步骤失败。
- when 只判断当前状态,不等待;需要等待时使用 WAIT。
## 4. BRANCH **[提案]**
~~~json
{
"id": "route-result",
"action": "BRANCH",
"cases": [
{
"condition": {
"state": "VISIBLE",
"selector": {
"text": "操作完成"
}
},
"targetStepId": "read-result"
}
],
"defaultStepId": "handle-unknown"
}
~~~
BRANCH 按顺序选择第一个匹配项。目标步骤必须存在并位于当前步骤之后,避免循环和无限执行。没有匹配项且没有 default 时返回 `BRANCH_NO_MATCH`。
## 5. onFailure **[提案]**
首版只需要三种处理:
- `STOP`:停止任务,默认值。
- `CONTINUE`:继续下一步。
- `GOTO`:跳到后续指定步骤。
~~~json
{
"onFailure": {
"codes": ["TARGET_NOT_FOUND"],
"action": "GOTO",
"targetStepId": "handle-missing"
}
}
~~~
不提供自动重试动作或整个任务。需要再次尝试时,在任务中写一个明确的后续步骤,并继续受总超时限制。
## 6. 最小校验
解析时确认步骤 id 唯一、跳转目标存在且只向前。跨分支输出和复杂汇合规则等到实际需要时再设计。