@amaster.ai/pi-lark 0.1.10 → 0.1.12

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.
Files changed (68) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-approval/SKILL.md +2 -2
  3. package/skills/lark-approval/references/lark-approval-instances-initiated.md +5 -0
  4. package/skills/lark-approval/references/lark-approval-tasks-add-sign.md +68 -20
  5. package/skills/lark-approval/references/lark-approval-tasks-query.md +5 -0
  6. package/skills/lark-base/SKILL.md +108 -5
  7. package/skills/lark-base/references/lark-base-data-query.md +2 -6
  8. package/skills/lark-base/references/lark-base-field-extension.md +170 -0
  9. package/skills/lark-base/references/lark-base-field-lookup.md +1 -1
  10. package/skills/lark-base/references/lark-base-filter-condition.md +32 -5
  11. package/skills/lark-base/references/lark-base-form-detail.md +1 -1
  12. package/skills/lark-base/references/lark-base-form-submit.md +2 -2
  13. package/skills/lark-base/references/lark-base-record-history-list.md +1 -1
  14. package/skills/lark-base/references/lark-base-record-query-and-analysis-sop.md +95 -205
  15. package/skills/lark-base/references/lark-base-template-center.md +5 -1
  16. package/skills/lark-calendar/SKILL.md +6 -0
  17. package/skills/lark-calendar/references/lark-calendar-join-event.md +43 -0
  18. package/skills/lark-drive/references/lark-drive-member-remove.md +2 -1
  19. package/skills/lark-im/SKILL.md +15 -1
  20. package/skills/lark-im/references/lark-im-messages-edit.md +89 -0
  21. package/skills/lark-im/references/lark-im-messages-mget.md +8 -0
  22. package/skills/lark-im/references/lark-im-messages-reply.md +2 -0
  23. package/skills/lark-im/references/lark-im-messages-send.md +6 -2
  24. package/skills/lark-markdown/SKILL.md +1 -1
  25. package/skills/lark-meeting/SKILL.md +6 -2
  26. package/skills/lark-meeting/references/lark-minutes-summary.md +1 -0
  27. package/skills/lark-meeting/references/lark-minutes-todo.md +39 -1
  28. package/skills/lark-meeting/references/lark-minutes-upload.md +6 -0
  29. package/skills/lark-meeting/references/lark-vc-agent-meeting-end.md +26 -0
  30. package/skills/lark-meeting/references/lark-vc-agent-meeting-invite.md +32 -0
  31. package/skills/lark-meeting/references/lark-vc-agent-meeting-join.md +8 -2
  32. package/skills/lark-meeting/references/lark-vc-meeting-countdown.md +103 -0
  33. package/skills/lark-meeting/references/lark-vc-meeting-events.md +1 -0
  34. package/skills/lark-meeting/references/lark-vc-meeting-screenshot.md +34 -0
  35. package/skills/lark-meeting/scenes/create-and-edit-minutes.md +25 -3
  36. package/skills/lark-meeting/scenes/live-meeting-attend.md +63 -6
  37. package/skills/lark-meeting/scenes/live-meeting-interact.md +32 -3
  38. package/skills/lark-sheets/SKILL.md +76 -60
  39. package/skills/lark-sheets/references/lark-sheets-batch-update.md +83 -14
  40. package/skills/lark-sheets/references/lark-sheets-chart.md +296 -159
  41. package/skills/lark-sheets/references/lark-sheets-conditional-format.md +46 -9
  42. package/skills/lark-sheets/references/lark-sheets-filter.md +1 -1
  43. package/skills/lark-sheets/references/lark-sheets-formula-translation.md +78 -65
  44. package/skills/lark-sheets/references/lark-sheets-formula-verify.md +21 -17
  45. package/skills/lark-sheets/references/lark-sheets-pivot-table.md +2 -1
  46. package/skills/lark-sheets/references/lark-sheets-range-operations.md +1 -1
  47. package/skills/lark-sheets/references/lark-sheets-read-data.md +8 -5
  48. package/skills/lark-sheets/references/lark-sheets-search-replace.md +4 -4
  49. package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +2 -2
  50. package/skills/lark-sheets/references/lark-sheets-sparkline.md +1 -0
  51. package/skills/lark-sheets/references/lark-sheets-styles-put.md +3 -3
  52. package/skills/lark-sheets/references/lark-sheets-visual-standards.md +6 -4
  53. package/skills/lark-sheets/references/lark-sheets-workbook.md +3 -1
  54. package/skills/lark-sheets/references/lark-sheets-write-cells.md +50 -48
  55. package/skills/lark-sheets/scripts/lark_chart_layout_check.py +472 -0
  56. package/skills/lark-slides/references/cli/lark-slides-add-slide.md +6 -6
  57. package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +3 -3
  58. package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +11 -11
  59. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +1 -1
  60. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +2 -2
  61. package/skills/lark-slides/references/workflow/slides-editing.md +11 -11
  62. package/skills/lark-slides/references/xml/slides_xml_schema_definition.xml +2 -0
  63. package/skills/lark-base/references/lark-base-cell-value.md +0 -165
  64. package/skills/lark-base/references/lark-base-data-analysis-pandas.md +0 -93
  65. package/skills/lark-base/references/lark-base-data-analysis-python-stdlib.md +0 -120
  66. package/skills/lark-base/references/lark-base-record-batch-create.md +0 -63
  67. package/skills/lark-base/references/lark-base-record-batch-update.md +0 -57
  68. package/skills/lark-base/references/lark-base-record-query-and-analysis-cloud-sop.md +0 -145
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/pi-lark",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Pi extension for Lark/Feishu workspace — calendar, docs, drive, sheets, tasks, mail and more via lark-cli.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -61,7 +61,7 @@
61
61
  "vitest": "^4.0.0"
62
62
  },
63
63
  "dependencies": {
64
- "@amaster.ai/pi-shared": "0.1.10"
64
+ "@amaster.ai/pi-shared": "0.1.12"
65
65
  },
66
66
  "scripts": {
67
67
  "fetch-skills": "node scripts/fetch-skills.mjs",
@@ -34,7 +34,7 @@ metadata:
34
34
  | 搜可发起定义 | `approvals search` | [`lark-approval-approvals-search.md`](references/lark-approval-approvals-search.md) |
35
35
  | 看审批定义详情/提单前确认表单与流程 | `approvals get` | [`lark-approval-approvals-get.md`](references/lark-approval-approvals-get.md) |
36
36
  | 发起原生审批实例/提交请假审批/提交报销审批/创建审批实例 | `instances create` | [`lark-approval-initiate.md`](references/lark-approval-initiate.md) |
37
- | 查待办/已办 | `tasks query`(`topic`:1待办 2已办 17未读 18已读) | [`lark-approval-tasks-query.md`](references/lark-approval-tasks-query.md) |
37
+ | 查/搜待办、已办 | `tasks query`(`topic`:1待办 2已办 17未读 18已读) | [`lark-approval-tasks-query.md`](references/lark-approval-tasks-query.md) |
38
38
  | 看表单/进度/当前节点 | `instances get` | [`lark-approval-instances-get.md`](references/lark-approval-instances-get.md) |
39
39
  | 同意审批 | `tasks approve` | [`lark-approval-tasks-approve.md`](references/lark-approval-tasks-approve.md) |
40
40
  | 拒绝审批 | `tasks reject` | [`lark-approval-tasks-reject.md`](references/lark-approval-tasks-reject.md) |
@@ -44,7 +44,7 @@ metadata:
44
44
  | 催办审批 | `tasks remind` | [`lark-approval-tasks-remind.md`](references/lark-approval-tasks-remind.md) |
45
45
  | 撤回已发起审批 | `instances cancel` | [`lark-approval-instances-cancel.md`](references/lark-approval-instances-cancel.md) |
46
46
  | 给审批实例追加抄送 | `instances cc` | [`lark-approval-instances-cc.md`](references/lark-approval-instances-cc.md) |
47
- | 按定义查已发起审批 | `instances initiated` | [`lark-approval-instances-initiated.md`](references/lark-approval-instances-initiated.md) |
47
+ | 按定义/关键词查已发起审批 | `instances initiated` | [`lark-approval-instances-initiated.md`](references/lark-approval-instances-initiated.md) |
48
48
 
49
49
  处理链:
50
50
 
@@ -14,6 +14,9 @@ lark-cli approval instances initiated --params '{"page_size":20}' --as user
14
14
  # 只看某个审批定义下我发起的实例
15
15
  lark-cli approval instances initiated --params '{"definition_code":"<DEFINITION_CODE>","page_size":20}' --as user
16
16
 
17
+ # 按关键词搜索我发起的实例
18
+ lark-cli approval instances initiated --params '{"keyword":"测试","page_size":10}' --as user
19
+
17
20
  # 按发起时间范围筛选(秒级时间戳)
18
21
  lark-cli approval instances initiated --params '{"start_timestamp":"<START_SECONDS>","end_timestamp":"<END_SECONDS>","page_size":20}' --as user
19
22
 
@@ -33,6 +36,7 @@ lark-cli approval instances initiated --params '{"page_size":20}' --as user --dr
33
36
  |------|------|------|
34
37
  | `--params '{...}'` | 否 | 查询参数,使用 JSON 传入;不传时使用默认分页与筛选 |
35
38
  | `definition_code` | 否 | 审批定义 Code,用于只查看某个审批定义下我发起的实例 |
39
+ | `keyword` | 否 | 搜索关键词;非空时走搜索链路,空或仅空格时保持普通列表链路 |
36
40
  | `start_timestamp` | 否 | 按发起时间筛选,时间范围开始值,秒级时间戳 |
37
41
  | `end_timestamp` | 否 | 按发起时间筛选,时间范围结束值,秒级时间戳 |
38
42
  | `locale` | 否 | 返回语言:`zh-CN`、`en-US`、`ja-JP` |
@@ -106,6 +110,7 @@ lark-cli approval instances initiated \
106
110
 
107
111
  - **这是定位“我发起的审批实例”的首选命令**:如果你的目标是撤回、抄送、查看某个已发起审批,优先从这里拿 `instance_code`。
108
112
  - **优先用 `definition_code` 缩小范围**:当你已知审批定义时,先筛掉无关实例,可显著提升可读性。
113
+ - **需要搜索时传入 `keyword`**:搜索排序和普通列表排序不同,按搜索服务结果为准。
109
114
  - **按时间排查时使用 `start_timestamp` / `end_timestamp`**:这两个值都是秒级时间戳,用于按发起时间缩小结果范围。
110
115
  - **结果很多时优先 `--format table`**:适合人工快速浏览。
111
116
  - **`count` 只在第一页返回**:做分页处理时不要假设后续页还会带总数。
@@ -4,38 +4,81 @@
4
4
  给一个审批任务加签(用户级写操作)。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`,确认目标任务后,再提供被加签人的用户 ID、加签方式等参数执行加签。
5
5
 
6
6
  > [!CAUTION]
7
- > 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览;真正执行时,如果用户已明确要对该审批任务加签且目标任务、加签对象、加签方式都无误,再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。
7
+ > 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览;真正执行时,如果用户已明确要对该审批任务加签且目标任务、加签对象、加签方式都无误,再带 `--yes` 运行。用户已明确要求立即执行且列清本轮的加签、转交对象时,该确认覆盖这两个已明确的动作,不要逐条重复询问;不要在未获用户明确同意时静默追加 `--yes`。
8
8
 
9
9
  需要的 scopes: ["approval:task:write"]
10
10
 
11
+ ## 先选择加签类型
12
+
13
+ `add_sign_type` 会影响当前用户的审批任务是否继续可操作,不能只按示例顺序或任意选择:
14
+
15
+ | 用户意图 | `add_sign_type` | 处理方式 |
16
+ |----------|-----------------|----------|
17
+ | 明确说前加签 / “先让某人审核,我再审” | `1` | 前加签,并按用户要求选择 `approval_method` |
18
+ | 明确说后加签 / “我处理完,再让某人审核” | `2` | 后加签,并按用户要求选择 `approval_method` |
19
+ | “拉进来一起审” / “共同审核” / “一并确认” | `3` | 并加签;不传 `approval_method` |
20
+ | 同一请求要求先加签、再转交当前用户这一环 | `3` | **必须并加签**;加签成功后再转交当前任务 |
21
+
22
+ 前加签或后加签可能推动当前用户的 task 流转,使原 `task_id` 不再支持后续转交。因此,“先加签,再把我这一环转交给其他人”不能使用前加签或后加签;先以 `add_sign_type: 3` 并加签,确认 `tasks add_sign` 成功后,再使用同一组 `instance_code` + `task_id` 执行 `tasks transfer`。
23
+
24
+ 只有在上下文完全无法判断是哪种加签方式、且不同选择会改变审批流程时,才向用户二次询问。用户已经说“一起审”或已经要求“加签后转交当前环节”时,信息足够,不要再询问加签类型。
25
+
26
+ ## 再选择 approval_method
27
+
28
+ 只有前加签、后加签需要 `approval_method`;并加签不传。先遵循用户明确指定的审批方式;用户未指定时,按人数和语义选择:
29
+
30
+ | 加签人数与语义 | `approval_method` | 处理方式 |
31
+ |----------------|-------------------|----------|
32
+ | 只有 1 名加签人 | `1` | 使用或签;单人时或签、会签的实际效果相同,不再询问 |
33
+ | 多人,明确“任一人审批即可” / “一人通过即可” | `1` | 或签;任一加签人完成审批即可 |
34
+ | 多人,明确“所有人都要审批” / “全部确认” | `2` | 会签;所有加签人都必须完成审批 |
35
+ | 多人,明确“依次审批” / “先 A 后 B” | `3` | 依次审批;每个人按 `add_sign_user_ids` 的数组顺序逐一审批 |
36
+ | 多人,无法从上下文推断 | 不预设 | 询问用户选择或签、会签或依次审批,并说明三者效果 |
37
+
38
+ 依次审批必须保留用户给出的人员顺序。如果已经确定要依次审批,但上下文无法判断先后顺序,先询问人员顺序,再构造 `add_sign_user_ids`;不要自行排序。
39
+
11
40
  ## 命令
12
41
 
13
42
  ```bash
14
- # 先预览请求,不实际执行
43
+ # 先预览并加签请求,不实际执行
15
44
  lark-cli approval tasks add_sign \
16
- --data '{"instance_code":"<INSTANCE_CODE>","task_id":"<TASK_ID>","add_sign_type":1,"add_sign_user_ids":["ou_xxx"],"approval_method":1,"comment":"前加签给财务复核"}' \
45
+ --data '{"instance_code":"<INSTANCE_CODE>","task_id":"<TASK_ID>","add_sign_type":3,"add_sign_user_ids":["ou_xxx"],"comment":"请项目 owner 一起审核"}' \
17
46
  --params '{"user_id_type":"open_id"}' \
18
47
  --as user \
19
48
  --dry-run
20
49
 
21
- # 前加签(需要 approval_method)
50
+ # 单人前加签:未指定方式时使用或签
22
51
  lark-cli approval tasks add_sign \
23
52
  --data '{"instance_code":"<INSTANCE_CODE>","task_id":"<TASK_ID>","add_sign_type":1,"add_sign_user_ids":["ou_xxx"],"approval_method":1,"comment":"请先补充审核"}' \
24
53
  --params '{"user_id_type":"open_id"}' \
25
54
  --as user \
26
55
  --yes
27
56
 
28
- # 后加签(需要 approval_method)
57
+ # 多人后加签:所有人都需要审批,使用会签
58
+ lark-cli approval tasks add_sign \
59
+ --data '{"instance_code":"<INSTANCE_CODE>","task_id":"<TASK_ID>","add_sign_type":2,"add_sign_user_ids":["ou_xxx","ou_yyy"],"approval_method":2,"comment":"当前审批完成后请两位都完成审核"}' \
60
+ --params '{"user_id_type":"open_id"}' \
61
+ --as user \
62
+ --yes
63
+
64
+ # 多人前加签:按数组中的人员顺序依次审批
29
65
  lark-cli approval tasks add_sign \
30
- --data '{"instance_code":"<INSTANCE_CODE>","task_id":"<TASK_ID>","add_sign_type":2,"add_sign_user_ids":["ou_xxx","ou_yyy"],"approval_method":2,"comment":"当前审批完成后请两位继续审核"}' \
66
+ --data '{"instance_code":"<INSTANCE_CODE>","task_id":"<TASK_ID>","add_sign_type":1,"add_sign_user_ids":["ou_first","ou_second"],"approval_method":3,"comment":"请先由第一位审核,再由第二位审核"}' \
31
67
  --params '{"user_id_type":"open_id"}' \
32
68
  --as user \
33
69
  --yes
34
70
 
35
- # 并加签(常见场景可不传 approval_method)
71
+ # 同一请求要求先加签、再转交:必须并加签;两条命令按顺序执行
36
72
  lark-cli approval tasks add_sign \
37
- --data '{"instance_code":"<INSTANCE_CODE>","task_id":"<TASK_ID>","add_sign_type":3,"add_sign_user_ids":["123456789"],"comment":"并加签给项目 owner"}' \
38
- --params '{"user_id_type":"user_id"}' \
73
+ --data '{"instance_code":"<INSTANCE_CODE>","task_id":"<TASK_ID>","add_sign_type":3,"add_sign_user_ids":["ou_reviewer"],"comment":"请一起审核"}' \
74
+ --params '{"user_id_type":"open_id"}' \
75
+ --as user \
76
+ --yes
77
+
78
+ # 仅在上面的 add_sign 成功后,转交同一当前任务
79
+ lark-cli approval tasks transfer \
80
+ --data '{"instance_code":"<INSTANCE_CODE>","task_id":"<TASK_ID>","transfer_user_id":"ou_transferee","comment":"出差期间请代为处理"}' \
81
+ --params '{"user_id_type":"open_id"}' \
39
82
  --as user \
40
83
  --yes
41
84
 
@@ -56,7 +99,7 @@ lark-cli approval tasks add_sign \
56
99
  | `task_id` | 是 | 审批任务 ID;通常先通过 `tasks query` 获取 |
57
100
  | `add_sign_type` | 是 | 加签类型:`1` 前加签、`2` 后加签、`3` 并加签 |
58
101
  | `add_sign_user_ids` | 是 | 被加签人 ID 数组;需要和 `user_id_type` 保持一致 |
59
- | `approval_method` | 否 | 审批方式:`1` 或签、`2` 会签、`3` 依次审批;**仅在前加签、后加签时需要填写** |
102
+ | `approval_method` | 否 | 审批方式:`1` 或签、`2` 会签、`3` 依次审批;**仅在前加签、后加签时需要填写**。单人未指定时使用 `1`;多人无法从语义推断时先询问用户 |
60
103
  | `comment` | 否 | 审批意见或加签说明,例如 `前加签给财务复核`、`请项目 owner 一并确认` |
61
104
  | `--params '{"user_id_type":"..."}'` | 否 | 查询参数 JSON;用于声明 `add_sign_user_ids` 内用户 ID 的类型 |
62
105
  | `user_id_type` | 否 | 用户 ID 类型:`user_id`、`union_id`、`open_id`;未显式指定时要特别确认被加签人的 ID 类型 |
@@ -69,19 +112,21 @@ lark-cli approval tasks add_sign \
69
112
 
70
113
  ### add_sign_type
71
114
 
72
- | 值 | 含义 |
73
- |----|------|
74
- | `1` | 前加签 |
75
- | `2` | 后加签 |
76
- | `3` | 并加签 |
115
+ | 值 | 含义 | 对当前任务的影响 |
116
+ |----|------|------------------|
117
+ | `1` | 前加签 | 在当前审批前插入审批人,可能推动当前用户的 task 流转 |
118
+ | `2` | 后加签 | 在当前审批后追加审批人,可能推动当前用户的 task 流转 |
119
+ | `3` | 并加签 | 增加并行审批人;需要随后转交当前环节时使用 |
77
120
 
78
121
  ### approval_method
79
122
 
80
- | 值 | 含义 | 适用场景 |
123
+ 仅适用于前加签、后加签;并加签不传。
124
+
125
+ | 值 | 含义 | 完成条件 |
81
126
  |----|------|----------|
82
- | `1` | 或签 | 前加签 / 后加签 |
83
- | `2` | 会签 | 前加签 / 后加签 |
84
- | `3` | 依次审批 | 前加签 / 后加签 |
127
+ | `1` | 或签 | 任一加签人完成审批即可 |
128
+ | `2` | 会签 | 所有加签人都必须完成审批 |
129
+ | `3` | 依次审批 | 所有加签人按 `add_sign_user_ids` 数组顺序逐一审批 |
85
130
 
86
131
  ## 典型前置步骤
87
132
 
@@ -113,7 +158,10 @@ lark-cli approval instances get --params '{"instance_code":"<INSTANCE_CODE>"}' -
113
158
  - **`add_sign_user_ids` 与 `user_id_type` 必须匹配**:例如传 open_id 就把 `user_id_type` 设为 `open_id`;不要混用。
114
159
  - **优先显式传 `user_id_type`**:这样 agent 更容易判断参数含义,也能减少 ID 类型不匹配带来的失败。
115
160
  - **`add_sign_type` 要和业务意图一致**:前加签是在当前审批前插入审批人,后加签是在当前审批后追加审批人,并加签则是增加并行审批人。
116
- - **前加签 / 后加签要补 `approval_method`**:不要遗漏,否则请求可能无法准确表达审批方式。
161
+ - **加签后还要转交当前环节时必须并加签**:使用 `add_sign_type: 3`,等待加签成功后再用同一组任务参数转交;不要用前加签或后加签导致当前 task 提前流转。
162
+ - **无法推断类型时才询问**:如果用户没有说明先后或并行关系,且后续动作也不能帮助判断,再请用户选择;不要对“一起审”或“加签后转交”重复提问。
163
+ - **前加签 / 后加签要补 `approval_method`**:单人未指定时使用或签;多人优先按语义选择,无法推断时询问用户,不要静默默认。
164
+ - **依次审批保留人员顺序**:按用户指定的先后顺序构造 `add_sign_user_ids`;顺序不明确时先询问,不要自行排序。
117
165
  - **优先从 `tasks query` 的待办列表拿任务参数**:尤其是 `topic=1` 的待办审批,最适合作为 add_sign 的输入来源。
118
166
  - **先检查是否支持 API 操作**:如果 `tasks[].support_api_operate` 为 `false`,说明该任务可能不支持通过 API 执行处理动作,加签前应谨慎验证。
119
167
  - **`comment` 建议写明加签原因**:例如 `增加财务复核`、`增加项目 owner 并行确认`,方便相关人员理解上下文。
@@ -14,6 +14,9 @@ lark-cli approval tasks query --params '{"topic":"1"}' --as user
14
14
  # 查询已办审批
15
15
  lark-cli approval tasks query --params '{"topic":"2"}' --as user
16
16
 
17
+ # 按关键词搜索任务列表
18
+ lark-cli approval tasks query --params '{"topic":"1","keyword":"测试","page_size":10}' --as user
19
+
17
20
  # 按任务时间范围筛选(秒级时间戳)
18
21
  lark-cli approval tasks query --params '{"topic":"1","start_timestamp":"<START_SECONDS>","end_timestamp":"<END_SECONDS>"}' --as user
19
22
 
@@ -31,6 +34,7 @@ lark-cli approval tasks query --params '{"topic":"1"}' --format table --as user
31
34
  | `--params '{"topic":"..."}'` | 是 | 查询参数,使用 JSON 传入 |
32
35
  | `topic` | 是 | 任务分组主题,见下方“topic 枚举” |
33
36
  | `definition_code` | 否 | 审批定义 Code,用于仅查询某个审批定义下的任务 |
37
+ | `keyword` | 否 | 搜索关键词;非空时走搜索链路,空或仅空格时保持普通列表链路 |
34
38
  | `start_timestamp` | 否 | 按任务时间筛选,时间范围开始值,秒级时间戳 |
35
39
  | `end_timestamp` | 否 | 按任务时间筛选,时间范围结束值,秒级时间戳 |
36
40
  | `locale` | 否 | 返回语言:`zh-CN`、`en-US`、`ja-JP` |
@@ -80,6 +84,7 @@ lark-cli approval tasks query --params '{"topic":"1"}' --format table --as user
80
84
 
81
85
  - 常见处理链:先用 `tasks query` 拿到 `task_id` 和 `instance_code`,若用户需要查看详情、当前节点、表单内容、流程进度等内容,则调用 `instances get` 查看详情,最后执行 `tasks approve` / `tasks reject` / `tasks transfer` / `tasks add_sign` / `tasks rollback`。
82
86
  - 如果你只想看“已发起的审批实例”,使用 `instances initiated`;`tasks query` 更适合围绕“任务分组”来拉取列表。
87
+ - 需要搜索任务标题、摘要或相关内容时传入 `keyword`;搜索排序和普通列表排序不同,按搜索服务结果为准。
83
88
  - 按时间排查任务时使用 `start_timestamp` / `end_timestamp` 缩小范围;这两个值都是秒级时间戳。
84
89
  - 需要继续翻页时,直接把上一次返回的 `page_token` 放回 `--params`。
85
90
  - 当结果量较大时,优先使用 `--format table` 提升可读性。
@@ -72,7 +72,7 @@ Block 的 `id` 按类型直接作为对应模块坐标:
72
72
 
73
73
  ## Table Block(The Core)
74
74
 
75
- Table 本身是 Base Block,也是 Base 的核心数据存储层;Field、Record、View 和 Form 是 Table 内部对象,不是 Base Block。业务数据查询、写入、关联、统计和分析都从 Table 开始;标准资源读取链路是 `+table-list → +field-list → +record-list` / `+record-search`,多表的 `+field-list` 可以并发执行;记录相关任务读取 [Record 查询与分析 SOP](references/lark-base-record-query-and-analysis-sop.md)。
75
+ Table 本身是 Base Block,也是 Base 的核心数据存储层;Field、Record、View 和 Form 是 Table 内部对象,不是 Base Block。业务数据查询、写入、关联、统计和分析都从 Table 开始。先用 `+table-list` 定位 Table;字段名和目标已知的普通读取可直接进入 Record 命令,只有写入、筛选或关联等依赖字段类型/schema 的任务才补 `+field-list`。多表的 `+field-list` 可以并发执行。基础的 Record / CellValue 读写直接按下方路径;reference 只承载高级分析、完整协议和边界细节。
76
76
 
77
77
  **读取 Table:** `+table-list` 定位表,`+table-get` 读取详情。Table 专属复制使用 `+table-copy`,异步状态用 `+table-copy-status`;schema 和 records 由下方内部对象操作。
78
78
 
@@ -82,17 +82,120 @@ Table 下的大多数更新通过异步链路生效,接口成功返回后立
82
82
 
83
83
  Field 定义列 schema。`field_id` 是稳定列标识,`name` 是可修改的展示名称;Formula、Lookup、Link、Select 等属于 Field 类型或能力。
84
84
 
85
- **读取 Field:** `+field-list` / `+field-get` / `+field-search-options`。**写入 Field:** 已有 Table 中创建多个字段时,优先向一次 `+field-create --json` 传字段对象数组;单字段更新和删除用 `+field-update` / `+field-delete`。创建和更新分别读取 [field-create](references/lark-base-field-create.md) / [field-update](references/lark-base-field-update.md),由命令文档继续路由 Field JSON、Formula 和 Lookup 协议。
85
+ **读取 Field:** `+field-list` / `+field-get` / `+field-search-options`。**写入 Field:** 已有 Table 中创建多个字段时,优先向一次 `+field-create --json` 传字段对象数组;单字段更新和删除用 `+field-update` / `+field-delete`。创建和更新分别读取 [field-create](references/lark-base-field-create.md) / [field-update](references/lark-base-field-update.md),由命令文档继续路由 Field JSON、Formula 和 Lookup 协议。`字段插件` 用于扩展基础字段能力:按同一行其他字段内容触发 LLM 生成,并写回已有目标字段;当前已确认目标字段支持文本、单选、数字,配置或触发前先读 [field-extension](references/lark-base-field-extension.md)。
86
86
 
87
87
  ### Record
88
88
 
89
89
  Record 是 Table 中的一行数据,包含该记录在各个 Field 下的 CellValue。系统 `record_id` 是表内稳定、非空且唯一的主键,Table 的主字段只是展示字段。
90
90
 
91
- **读取 Record:** 记录预览、筛选、匹配、统计、聚合、TopN、多表或语义分析,以及写前定位记录和写后验收,都必须先完整读取 [Record 查询与分析 SOP](references/lark-base-record-query-and-analysis-sop.md),并由该 SOP 选择具体命令。**写入 Record:** 优先使用 [batch create](references/lark-base-record-batch-create.md) / [batch update](references/lark-base-record-batch-update.md) 创建或更新一条或多条记录,按其文档中的 CellValue 协议提交字段值。
91
+ #### 1. 读取记录或单元格
92
+
93
+ - 已知若干个 `record_id`:`+record-get --record-id <id1> --record-id <id2>`
94
+ - 关键词搜索:`+record-search --keyword <text> --search-field <field>`;至少指定一个搜索字段。
95
+ - 其余读取:`+record-list`;结构化条件和排序分别用 `--filter-json` / `--sort-json`。
96
+
97
+ 行数较大、需要服务端谓词下推时,`--filter-json` 使用 tuple condition;最常用的筛选与完整日期范围写法:
98
+
99
+ ```jsonc
100
+ {
101
+ "logic": "and", // 全部条件成立;任一条件成立改为 "or"
102
+ "conditions": [
103
+ ["状态", "intersects", ["进行中", "暂停"]], // Select 命中任一选项
104
+ ["标题", "intersects", "urgent"], // 文本包含
105
+ ["备注", "non_empty"], // 非空;判断为空改用 "empty",两者都不传 value
106
+ ["金额", ">=", 100], // 数字比较;支持 ==、!=、>、>=、<、<=
107
+ ["关联项目", "intersects", [{ "id": "recxxx" }]], // Link 包含目标记录
108
+ ["业务日期", "==", "ExactDate(2026-08-07)"], // 具体一天:按 Base 时区匹配 2026-08-07 当天
109
+ ["发生时间", ">", "ExactDate(2024-01-31 23:59:59.999)"], // 日期不支持 >=;用 > 前一天最后一毫秒表达含当天的下界
110
+ ["发生时间", "<", "ExactDate(2024-03-01 00:00:00)"] // 2024 年 2 月范围上界:小于 3 月 1 日零点
111
+ ]
112
+ }
113
+ ```
114
+
115
+ 完整操作符和各字段取值结构读取 [Filter 条件结构](references/lark-base-filter-condition.md)。
116
+
117
+ 所有读取都重复传 `--field-id` 做最小字段投影,并统一写入 NDJSON artifact:`--format ndjson --output <path>.ndjson`。每行是一条 Record JSON,stdout 摘要包含 `records_count` 和 `has_more` 用于分页判断。
118
+
119
+ ```bash
120
+ # Example: 行数较大时先筛选 Status 包含 Doing 的记录,再导出 20 条作为局部预览
121
+ lark-cli base +record-list \
122
+ --base-token <base_token> --table-id <table_id> \
123
+ --filter-json '{"logic":"and","conditions":[["Status","intersects",["Doing"]]]}' \
124
+ --field-id Name --field-id Status --field-id Score --limit 20 \
125
+ --format ndjson --output ./records-preview.ndjson --as user
126
+
127
+ PREVIEW_ROWS=5
128
+ head -n "$PREVIEW_ROWS" ./records-preview.ndjson
129
+ tail -n "$PREVIEW_ROWS" ./records-preview.ndjson
130
+ ```
131
+
132
+ 预计记录数少于 500 行时,建议不做谓词下推,直接拉取到本地用 jq 或 Python 处理;行数较大时可用 `--filter-json` 下推可表达的条件,正则、派生等无法下推的条件继续在本地处理。
133
+
134
+ ```bash
135
+ # jq:对服务端筛选结果追加名称格式筛选,再投影必要字段
136
+ jq -c 'select((.Name // "") | test("^Task-[0-9]+$")) | {record_id, Name}' ./records-preview.ndjson
137
+
138
+ # Python:按行读取并做简单汇总
139
+ python3 - <<'PY'
140
+ import json
141
+
142
+ with open("records-preview.ndjson", encoding="utf-8") as stream:
143
+ rows = (json.loads(line) for line in stream if line.strip())
144
+ print(sum((row.get("Score") or 0) for row in rows))
145
+ PY
146
+ ```
147
+
148
+ `--limit` 的缺省值是 2000,最大值是 2000,通常无需手动指定 limit 参数;支持 `--offset` 参数;只有 `has_more=false` 且查询范围符合问题时,才能当作完整结果。大表完整读取、View 范围读取、复杂 JOIN、集合/多值、时序、语义或专业统计分析时,读取 [Record 查询与分析 SOP](references/lark-base-record-query-and-analysis-sop.md)。
149
+
150
+ #### 2. 新增记录或更新记录单元格
151
+
152
+ 一条 Record 是 `{字段名或 field_id: CellValue}`,常见 CellValue:
153
+
154
+ ```jsonc
155
+ {
156
+ "标题": "Created from shortcut", // text: string
157
+ "官网": "[官网](https://example.com)", // text(url): 裸 URL 或 Markdown link
158
+ "联系电话": "13800000000", // text(phone): 合法电话号码字符串
159
+ "邮箱": "owner@example.com", // text(email): 合法邮箱字符串
160
+ "单选": ["Todo"], // select: array<string>;单选时数组最多一个值;
161
+ "标签": ["高优", "外部依赖"], // 多选 select: array<string>;必须是当前字段存在的选项;
162
+ "工时": 8, // number: double,不经过格式化的纯数字
163
+ "带时区时间": "2026-03-24T10:00:00+08:00", // datetime:带时区,遵循传入的时区
164
+ "不带时区时间": "2026-03-24 10:00", // datetime:不带时区,自动按当前 Base 时区转换
165
+ "毫秒时间戳": 1774317600000, // datetime:也支持 Unix 毫秒时间戳
166
+ "已完成": false, // checkbox: boolean
167
+ "负责人": [{ "id": "ou_123" }], // user(multiple=false): 数组最多一个元素
168
+ "协作人": [{ "id": "ou_123" }, { "id": "ou_456" }], // user(multiple=true): 数组可包含多个元素
169
+ "群聊": [{ "id": "oc_123" }, { "id": "oc_456" }], // group_chat(multiple=true)
170
+ "关联任务": [{ "id": "rec456" }], // link: array<{id}>,record_id 来自目标表
171
+ "坐标": { "lng": 116.397428, "lat": 39.90923 }, // location: {lng,lat}
172
+ "清空": null, // 清空单元格,传 null
173
+ "清空数组": [] // 清空数组类单元格,空数组和 null 都可以
174
+ }
175
+ ```
176
+
177
+ 附件使用专用 shortcut 上传、下载或移除。created_at, updated_at, created_by, updated_by, auto_number, formula, lookup 类型字段只读,若误写入单元格会返回 `ignored_fields` 表示这些字段被静默过滤,其余字段正常写入。
178
+
179
+ ```bash
180
+ # 新增:成功时返回 record_id_list
181
+ lark-cli base +record-batch-create \
182
+ --base-token <base_token> --table-id <table_id> \
183
+ --json '{"create_records":[{"Name":"Task A","Status":["Todo"]},{"Name":"Task B","Score":20}]}' --as user
184
+
185
+ # 更新:每条记录只提交要改变的字段
186
+ lark-cli base +record-batch-update \
187
+ --base-token <base_token> --table-id <table_id> \
188
+ --json '{"update_records":{"<record_id_a>":{"Status":["Done"]},"<record_id_b>":{"Score":100}}}' --as user
189
+ ```
190
+
191
+ 大 payload 可用脚本生成 json 后用 `--json @file.json`。单批最多 200 条,超过后分批,同一 Table 串行写入;并行可能触发 `1254291` 并发冲突错误。
92
192
 
93
- **Record 生命周期:** `+record-delete` 删除记录;`+record-share-link-create` 创建记录分享链接;`+record-history-list` 查询单条记录的变更事件,读取 [历史记录协议](references/lark-base-record-history-list.md)。附件使用 `+record-upload-attachment` / `+record-download-attachment` / `+record-remove-attachment` 操作。
193
+ #### 3. 其他 Record 操作
94
194
 
95
- Record 中的 Select、人员、群组、Link、附件的 CellValue 通常是多值;Link 的目标 `table_id` 来自 Field schema,CellValue 中的 `id` 对应目标表 `record_id`。
195
+ - `+record-delete --base-token <base_token> --table-id <table_id> --record-id <id1> --record-id <id2>` 删除若干个记录
196
+ - `+record-share-link-create --base-token <base_token> --table-id <table_id> --record-id <id1> --record-id <id2>` 创建记录分享链接
197
+ - `+record-history-list` 查询单条记录的变更事件,读取 [历史记录协议](references/lark-base-record-history-list.md)
198
+ - 附件必须使用 `+record-upload-attachment` / `+record-download-attachment` / `+record-remove-attachment` 操作。
96
199
 
97
200
  ### View
98
201
 
@@ -3,8 +3,6 @@
3
3
 
4
4
  > **前置路由**: [Record 查询与分析 SOP](lark-base-record-query-and-analysis-sop.md) | **认证或授权问题**: [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)
5
5
 
6
- 本文档合并常用 fewshot 与完整 DSL 协议。只有 [Record 查询与分析 SOP](lark-base-record-query-and-analysis-sop.md) 的 Cloud 路径选定 `+data-query` 后才读取,并优先定位与当前查询有关的示例、字段或错误协议。
7
-
8
6
  ## 限制
9
7
 
10
8
  - **权限要求**(按文档类型分流):
@@ -75,7 +73,7 @@ lark-cli base +data-query \
75
73
  | 参数 | 必填 | 说明 |
76
74
  |------------------------|------|------|
77
75
  | `--base-token <token>` | 是 | Base Token(base_token) |
78
- | `--dsl <json>` | 是 | LiteQuery Protocol JSON DSL 查询语句 |
76
+ | `--dsl <json>` | 是 | LiteQuery Protocol JSON DSL 查询语句。注意,本工具 schema 与 record/view 查询的 schema 不同,需要充分阅读本文档后,编写正确的 DSL,避免与其他场景的 DSL 混淆。 |
79
77
 
80
78
  ## 如何从链接中解析参数
81
79
 
@@ -435,7 +433,7 @@ CLI 输出标准信封 `{ok, identity, data}`(失败时为 `{ok:false, identit
435
433
  5. 若候选记录包含 link 字段,提取关联 `record_id` 后到关联表用 `+record-get` 批量读取展示字段。
436
434
  6. 最终回答展示真实业务字段;内部 `record_id` 用于连接或定位。
437
435
 
438
- 不要把 `data-query pagination.limit` 理解为分页扫描;它只限制 Base 云端查询服务返回的聚合结果行数,不支持 offset。需要逐条原始记录时按 Cloud SOP 的 `+record-list` / `+record-search` 回查规则处理。
436
+ 不要把 `data-query pagination.limit` 理解为分页扫描;它只限制 Base 云端查询服务返回的聚合结果行数,不支持 offset。需要逐条原始记录时按 [Record 查询与分析 SOP](lark-base-record-query-and-analysis-sop.md) 的完整读取或回查路径处理。
439
437
 
440
438
  ## 坑点
441
439
 
@@ -453,6 +451,4 @@ CLI 输出标准信封 `{ok, identity, data}`(失败时为 `{ok:false, identit
453
451
 
454
452
  - [lark-base](../SKILL.md) — 多维表格全部命令
455
453
  - [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数
456
- - [Cloud SOP](lark-base-record-query-and-analysis-cloud-sop.md) — Cloud 路径的查询范围、下推、分页、`+record-list` / `+record-search` 回查和关系查询
457
- - [lark-base-cell-value.md](lark-base-cell-value.md) — CellValue 格式规范
458
454
  - [Field Schema](lark-base-field-schema.md) — 字段类型与 JSON 结构
@@ -0,0 +1,170 @@
1
+ # base field-extension
2
+
3
+ 字段插件用于扩展基础字段能力,当同行其他单元格更新时,触发 LLM 推理生成新单元格。当前公开支持的插件 ID 只有 `builtin_llm_completion`,已确认可用于文本、单选、数字字段,让目标字段基于 prompt 和字段引用生成内容,并可手动触发该字段的单元格异步更新任务。
4
+
5
+ 三个命令:
6
+
7
+ - `+field-extension-get`:读取目标字段当前可识别的插件配置。
8
+ - `+field-extension-update`:安装、更新或清空目标字段插件配置。
9
+ - `+field-extension-update-cells`:对已配置字段插件的目标字段发起手动更新任务。
10
+
11
+ ## 何时使用字段插件
12
+
13
+ 用户明确要让某个已有字段根据其他字段自动生成内容、总结、分类、翻译、提取信息,且目标能力可以用 prompt 表达时,使用字段插件。当前已确认的目标字段类型是文本、单选、数字。
14
+
15
+ 字段插件只能建立在已有字段上,不能创建列 schema。新建字段仍使用 `+field-create`;修改字段类型、选项、名称等 schema 属性仍使用 `+field-update`。
16
+
17
+ ## 推荐命令
18
+
19
+ ```bash
20
+ # 读取当前插件配置
21
+ lark-cli base +field-extension-get \
22
+ --base-token <base_token> \
23
+ --table-id <table_id> \
24
+ --field-id <target_field_id> \
25
+ --as user
26
+
27
+ # 安装或更新 LLM Completion 插件
28
+ lark-cli base +field-extension-update \
29
+ --base-token <base_token> \
30
+ --table-id <table_id> \
31
+ --field-id <target_field_id> \
32
+ --json '{"extension_id":"builtin_llm_completion","inputs":{"prompt":[{"type":"text","text":"请根据 "},{"type":"field_ref","field":"需求描述"},{"type":"text","text":" 输出一句简洁结论。"}]}}' \
33
+ --as user \
34
+ --yes
35
+
36
+ # 清空字段插件配置
37
+ lark-cli base +field-extension-update \
38
+ --base-token <base_token> \
39
+ --table-id <table_id> \
40
+ --field-id <target_field_id> \
41
+ --json '{}' \
42
+ --as user \
43
+ --yes
44
+
45
+ # 按视图范围触发整列更新
46
+ lark-cli base +field-extension-update-cells \
47
+ --base-token <base_token> \
48
+ --table-id <table_id> \
49
+ --field-id <target_field_id> \
50
+ --type column \
51
+ --view-id <view_id> \
52
+ --as user \
53
+ --yes
54
+
55
+ # 只更新指定记录
56
+ lark-cli base +field-extension-update-cells \
57
+ --base-token <base_token> \
58
+ --table-id <table_id> \
59
+ --field-id <target_field_id> \
60
+ --type row \
61
+ --record-id <record_id_1> \
62
+ --record-id <record_id_2> \
63
+ --as user \
64
+ --yes
65
+ ```
66
+
67
+ ## 工作流
68
+
69
+ 1. 定位 Base、Table 和目标 Field。目标 Field 是承载插件输出的已有字段,不是 prompt 中被引用的输入字段。
70
+ 2. 用 `+field-extension-get` 读取当前配置。返回 `current_extension=null` 表示未配置、无法识别或存量配置无法转换。
71
+ 3. 构造 `+field-extension-update --json`。安装或更新时传 `extension_id=builtin_llm_completion` 和 `inputs.prompt`;清空时传 `{}`。
72
+ 4. 配置成功后,只有用户明确要立即生成或刷新已有单元格时,才调用 `+field-extension-update-cells` 发起异步生成任务。
73
+ 5. 需要验收结果时,等待任务完成或稍后用记录读取命令抽样查看目标字段单元格;`update_cells` 只返回任务 ID,不直接返回生成结果。
74
+
75
+ ## JSON 结构
76
+
77
+ ### 通用结构
78
+
79
+ `+field-extension-update --json` 的顶层结构是字段插件配置 envelope。不同 `extension_id` 对应不同的 `inputs` 结构;不要把某个插件的 `inputs` 当成所有字段插件的固定结构。
80
+
81
+ | 字段 | 类型 | 说明 |
82
+ |---|---|---|
83
+ | `extension_id` | string | 插件 ID。当前公开只支持 `builtin_llm_completion` |
84
+ | `inputs` | object | 插件配置对象,结构由 `extension_id` 决定 |
85
+
86
+ 清空字段插件配置时传空对象:
87
+
88
+ ```json
89
+ {}
90
+ ```
91
+
92
+ ### `builtin_llm_completion`
93
+
94
+ 当前 `builtin_llm_completion` 用于让已有字段根据 prompt 生成内容。它的 `inputs` 结构如下:
95
+
96
+ | 字段 | 类型 | 说明 |
97
+ |---|---|---|
98
+ | `inputs.prompt` | PromptSegment[] | 有序 prompt 片段数组 |
99
+ | `prompt[].type` | string | `text` 或 `field_ref` |
100
+ | `prompt[].text` | string | `type=text` 时必填 |
101
+ | `prompt[].field` | string | `type=field_ref` 时必填,可传当前表的字段 ID 或字段名 |
102
+
103
+ 安装或更新示例:
104
+
105
+ ```json
106
+ {
107
+ "extension_id": "builtin_llm_completion",
108
+ "inputs": {
109
+ "prompt": [
110
+ {
111
+ "type": "text",
112
+ "text": "请根据 "
113
+ },
114
+ {
115
+ "type": "field_ref",
116
+ "field": "需求描述"
117
+ },
118
+ {
119
+ "type": "text",
120
+ "text": " 输出一句简洁的中文结论。"
121
+ }
122
+ ]
123
+ }
124
+ }
125
+ ```
126
+
127
+ `field_ref` 只能引用当前表中的其他字段,不能引用目标字段自身;附件字段和其他不支持字段不要作为引用字段。
128
+
129
+ ## 更新单元格
130
+
131
+ `+field-extension-update-cells` 有两种范围:
132
+
133
+ 这是异步生成任务,响应只表示任务已创建。单元格越多,生成和写回通常耗时越久;整列更新尤其需要控制范围。
134
+
135
+ | 范围 | 参数 | 语义 |
136
+ |---|---|---|
137
+ | `--type column` | 可选 `--view-id` | 更新目标字段在该视图范围内的单元格;不传 `--view-id` 时后端使用目标表首视图 |
138
+ | `--type row` | 必填一个或多个 `--record-id` | 只更新这些记录上的目标字段单元格 |
139
+
140
+ `--type row` 不要传 `--view-id`;`--type column` 不要传 `--record-id`。
141
+
142
+ 响应只返回:
143
+
144
+ ```json
145
+ {
146
+ "task_id": "<task_id>"
147
+ }
148
+ ```
149
+
150
+ ## 返回重点
151
+
152
+ 读取和写配置都返回 `current_extension`:
153
+
154
+ - 已配置并可识别时,`current_extension.extension_id` 表示插件 ID,`current_extension.inputs` 是该插件对应的配置对象。
155
+ - 未配置或当前无法识别时,`current_extension` 为 `null`。
156
+
157
+ ## 权限和风险
158
+
159
+ - `+field-extension-get` 是只读命令,权限 `base:field:read`。
160
+ - `+field-extension-update` 是高风险写命令,权限 `base:field:update`,会改变目标字段的自动生成配置,执行时必须带 `--yes`。
161
+ - `+field-extension-update-cells` 是高风险写命令,权限 `base:record:update`,会触发目标字段单元格异步写回,执行时必须带 `--yes`。
162
+ - 用户需要具备管理目标表或目标字段插件的权限才能触发更新任务;如果接口返回权限不足,先按 Base 权限或高级权限角色确认用户权限。
163
+
164
+ ## 注意事项
165
+
166
+ - 目标字段必须是当前字段插件已支持的字段类型;当前已确认支持文本、单选、数字字段。不要把字段插件当成任意字段类型都可用的通用能力。
167
+ - 写入插件配置后,自动更新会强制开启;当前不提供关闭自动更新的参数。
168
+ - 读取接口中的 `field_ref.field` 通常返回字段名称;字段名称不可用时可能返回字段 ID。
169
+ - `+field-extension-update` 不返回 `input_schemas`。
170
+ - `+field-extension-update-cells --type column` 可能触发大量 AI 生成任务,单元格越多耗时通常越久;除非用户明确要求整列刷新,否则优先按 `--type row` 精确更新目标记录。
@@ -157,7 +157,7 @@ The `value` inside `{ "type": "constant", "value": ... }` varies by field type:
157
157
  | `number` | Number | `100`, `0.8` |
158
158
  | `datetime` / `created_at` / `updated_at` | String | `"ExactDate(2025-01-01)"`, `"ExactDate(2025-01-01 09:30)"`, `"Today"`, `"Yesterday"`, `"Tomorrow"` |
159
159
  | `select` (`multiple=false/true`) | Option name array | `["Todo"]`, `["Todo", "Done"]` |
160
- | `link` | Record reference array | `[{ "id": "rec_xxx" }]`, `[{ "id": "rec_xxx" }, { "id": "rec_yyy" }]` |
160
+ | `link` | Record reference array | `[{ "id": "recxxx" }]`, `[{ "id": "recxxx" }, { "id": "recyyy" }]` |
161
161
  | `user` / `created_by` / `updated_by` | User reference array | `[{ "id": "ou_xxx" }]`, `[{ "id": "ou_xxx" }, { "id": "ou_yyy" }]` |
162
162
  | `checkbox` | Boolean | `true`, `false` |
163
163
  | `attachment` / `location` | Only `empty` / `non_empty` | value must be `null` or omitted |