aitable-workflow-core 0.1.23 → 0.1.24
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/index.d.ts +16 -4
- package/dist/index.js +190 -188
- package/package.json +2 -2
- package/skills/aitable-workflow/SKILL.md +18 -28
- package/skills/aitable-workflow/{reference → references}/config-surface.md +15 -1
- package/skills/aitable-workflow/{reference → references}/event-handlers.md +3 -1
- package/skills/aitable-workflow/references/event-sources.md +229 -0
- package/skills/aitable-workflow/references/field-types.md +73 -0
- package/skills/aitable-workflow/{reference → references}/generated/event-sources.md +16 -17
- package/skills/aitable-workflow/{reference → references}/invariants.md +4 -1
- package/skills/aitable-workflow/{reference → references}/multi-workflow.md +13 -7
- package/skills/aitable-workflow/{reference → references}/profile-and-roles.md +9 -3
- package/skills/aitable-workflow/{reference → references}/runtime-refs.md +8 -40
- package/skills/aitable-workflow/{reference → references}/workflow-yml.md +12 -10
- package/skills/aitable-workflow-design/SKILL.md +7 -5
- package/skills/aitable-workflow-design/patterns/brownfield-editing.md +2 -2
- package/skills/aitable-workflow-design/patterns/clarification-checklist.md +21 -28
- package/skills/aitable-workflow-design/patterns/config-in-aitable.md +4 -5
- package/skills/aitable-workflow-design/patterns/dingtalk-bot-patterns.md +129 -0
- package/skills/aitable-workflow-design/patterns/external-aitable-read.md +132 -0
- package/skills/aitable-workflow-design/patterns/greenfield-checklist.md +10 -10
- package/skills/aitable-workflow-design/patterns/output-and-report.md +2 -2
- package/skills/aitable-workflow/reference/event-sources.md +0 -217
- /package/skills/aitable-workflow/{reference → references}/aitable-cell-values.md +0 -0
- /package/skills/aitable-workflow/{reference → references}/automations.md +0 -0
- /package/skills/aitable-workflow/{reference → references}/generated/core-api.md +0 -0
- /package/skills/aitable-workflow/{reference → references}/generated/toolkits.md +0 -0
- /package/skills/aitable-workflow/{reference → references}/recipe-contract.md +0 -0
- /package/skills/aitable-workflow/{reference → references}/workspace-context.md +0 -0
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
## 1. 探测项目形态(不问用户,自己看)
|
|
10
10
|
|
|
11
11
|
- 有 `profile/profile.yml` 吗?→ 有则**增量修改**它;**没有也默认走 `profile_v2`**,即新建一份收敛的 `profile/profile.yml`——这是新建项目的默认配置模式
|
|
12
|
-
- 需要拆多个 workflow 吗?判据是**触发节律差异**,见 `../../aitable-workflow/
|
|
12
|
+
- 需要拆多个 workflow 吗?判据是**触发节律差异**,见 `../../aitable-workflow/references/multi-workflow.md`
|
|
13
13
|
- 需求里有没有引擎侧做不到、必须交给 DWS 自动化的部分(跨表落正式表、回消息带「点回那一行」的链接、公式计算)?
|
|
14
14
|
有则**先**读 `recipe-vs-automation.md` 定分工再往下走 —— 它决定要建哪些表、哪些字段,定晚了字段要返工
|
|
15
15
|
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
- 状态字段的 `options` 与 `tracker.states` 完全一致
|
|
23
23
|
- 系统骨架字段(`标题`/`状态`/`当前步骤`/`处理人`/`事件日志`)**不要声明**
|
|
24
24
|
- 字段声明写在每个 `workflow.yml` 的 `tracker.field_definitions` 里,**不是根级**(根级已废弃)
|
|
25
|
-
- 同一段 `tracker` 里 `states` 与 `fields` 一起给齐,缺一个整段 tracker 会被静默忽略 → `../../aitable-workflow/
|
|
26
|
-
- 详见 `../../aitable-workflow/
|
|
25
|
+
- 同一段 `tracker` 里 `states` 与 `fields` 一起给齐,缺一个整段 tracker 会被静默忽略 → `../../aitable-workflow/references/multi-workflow.md`
|
|
26
|
+
- 详见 `../../aitable-workflow/references/workflow-yml.md`
|
|
27
27
|
|
|
28
28
|
## 3. 设计单一决策字段
|
|
29
29
|
|
|
@@ -38,18 +38,18 @@
|
|
|
38
38
|
## 4. 规划 steps 与输出列
|
|
39
39
|
|
|
40
40
|
- 每个 step 一件事,`id` 用 `[a-z0-9_]`
|
|
41
|
-
- **输出列必须与展示列分开**:跨进程恢复时 StepEngine 会回退到「`output_mapping` 目标字段非空」启发式,被人工编辑的列绝不能做输出目标(见 `../../aitable-workflow/
|
|
41
|
+
- **输出列必须与展示列分开**:跨进程恢复时 StepEngine 会回退到「`output_mapping` 目标字段非空」启发式,被人工编辑的列绝不能做输出目标(见 `../../aitable-workflow/references/workflow-yml.md` 的重入守卫章节)
|
|
42
42
|
- 人工把关的 step 设 `auto: false` + `needs_human.reason`
|
|
43
|
-
- 每个 step 都要决定:**这一步真的需要 LLM 吗?** 能穷举成映射表的就写确定性逻辑(见 `../../aitable-workflow/
|
|
43
|
+
- 每个 step 都要决定:**这一步真的需要 LLM 吗?** 能穷举成映射表的就写确定性逻辑(见 `../../aitable-workflow/references/recipe-contract.md` 的执行策略)
|
|
44
44
|
- `edges` 闭链 `__start__` → … → `__end__`
|
|
45
45
|
|
|
46
46
|
## 5. 事件源与筛选条件
|
|
47
47
|
|
|
48
48
|
- 只有确实是事件驱动(群消息 / @机器人 / 定时 / 表格变更)才生成 `event_sources`
|
|
49
49
|
- 表单提交、手动新建 → **不生成**,tracker 自身轮询即可
|
|
50
|
-
- **`aitable_record` 必须带 `filter`** —— 见 `../../aitable-workflow/
|
|
50
|
+
- **`aitable_record` 必须带 `filter`** —— 见 `../../aitable-workflow/references/event-sources.md` 的「筛选条件」节,这是硬要求
|
|
51
51
|
- 按澄清结果配 `record_policy`(`eager` / `on_demand`)
|
|
52
|
-
- 详见 `../../aitable-workflow/
|
|
52
|
+
- 详见 `../../aitable-workflow/references/event-sources.md`
|
|
53
53
|
|
|
54
54
|
## 6. 写 recipes
|
|
55
55
|
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
- recipe 里需要调用 dws 时,只能用 `DwsClient.runJson([...])`;不要写裸 `dws`、`child_process` 或 `toolkit.shell.runJson("dws", ...)`
|
|
58
58
|
- `record_policy: on_demand` 时,所有可能不产生结论的分支返回 `tracker: false`
|
|
59
59
|
- 需要 LLM 结构化输出的,加契约 + 修复 + 重试(`json-contract-and-repair.md`)
|
|
60
|
-
- 详见 `../../aitable-workflow/
|
|
60
|
+
- 详见 `../../aitable-workflow/references/recipe-contract.md`
|
|
61
61
|
|
|
62
62
|
## 7. 角色与 workspace
|
|
63
63
|
|
|
@@ -66,14 +66,14 @@
|
|
|
66
66
|
- 角色写进 profile 的 `roles:` 段(persona 用 `{ file: prompts/<id>.md }`,相对 `profile/` 目录;或内联字符串)
|
|
67
67
|
- **无论如何都要产出 `workspaces/<role.id>/AGENTS.md`**,里面必须有明确的输出契约
|
|
68
68
|
- 需要知识库时配 `knowledge_scope.kb_collections` 并产出 `wiki/<name>/_index.md` 骨架
|
|
69
|
-
- 详见 `../../aitable-workflow/
|
|
69
|
+
- 详见 `../../aitable-workflow/references/profile-and-roles.md` 与 `../../aitable-workflow/references/workspace-context.md`
|
|
70
70
|
|
|
71
71
|
## 9. 环境变量声明
|
|
72
72
|
|
|
73
73
|
- 每个 `${env.X}` 都在 `.env.example` 里留一条,`KEY=` 上方写注释描述
|
|
74
74
|
- 可选凭据用 `${env.X?}`
|
|
75
75
|
- **不要生成 `.env`**,不要在 `.env.example` 写真实凭据
|
|
76
|
-
- 详见 `../../aitable-workflow/
|
|
76
|
+
- 详见 `../../aitable-workflow/references/runtime-refs.md`
|
|
77
77
|
|
|
78
78
|
|
|
79
79
|
## 11. 交叉核对
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
| `workspaces/<role-id>/AGENTS.md` | 每个角色 | 业务规格 + **输出契约**;复杂上下文放这里而不是塞进 prompt |
|
|
14
14
|
| `.env.example` | 需要外部凭据时 | 只声明变量名与用途,**绝不**生成 `.env` |
|
|
15
15
|
|
|
16
|
-
细节契约见 `../../aitable-workflow/SKILL.md` 的路由表;不可违反项见 `../../aitable-workflow/
|
|
16
|
+
细节契约见 `../../aitable-workflow/SKILL.md` 的路由表;不可违反项见 `../../aitable-workflow/references/invariants.md`。
|
|
17
17
|
|
|
18
18
|
## 汇报三段
|
|
19
19
|
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
规则:
|
|
41
41
|
|
|
42
42
|
- **「需确认项」不能为空**,除非用户逐条回答过你提出的每一个澄清问题。你替用户做的每个决定都要在这里出现,并写清「改哪个文件的哪个字段」才能推翻它。
|
|
43
|
-
- 「还需你补齐」只列**用户必须自己动手**的(凭据、base_id、表格授权),不要把你能生成的东西推给用户。**绝不要往 `config.yml` 写根级 `tracker`** → 规则见 `../../aitable-workflow/
|
|
43
|
+
- 「还需你补齐」只列**用户必须自己动手**的(凭据、base_id、表格授权),不要把你能生成的东西推给用户。**绝不要往 `config.yml` 写根级 `tracker`** → 规则见 `../../aitable-workflow/references/multi-workflow.md`。
|
|
44
44
|
- 假设也要落在产物里:受影响的文件用注释写明「假设:…(需确认)」。**绝不静默猜测。**
|
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
# 事件源(event_sources)
|
|
2
|
-
|
|
3
|
-
事件源在 `workflow.yml` 的 `event_sources` 段声明,每条内联 `handler`(handler recipe 名)。配置键用 **snake_case**。
|
|
4
|
-
|
|
5
|
-
**只有用户明确要求外部事件驱动入口时才生成 `event_sources`。** 表单提交、手动新建记录 → tracker 自身轮询即可。
|
|
6
|
-
|
|
7
|
-
## 内置类型一览
|
|
8
|
-
|
|
9
|
-
| type | 机制 | 用在哪 |
|
|
10
|
-
| --- | --- | --- |
|
|
11
|
-
| `dingtalk_group_message` | dws 逐群轮询 | 监听指定群的全部消息,不需要机器人 |
|
|
12
|
-
| `dingtalk_user_message` | dws `list-all` 单次批量拉取 | 群多到逐群轮询扛不住时(200+ 群) |
|
|
13
|
-
| `dingtalk_stream` | WebSocket 推送 | @机器人触发、要支持单聊 |
|
|
14
|
-
| `dingtalk_event` | dws event 长连接推送 | 实时监听指定群全部消息(个人身份,无轮询延迟) |
|
|
15
|
-
| `cron_scheduler` | 定时 | 日报、巡检、定时汇总 |
|
|
16
|
-
| `aitable_record` | AI 表格记录轮询 | 监听表格记录新增/变更 |
|
|
17
|
-
|
|
18
|
-
> `dingtalk_message` 是 `dingtalk_group_message` 的旧名,同一实现,已有模板里仍有效。
|
|
19
|
-
|
|
20
|
-
四个消息类事件源产出**同构**的 `message_received` 事件——换入站方式只改 `type`,下游零改动。
|
|
21
|
-
|
|
22
|
-
### 1. `dingtalk_group_message` — 钉钉群消息(dws 逐群轮询)
|
|
23
|
-
|
|
24
|
-
不需要机器人。
|
|
25
|
-
|
|
26
|
-
```yaml
|
|
27
|
-
event_sources:
|
|
28
|
-
- name: "群消息监听"
|
|
29
|
-
type: dingtalk_group_message
|
|
30
|
-
handler: message_triage_handler
|
|
31
|
-
config:
|
|
32
|
-
conversation_ids:
|
|
33
|
-
- "cidXXXXXXXXXXXX=="
|
|
34
|
-
- "cidYYYYYYYYYYYY=="
|
|
35
|
-
aggregate_by_sender: true # 默认 true
|
|
36
|
-
watch_senders: [] # 空=所有人
|
|
37
|
-
fetch_limit: 50
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
- **`conversation_ids`** 是字符串数组,多个会话**并发**拉取。
|
|
41
|
-
- `aggregate_by_sender`(默认 true):按发送者分组,每个发送者产出一个独立事件。
|
|
42
|
-
- 事件源只产出原始 `message_received`,**不做「新对话 vs 追问」判断**——由 EventHandler 决策。
|
|
43
|
-
- `conversation_ids` 可整值填运行时引用(如 `${globalVar.group_pull_list}`),见 `runtime-refs.md`。
|
|
44
|
-
- 三档语义:缺省 → setup 报必填缺失;`[]` → 默认停用;非空 → 正常启用。
|
|
45
|
-
|
|
46
|
-
#### 如何获取群 openConversationId
|
|
47
|
-
|
|
48
|
-
用 dws 列出当前账号能看到的会话,按群标题过滤取 `openConversationId`:
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
dws chat list-all-conversations --format json | jq '.[] | select(.title == "目标群名") | .openConversationId'
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
- 标题必须完全匹配;不确定时先用 `dws chat list-all-conversations --format json` 看原始列表。
|
|
55
|
-
- 取到的是 `cidXXXXXXXXXXXX==` 格式,整条填进 `conversation_ids`。
|
|
56
|
-
|
|
57
|
-
### 2. `dingtalk_user_message` — 批量拉取(群很多时用)
|
|
58
|
-
|
|
59
|
-
配置与 `dingtalk_group_message` 相同,差别在拉取机制:一次 `dws chat message list-all` 拉全部会话再本地过滤。群数 200+ 时用此类型(1~5 次分页 vs 200+ 次子进程调用)。
|
|
60
|
-
|
|
61
|
-
代价:`conversation_ids` 写错不会报错,静默什么都收不到。
|
|
62
|
-
|
|
63
|
-
### 3. `dingtalk_stream` — 企业内机器人(WebSocket 推送)
|
|
64
|
-
|
|
65
|
-
**前提:必须先在钉钉开放平台创建企业内机器人**,拿到 `client_id` / `client_secret`。
|
|
66
|
-
|
|
67
|
-
触发方式是**@机器人**(不 @ 不触发),同时**支持单聊**。
|
|
68
|
-
|
|
69
|
-
```yaml
|
|
70
|
-
- name: "机器人监听"
|
|
71
|
-
type: dingtalk_stream
|
|
72
|
-
handler: message_triage_handler
|
|
73
|
-
config:
|
|
74
|
-
robot_creds: "${env.DINGTALK_ROBOTS?}"
|
|
75
|
-
robot_refs: "${globalVar.stream_robot_refs}"
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
#### 轮询 vs 推送怎么选
|
|
79
|
-
|
|
80
|
-
| | `dingtalk_group_message` | `dingtalk_stream` | `dingtalk_event` |
|
|
81
|
-
| --- | --- | --- | --- |
|
|
82
|
-
| 是否需要机器人 | 不需要 | 需要 | 不需要(个人身份) |
|
|
83
|
-
| 触发条件 | 会话内所有消息 | 必须 @机器人 | 会话内所有消息 |
|
|
84
|
-
| 单聊 | 不支持 | 支持 | 不支持(kind 仅 group / all-group)|
|
|
85
|
-
| 实时性 | 轮询间隔(秒级) | 实时 | 实时 |
|
|
86
|
-
|
|
87
|
-
#### 设计期必须确认的通道约束
|
|
88
|
-
|
|
89
|
-
1. **企业内机器人可能要等管理员审批。** 用户等不了时唯一替代是「轮询入站 + 自定义机器人出站」,触发方式从「@ 才答」变成「不 @ 也答」。开通流程见交付包 `references/bot-provisioning.md`。
|
|
90
|
-
2. **外部群加不进企业内机器人**(报 `300001`),需允许不同群走不同通道。
|
|
91
|
-
3. **独占长连接**:同一份凭据同时只允许一个进程连着,不要多实例并行。
|
|
92
|
-
4. **出站 @人 取决于通道**:`session` 与 webhook 能 @人,机器人 API 不能。
|
|
93
|
-
|
|
94
|
-
### 4. `dingtalk_event` — 个人身份事件长连接(dws event)
|
|
95
|
-
|
|
96
|
-
以当前 dws 登录用户身份建立事件长连接,实时接收目标群的全部消息,无轮询延迟;部署机上需已登录 dws(`dws auth login`)。
|
|
97
|
-
|
|
98
|
-
```yaml
|
|
99
|
-
- name: "群消息监听"
|
|
100
|
-
type: dingtalk_event
|
|
101
|
-
handler: message_triage_handler
|
|
102
|
-
config:
|
|
103
|
-
kind: all-group # 缺省 group
|
|
104
|
-
conversation_ids: "${globalVar.group_pull_list}" # 也可内联 ["cidXXX=="]
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
- **`conversation_ids`** 语义与其他消息源一致(内联数组 / 运行时引用 / 三档语义)。
|
|
108
|
-
- 长连接无轮询:**不配 `poll_interval_ms`**。
|
|
109
|
-
- 媒体图片与轮询源同构处理(`image_mode`,缺省 download)。
|
|
110
|
-
|
|
111
|
-
**`kind` 选形态**(缺省 `group`;at-me / sender / all-direct 预留扩展):
|
|
112
|
-
|
|
113
|
-
| | `group` | `all-group` |
|
|
114
|
-
| --- | --- | --- |
|
|
115
|
-
| 进程模型 | 每群一个监听子进程 | 单进程监听账号全部群 |
|
|
116
|
-
| `conversation_ids` | 订阅目标 | 客户端白名单(空名单 = 丢弃全部,**不是**放行全部)|
|
|
117
|
-
| 30 群内存(实测)| 约 1.2 GB,O(N) | 约 71 MB,O(1) |
|
|
118
|
-
| 群名单热更 | spawn/kill 子进程 | 只改内存名单 |
|
|
119
|
-
| 故障域 | 单群隔离 | 全局(靠指数退避重启兜)|
|
|
120
|
-
| 数据边界 | 仅目标群 | 该账号**全部群**消息流经本进程后被丢弃 |
|
|
121
|
-
|
|
122
|
-
多群(≥ 5)优先 `all-group`,并建议用专用服务账号登录 dws(而非真人账号);
|
|
123
|
-
少群且需故障域隔离时用 `group`。实测数据与权衡见
|
|
124
|
-
`docs/plans/2026-09-03-dingtalk-event-all-group.md`。
|
|
125
|
-
|
|
126
|
-
### 5. `cron_scheduler` — 定时调度
|
|
127
|
-
|
|
128
|
-
`daily_at` / `cron` / `interval_ms` **三者恰选其一**。
|
|
129
|
-
|
|
130
|
-
```yaml
|
|
131
|
-
- name: "每日复盘"
|
|
132
|
-
type: cron_scheduler
|
|
133
|
-
handler: daily_review_handler
|
|
134
|
-
config:
|
|
135
|
-
daily_at: "09:00"
|
|
136
|
-
event_type: daily_review
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### 6. `aitable_record` — AI 表格记录轮询
|
|
140
|
-
|
|
141
|
-
```yaml
|
|
142
|
-
- name: "待沉淀记录监听"
|
|
143
|
-
type: aitable_record
|
|
144
|
-
handler: kb_persist_handler
|
|
145
|
-
config:
|
|
146
|
-
base_id: "bXXXXXXXX"
|
|
147
|
-
table_id: "tblXXXXXXXX"
|
|
148
|
-
watch_mode: both # created(默认)| updated | both
|
|
149
|
-
filter: # ⚠️ 必填
|
|
150
|
-
field: "知识沉淀"
|
|
151
|
-
equals: "待沉淀"
|
|
152
|
-
poll_interval_ms: 300000
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
**⚠️ 必须带 `filter` 或 `filters`。** 无 filter 时每轮全表扫描,数据量涨到几万行后 dws 超时,链路**静默停摆且不报错**。完整规则见下方「筛选条件」节。
|
|
156
|
-
|
|
157
|
-
- 监听**当前 workflow 的 tracker 表** → 不要生成 event_source,tracker 自身轮询即可。
|
|
158
|
-
- 监听**另一个 workflow 的 tracker 表** → 用引用:`source_table: { mode: reference, ref: "workflow:<id>.tracker" }`。
|
|
159
|
-
- `watch_mode`:`created` 只监听新增,`updated` 只监听变更,`both` 两者都。
|
|
160
|
-
- `emit_existing` 默认 `false`:首轮静默建基线,要处理存量才设 `true`。
|
|
161
|
-
|
|
162
|
-
## 筛选条件(`aitable_record` 必读)
|
|
163
|
-
|
|
164
|
-
### 简写 DSL `filter`(首选)
|
|
165
|
-
|
|
166
|
-
```yaml
|
|
167
|
-
# 单条件
|
|
168
|
-
filter:
|
|
169
|
-
field: "知识沉淀"
|
|
170
|
-
equals: "待沉淀"
|
|
171
|
-
|
|
172
|
-
# equals 为数组 → 命中任一(OR)
|
|
173
|
-
filter:
|
|
174
|
-
field: "状态"
|
|
175
|
-
equals: ["待处理", "处理中"]
|
|
176
|
-
|
|
177
|
-
# 数组 → 多条件 AND
|
|
178
|
-
filter:
|
|
179
|
-
- field: "状态"
|
|
180
|
-
equals: "待处理"
|
|
181
|
-
- field: "优先级"
|
|
182
|
-
equals: ["P0-紧急", "P1-高"]
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
### 原始 `filters`(仅简写表达不了时用)
|
|
186
|
-
|
|
187
|
-
```yaml
|
|
188
|
-
filters:
|
|
189
|
-
operator: and
|
|
190
|
-
operands:
|
|
191
|
-
- operator: any_of
|
|
192
|
-
operands: ["状态", ["待处理", "处理中"]]
|
|
193
|
-
- operator: neq
|
|
194
|
-
operands: ["负责人", ""]
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
两者同时存在时**以 `filters` 为准**。
|
|
198
|
-
|
|
199
|
-
### 性能铁律
|
|
200
|
-
|
|
201
|
-
框架自动把 `filter.field` 字段名翻译成 fieldId 走快路径。因此 `filter.field` **必须与 `field_definitions` 里声明的 `name` 完全一致**(含中文、空格、大小写),拼错不会报错,只会退回慢路径然后超时。
|
|
202
|
-
|
|
203
|
-
### 自查
|
|
204
|
-
|
|
205
|
-
产出 `aitable_record` 前确认:写了 filter、字段名真实存在、`watch_mode` 匹配业务时机、`emit_existing` 与存量处理结论一致。
|
|
206
|
-
|
|
207
|
-
## Config Surface
|
|
208
|
-
|
|
209
|
-
`config` 放驱动层配置(监听哪个群/表、触发时机),`handler_config` 放 handler 业务配置(昵称、复盘表引用)。详见 `config-surface.md`。
|
|
210
|
-
|
|
211
|
-
## record_policy
|
|
212
|
-
|
|
213
|
-
`eager`(默认)每事件建行,`on_demand` 配合 recipe 返回 `tracker: false` 实现透传。详见 `workflow-yml.md §record_policy`。
|
|
214
|
-
|
|
215
|
-
## 跨 workflow 引用
|
|
216
|
-
|
|
217
|
-
详见 `multi-workflow.md §跨-workflow-引用`。
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|