@amaster.ai/pi-lark 0.1.2-beta.55 → 0.1.2-beta.56

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 (62) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-apps/SKILL.md +2 -0
  3. package/skills/lark-apps/references/lark-apps-db.md +130 -2
  4. package/skills/lark-apps/references/lark-apps-user-id-convert.md +63 -0
  5. package/skills/lark-base/SKILL.md +22 -34
  6. package/skills/lark-base/references/lark-base-cell-value.md +19 -7
  7. package/skills/lark-base/references/lark-base-data-analysis-cloud.md +145 -0
  8. package/skills/lark-base/references/lark-base-data-analysis-pandas.md +93 -0
  9. package/skills/lark-base/references/lark-base-data-analysis-python-stdlib.md +120 -0
  10. package/skills/lark-base/references/lark-base-data-analysis-sop.md +166 -155
  11. package/skills/lark-base/references/lark-base-data-query-guide.md +1 -3
  12. package/skills/lark-base/references/lark-base-data-query.md +6 -9
  13. package/skills/lark-base/references/lark-base-field-json.md +2 -2
  14. package/skills/lark-base/references/lark-base-record-upsert.md +2 -2
  15. package/skills/lark-calendar/SKILL.md +2 -0
  16. package/skills/lark-calendar/references/lark-calendar-create.md +1 -0
  17. package/skills/lark-doc/SKILL.md +1 -1
  18. package/skills/lark-drive/SKILL.md +4 -2
  19. package/skills/lark-drive/references/lark-drive-export.md +1 -0
  20. package/skills/lark-drive/references/lark-drive-member-remove.md +59 -0
  21. package/skills/lark-drive/references/lark-drive-push.md +5 -1
  22. package/skills/lark-drive/references/lark-drive-search.md +2 -0
  23. package/skills/lark-minutes/SKILL.md +11 -5
  24. package/skills/lark-minutes/references/lark-minutes-apply-permission.md +95 -0
  25. package/skills/lark-minutes/references/lark-minutes-detail.md +7 -6
  26. package/skills/lark-minutes/references/lark-minutes-download.md +4 -2
  27. package/skills/lark-note/SKILL.md +11 -9
  28. package/skills/lark-note/references/lark-note-detail.md +5 -2
  29. package/skills/lark-note/references/lark-note-transcript.md +2 -0
  30. package/skills/lark-shared/SKILL.md +36 -0
  31. package/skills/lark-slides/SKILL.md +14 -14
  32. package/skills/lark-slides/references/{xml → cli}/lark-slides-add-slide.md +1 -1
  33. package/skills/lark-slides/references/cli/lark-slides-create.md +5 -5
  34. package/skills/lark-slides/references/{xml → cli}/lark-slides-delete-slide.md +2 -2
  35. package/skills/lark-slides/references/cli/lark-slides-media-upload.md +4 -5
  36. package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +10 -9
  37. package/skills/lark-slides/references/{lark-slides-update-slide.md → cli/lark-slides-update-slide.md} +3 -3
  38. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +3 -3
  39. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +2 -2
  40. package/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md +2 -2
  41. package/skills/lark-slides/references/lark-slides-add-slide.md +1 -1
  42. package/skills/lark-slides/references/lark-slides-delete-slide.md +1 -1
  43. package/skills/lark-slides/references/lark-slides-edit-workflows.md +1 -1
  44. package/skills/lark-slides/references/workflow/error-handling.md +1 -1
  45. package/skills/lark-slides/references/workflow/{slides_editing.md → slides-editing.md} +4 -4
  46. package/skills/lark-slides/references/workflow/validation-xml.md +1 -1
  47. package/skills/lark-task/SKILL.md +12 -0
  48. package/skills/lark-task/references/lark-task-create.md +3 -1
  49. package/skills/lark-vc/SKILL.md +13 -5
  50. package/skills/lark-vc/references/lark-vc-detail.md +11 -6
  51. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-events.md → lark-vc/references/lark-vc-meeting-events.md} +121 -20
  52. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-list-active.md → lark-vc/references/lark-vc-meeting-list-active.md} +2 -2
  53. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-message-send.md → lark-vc/references/lark-vc-meeting-message-send.md} +3 -3
  54. package/skills/lark-vc/references/lark-vc-recording.md +8 -6
  55. package/skills/lark-vc/references/vc-domain-boundaries.md +6 -1
  56. package/skills/lark-vc-agent/SKILL.md +24 -9
  57. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +2 -2
  58. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +2 -2
  59. package/skills/lark-wiki/references/lark-wiki-node-create.md +18 -2
  60. package/skills/lark-wiki/references/lark-wiki-node-get.md +11 -0
  61. package/skills/lark-wiki/references/lark-wiki-node-list.md +1 -1
  62. package/skills/lark-slides/references/cli/lark-slides-replace-pages.md +0 -97
@@ -1,4 +1,3 @@
1
-
2
1
  # slides +media-upload(上传本地图片到飞书幻灯片)
3
2
 
4
3
  把本地图片上传到指定演示文稿的 drive 媒体库,返回 `file_token`。**返回的 token 作为 `<img src="...">` 的值塞进 slide XML 即可显示图片。**
@@ -44,7 +43,7 @@ lark-cli slides +media-upload --file ./pic.png --presentation $PRES_ID --dry-run
44
43
 
45
44
  | 参数 | 必填 | 说明 |
46
45
  |------|------|------|
47
- | `--file` | 是 | 本地图片路径,**必须是 CWD 内的相对路径**(如 `./pic.png`)。**最大 20 MB**(slides upload API 不支持分片上传) |
46
+ | `--file` | 是 | 本地图片路径,**必须是 CWD 内的相对路径**(如 `./pic.png`)。**最大 20 MB**(slides upload API 不支持分片上传)。**仅支持 png / jpeg / gif / bmp / tiff / webp** |
48
47
  | `--presentation` | 是 | `xml_presentation_id`、`/slides/<token>` URL,或 `/wiki/<token>` URL |
49
48
 
50
49
  > [!IMPORTANT]
@@ -52,7 +51,7 @@ lark-cli slides +media-upload --file ./pic.png --presentation $PRES_ID --dry-run
52
51
 
53
52
  ## 使用流程
54
53
 
55
- > 新建 PPT([`+create --slides`](lark-slides-create.md))或给已有 PPT 加新页([`+add-slide`](../xml/lark-slides-add-slide.md))都不需要单独上传:XML 里把 `<img src>` 写成 `@<本地路径>`,CLI 会自动上传并替换成 `file_token`。
54
+ > 新建 PPT([`+create --slides`](lark-slides-create.md))或给已有 PPT 加新页([`+add-slide`](lark-slides-add-slide.md))都不需要单独上传:XML 里把 `<img src>` 写成 `@<本地路径>`,CLI 会自动上传并替换成 `file_token`。
56
55
  > 本命令用于往**已有页**里加图,或需要自己拿着 `file_token` 拼 XML 的场景。
57
56
 
58
57
  ### 给已有 PPT 的已有页加图
@@ -65,7 +64,7 @@ SID=yyy # 要加图的那一页
65
64
 
66
65
  # 1) 上传图片拿 file_token
67
66
  TOKEN=$(lark-cli slides +media-upload --as user \
68
- --file ./pic.png --presentation $PRES_ID | jq -r '.data.file_token')
67
+ --file ./pic.png --presentation $PRES_ID --jq '.data.file_token')
69
68
 
70
69
  # 2) block_insert 到页末(或用 insert_before_block_id 指定插入位置)
71
70
  lark-cli slides +replace-slide --as user \
@@ -101,4 +100,4 @@ lark-cli slides +replace-slide --as user \
101
100
 
102
101
  - [+create](lark-slides-create.md) — 新建 PPT(支持 `@` 占位符自动上传图片)
103
102
  - [+replace-slide](lark-slides-replace-slide.md) — 给已有页加图 / 换图(`block_insert` / `block_replace`)
104
- - [+add-slide](../xml/lark-slides-add-slide.md) — 追加/插入单页(同样支持 `@` 占位符自动上传)
103
+ - [+add-slide](lark-slides-add-slide.md) — 追加/插入单页(同样支持 `@` 占位符自动上传)
@@ -2,7 +2,7 @@
2
2
 
3
3
  对指定 slide 做块级替换或插入。编辑已有 PPT 的主路径——`slide_id` 不变、页序不动、只影响被指定的块。
4
4
 
5
- > **`--parts` 字段名是硬约束**:装 XML 片段的字段,`block_replace` 只认 `replacement`,`block_insert` 只认 `insertion`(都是字符串)。`content` / `xml` / `new_xml` / `block_xml` / `block` / `element` / `data` 这些写法,以及任何其他字段名,**一律被 CLI 直接拒绝**——常见的错法会直接告诉你该用哪个字段(`unknown field "content"; did you mean "replacement"?`),其余只列出该 action 的合法字段集。`<content>` 是 `<shape>` 的**子元素**,不是 part 的字段名——这是最常见的搞混点。
5
+ > **编写 `--parts` 时只使用标准 action 和字段**:`block_replace` 使用 `block_id` + `replacement`,`block_insert` 使用 `insertion`(可选 `insert_before_block_id`)。不要根据其他 API 或自然语言猜 action、字段名;具体结构以本文表格为准。
6
6
 
7
7
  相比直接调 `xml_presentation.slide.replace`,这个 shortcut 的四个额外价值:
8
8
 
@@ -76,13 +76,12 @@ lark-cli slides +replace-slide --as user \
76
76
 
77
77
  ### 错误字段名(CLI 直接拒绝)
78
78
 
79
- part 里出现上表以外的字段一律报错,不会被静默忽略。报错总会点名写错的那个字段,并按情况给出下一步:能对上正确字段时直接建议它(`did you mean "replacement"?`),字段属于另一个 action 时说明归属(`it belongs to block_insert`),都对不上时列出该 action 的合法字段集。无论哪种,**要改的是字段名,不是字段值**。
79
+ 编写 part 时只使用上表中的标准字段。CLI 返回 unknown field 时会点名写错的字段,并按情况给出下一步:能对上正确字段时直接建议它(`did you mean \"replacement\"?`),字段属于另一个 action 时说明归属(`it belongs to block_insert`),都对不上时列出该 action 的合法字段集。无论哪种,**要改的是字段名,不是字段值**。
80
80
 
81
81
  ```jsonc
82
82
  // ❌ 全部被拒
83
- [{"action":"block_replace","block_id":"bUn","content":"<p>...</p>"}] // unknown field "content"; did you mean "replacement"?
84
- [{"action":"block_replace","block_id":"bUn","xml":"<shape.../>"}] // 同上(new_xml / block_xml / element / data 一样)
85
- [{"action":"block_replace","block_id":"bUn","block":{"content":"..."}}] // 不能把内容嵌一层 block
83
+ [{"action":"block_replace","block_id":"bUn","xml":"<shape.../>"}] // unknown field "xml"; did you mean "replacement"?
84
+ [{"action":"block_replace","block_id":"bUn","data":"<shape.../>"}] // data 不是标准字段
86
85
  [{"action":"block_replace","block_id":"bUn","insertion":"<shape/>"}] // insertion 属于 block_insert
87
86
  [{"action":"block_replace","block_id":"bUn","replacement":{"type":"..."}}] // replacement 必须是字符串,报 .replacement must be a string
88
87
 
@@ -186,7 +185,7 @@ SID=yyy
186
185
 
187
186
  # 1) 上传图片
188
187
  TOKEN=$(lark-cli slides +media-upload --as user \
189
- --file ./pic.png --presentation "$PID" | jq -r '.data.file_token')
188
+ --file ./pic.png --presentation "$PID" --jq '.data.file_token')
190
189
 
191
190
  # 2) block_insert 到页末
192
191
  lark-cli slides +replace-slide --as user \
@@ -227,7 +226,7 @@ lark-cli slides +replace-slide --as user \
227
226
  # 读时记录 revision_id
228
227
  REV=$(lark-cli slides xml_presentation.slide get --as user \
229
228
  --params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}" \
230
- | jq '.data.revision_id')
229
+ --jq '.data.revision_id')
231
230
 
232
231
  # 写时传 --revision-id;传不存在的版本号(超过当前 revision)返回 3350002
233
232
  lark-cli slides +replace-slide --as user \
@@ -241,9 +240,11 @@ lark-cli slides +replace-slide --as user \
241
240
  |------|------|------|
242
241
  | 3350001 + hint "block_id not found" | `parts[i].block_id` 在当前页不存在 | 重新 `slide.get` 拿最新 XML,按里面的 short ID 再填 |
243
242
  | 3350002 not found | `--revision-id` 传了不存在的版本号(超过当前 revision) | 用 `-1` 或用 `slide.get` 拿到的有效 `revision_id` |
243
+ | `--parts invalid JSON` | JSON 本身不完整,或被 shell 引号/转义破坏 | 将数组写入 `parts.json` 后传 `--parts @parts.json`,或通过 stdin 传给 `--parts -` |
244
244
  | `--parts[i] action "str_replace" is not supported` | CLI 不暴露 `str_replace` | 把替换需求改写成 `block_replace` / `block_insert` |
245
+ | `--parts[i] action "page_replace" / "slide_replace" means whole-page replacement` | 把整页更新意图传给了块级 shortcut | 改用 [`slides +update-slide`](lark-slides-update-slide.md) 整页原地写回 |
245
246
  | `--parts contains N items, exceeds maximum of 200` | 一次提交 parts 太多 | 拆多次调用 |
246
- | `--parts[i] unknown field "content"; did you mean "replacement"?` | XML 塞进了不存在的字段名(`content` / `xml` / `block` / `data` 等) | 只改字段名:`block_replace` 用 `replacement`,`block_insert` 用 `insertion`;报错自带一行正确写法的 hint |
247
+ | `--parts[i] unknown field "xml"; did you mean "replacement"?` | XML 塞进了未支持的字段名(如 `xml` / `new_xml` / `data`) | 使用标准字段:`block_replace` 用 `replacement`,`block_insert` 用 `insertion` |
247
248
  | `--parts[i] unknown field "insertion"; it belongs to block_insert` | 字段和 `action` 不配对 | 按 action 取字段:`block_replace` = `block_id` + `replacement`;`block_insert` = `insertion` (+ `insert_before_block_id`) |
248
249
  | `--parts[i] (block_replace) requires non-empty block_id` / `replacement` | 字段名对,但值缺失或是空串 | 按 parts 元素结构补齐值 |
249
250
  | `<img>` 不显示 / 显示破图 | `src` 写了外链 URL | 换成通过 [`+media-upload`](lark-slides-media-upload.md) 拿到的 `file_token` |
@@ -255,4 +256,4 @@ lark-cli slides +replace-slide --as user \
255
256
  - [xml_presentation.slide get](lark-slides-xml-presentation-slide-get.md) — 读原页拿 `block_id` / `revision_id`
256
257
  - [xml_presentation.slide replace](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考
257
258
  - [+media-upload](lark-slides-media-upload.md) — 上传图片拿 `file_token`
258
- - [lark-slides-edit-workflows.md](../workflow/slides_editing.md) — 读-改-写闭环 + 决策树
259
+ - [slides-editing.md](../workflow/slides-editing.md) — 读-改-写闭环 + 决策树
@@ -88,7 +88,7 @@ lark-cli slides +update-slide --as user \
88
88
 
89
89
  ## 什么时候不要用它
90
90
 
91
- - **只改一个元素** → 用 [`+replace-slide`](cli/lark-slides-replace-slide.md),一条 `block_replace` part 更省,也不用带上整页
91
+ - **只改一个元素** → 用 [`+replace-slide`](lark-slides-replace-slide.md),一条 `block_replace` part 更省,也不用带上整页
92
92
  - **要改多个页面** → 对每一页各跑一次本命令
93
93
  - **要新建页面** → `slides +create` 或 `xml_presentation.slide create`
94
94
 
@@ -109,7 +109,7 @@ lark-cli slides +xml-get --as user \
109
109
  --presentation "$PRES" --output readback.xml
110
110
  ```
111
111
 
112
- 按当前已加载 `lark-slides/SKILL.md` 指向的 [validation-xml.md](workflow/validation-xml.md) 完成验证:核对总页数、目标页和关键元素(包括需要保留的 ID、文本、背景与备注),并对回读 XML 运行同一版式 lint;发现差异时先停止后续写入并重新基于最新版处理。
112
+ 按当前已加载 `lark-slides/SKILL.md` 指向的 [validation-xml.md](../workflow/validation-xml.md) 完成验证:核对总页数、目标页和关键元素(包括需要保留的 ID、文本、背景与备注),并对回读 XML 运行同一版式 lint;发现差异时先停止后续写入并重新基于最新版处理。
113
113
 
114
114
  ## 成功输出
115
115
 
@@ -141,6 +141,6 @@ lark-cli slides +xml-get --as user \
141
141
  | 现象 | 原因 | 解决 |
142
142
  |------|------|------|
143
143
  | 3350001,原因包含 `not found` | `--presentation` 不匹配,或 `--slide-id` 对应的页面已被删除 | 检查 `--presentation` 和 `--slide-id`,再用 `slides +xml-get` 回读当前页面 ID |
144
- | 3350001,其他 invalid param | `--content` 的 XML 结构有问题(如 `<shape>` 缺 `<content/>`、包含服务端不支持的元素) | 按 [error-handling.md](workflow/error-handling.md) 检查 `--content` 的 XML 结构 |
144
+ | 3350001,其他 invalid param | `--content` 的 XML 结构有问题(如 `<shape>` 缺 `<content/>`、包含服务端不支持的元素) | 按 [error-handling.md](../workflow/error-handling.md) 检查 `--content` 的 XML 结构 |
145
145
  | 3350002 not found | `--revision-id` 传了不存在的版本号 | 用 `-1` 或真实存在的 `revision_id` |
146
146
  | 1061004 / 403 | 当前身份对这份 PPT 没有编辑权限 | 检查是否拥有 `slides:presentation:update` 或 `slides:presentation:write_only` scope;wiki 链接另需 `wiki:node:read`;`--as bot` 还要求该 bot 对目标 PPT 有编辑权限 |
@@ -48,7 +48,7 @@ lark-cli slides xml_presentation.slide get --as user --params '{
48
48
  ```bash
49
49
  lark-cli slides xml_presentation.slide get --as user \
50
50
  --params '{"xml_presentation_id":"slides_example_presentation_id","slide_id":"slide_example_id"}' \
51
- | jq -r '.data.slide.content'
51
+ --jq '.data.slide.content'
52
52
  ```
53
53
 
54
54
  ### 读指定历史版本
@@ -99,7 +99,7 @@ lark-cli slides xml_presentation.slide get --as user --params '{
99
99
  ```bash
100
100
  lark-cli slides xml_presentation.slide get --as user \
101
101
  --params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}" \
102
- | jq -r '.data.slide.content' | grep -oE 'id="[^"]+"' | sed 's/id="//;s/"//'
102
+ --jq '.data.slide.content' | grep -oE 'id="[^"]+"' | sed 's/id="//;s/"//'
103
103
  ```
104
104
 
105
105
  ## 相关命令
@@ -107,4 +107,4 @@ lark-cli slides xml_presentation.slide get --as user --params '{
107
107
  - [slides +replace-slide](lark-slides-replace-slide.md) — 块级替换 shortcut(推荐)
108
108
  - [xml_presentation.slide replace](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考
109
109
  - [slides +xml-get](lark-slides-xml-presentations-get.md) — 读整个 PPT 并保存到本地文件
110
- - [lark-slides-edit-workflows.md](../workflow/slides_editing.md) — 读-改-写闭环
110
+ - [slides-editing.md](../workflow/slides-editing.md) — 读-改-写闭环
@@ -95,7 +95,7 @@ lark-cli slides xml_presentation.slide replace --as user --params '{
95
95
 
96
96
  ```bash
97
97
  # 先拿 file_token
98
- TOKEN=$(lark-cli slides +media-upload --file ./pic.png --presentation "$PID" --as user | jq -r '.data.file_token')
98
+ TOKEN=$(lark-cli slides +media-upload --file ./pic.png --presentation "$PID" --as user --jq '.data.file_token')
99
99
 
100
100
  lark-cli slides xml_presentation.slide replace --as user --params "{
101
101
  \"xml_presentation_id\": \"$PID\",
@@ -185,4 +185,4 @@ lark-cli slides xml_presentation.slide replace --as user --params '{
185
185
  - [slides +replace-slide](lark-slides-replace-slide.md) — 块级替换 shortcut(推荐,自动注入 id)
186
186
  - [xml_presentation.slide get](lark-slides-xml-presentation-slide-get.md) — 读原页拿 block short ID
187
187
  - [slides +media-upload](lark-slides-media-upload.md) — 上传图片拿 file_token
188
- - [lark-slides-edit-workflows.md](../workflow/slides_editing.md) — 读-改-写闭环 + 决策树
188
+ - [slides-editing.md](../workflow/slides-editing.md) — 读-改-写闭环 + 决策树
@@ -153,5 +153,5 @@ lark-cli slides xml_presentations get --as user --params '<json_params>'
153
153
  ## 相关命令
154
154
 
155
155
  - [slides +create](lark-slides-create.md) - 创建空白 PPT
156
- - [slides +add-slide](../xml/lark-slides-add-slide.md) - 添加幻灯片页面
157
- - [slides +delete-slide](../xml/lark-slides-delete-slide.md) - 删除幻灯片页面
156
+ - [slides +add-slide](lark-slides-add-slide.md) - 添加幻灯片页面
157
+ - [slides +delete-slide](lark-slides-delete-slide.md) - 删除幻灯片页面
@@ -1,5 +1,5 @@
1
1
  # slides +add-slide(兼容入口)
2
2
 
3
- 本文档已迁移至 [`xml/lark-slides-add-slide.md`](xml/lark-slides-add-slide.md)。
3
+ 本文档已迁移至 [`cli/lark-slides-add-slide.md`](cli/lark-slides-add-slide.md)。
4
4
 
5
5
  此文件仅保留旧路径兼容性;后续引用请使用新路径。
@@ -1,5 +1,5 @@
1
1
  # slides +delete-slide(兼容入口)
2
2
 
3
- 本文档已迁移至 [`xml/lark-slides-delete-slide.md`](xml/lark-slides-delete-slide.md)。
3
+ 本文档已迁移至 [`cli/lark-slides-delete-slide.md`](cli/lark-slides-delete-slide.md)。
4
4
 
5
5
  此文件仅保留旧路径兼容性;后续引用请使用新路径。
@@ -1,5 +1,5 @@
1
1
  # 编辑已有 PPT:读-改-写闭环(兼容入口)
2
2
 
3
- 本文档已迁移至 [`workflow/slides_editing.md`](workflow/slides_editing.md)。
3
+ 本文档已迁移至 [`workflow/slides-editing.md`](workflow/slides-editing.md)。
4
4
 
5
5
  此文件仅保留旧路径兼容性;后续引用请使用新路径。
@@ -59,4 +59,4 @@
59
59
 
60
60
  - 图片上传、`@path` 占位符、`file_token`:见 [lark-slides-media-upload.md](../cli/lark-slides-media-upload.md) 和 [lark-slides-create.md](../cli/lark-slides-create.md)。
61
61
  - 块级替换、`block_id`、3350001 replace 细节:见 [lark-slides-replace-slide.md](../cli/lark-slides-replace-slide.md)。
62
- - 追加/插入单页、`--before-slide-id` 和 `--slide @file` 绕开转义:见 [lark-slides-add-slide.md](../xml/lark-slides-add-slide.md)。
62
+ - 追加/插入单页、`--before-slide-id` 和 `--slide @file` 绕开转义:见 [lark-slides-add-slide.md](../cli/lark-slides-add-slide.md)。
@@ -1,6 +1,6 @@
1
1
  # 编辑已有 PPT:读-改-写闭环
2
2
 
3
- 局部编辑走 **shortcut [`+replace-slide`](../cli/lark-slides-replace-slide.md)**(块级替换 / 插入),配合 `xml_presentation.slide.get` 读原页拿 `block_id`。整页重建走 **[`+update-slide`](../lark-slides-update-slide.md)**,多页就每页各跑一次 —— 它原地覆盖并保留 `slide_id` 和页序;只有写进 `--content` 且带原 id 的元素才会保留元素 id,遗漏的元素会被删除。
3
+ 局部编辑走 **shortcut [`+replace-slide`](../cli/lark-slides-replace-slide.md)**(块级替换 / 插入),配合 `xml_presentation.slide.get` 读原页拿 `block_id`。整页重建走 **[`+update-slide`](../cli/lark-slides-update-slide.md)**,多页就每页各跑一次 —— 它原地覆盖并保留 `slide_id` 和页序;只有写进 `--content` 且带原 id 的元素才会保留元素 id,遗漏的元素会被删除。
4
4
 
5
5
  > 生成 XML 前**必读** [xml-schema-quick-ref.md](../xml/xml-schema-quick-ref.md)。
6
6
 
@@ -33,7 +33,7 @@ lark-cli slides +replace-slide --as user \
33
33
 
34
34
  `slide_id` / 页序不会变。`block_replace` 的 `replacement` 根元素 `id` 会自动注入为 `block_id`,用户手写 XML 时不需要自己加。
35
35
 
36
- > **part 的字段名是 `block_id` + `replacement`(XML 字符串)**:写成 `content` / `xml` / `block` 会被 CLI 拒绝(报 `unknown field "content"; did you mean "replacement"?`)。收到这个报错时改字段名,不要改字段值。
36
+ > **编写 `--parts` 时只使用标准字段**:`block_replace` 使用 `action` + `block_id` + `replacement`(XML 字符串),`block_insert` 使用 `action` + `insertion`(可选 `insert_before_block_id`)。收到 unknown field 报错时应按上述结构修改字段名,而不是修改字段值。
37
37
 
38
38
  ## `revision_id` 参数
39
39
 
@@ -43,7 +43,7 @@ lark-cli slides +replace-slide --as user \
43
43
  # 读时拿当前 revision_id
44
44
  REV=$(lark-cli slides xml_presentation.slide get --as user \
45
45
  --params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}" \
46
- | jq '.data.revision_id')
46
+ --jq '.data.revision_id')
47
47
 
48
48
  # 写时传该版本号,服务端以此为 base
49
49
  lark-cli slides +replace-slide --as user \
@@ -136,7 +136,7 @@ cat parts.json | lark-cli slides +replace-slide --as user --presentation "$PID"
136
136
  ## 相关文档
137
137
 
138
138
  - [lark-slides-replace-slide.md](../cli/lark-slides-replace-slide.md) — +replace-slide shortcut 参数详情
139
- - [lark-slides-update-slide.md](../lark-slides-update-slide.md) — +update-slide shortcut 参数详情(整页覆盖)
139
+ - [lark-slides-update-slide.md](../cli/lark-slides-update-slide.md) — +update-slide shortcut 参数详情(整页覆盖)
140
140
  - [lark-slides-xml-presentation-slide-get.md](../cli/lark-slides-xml-presentation-slide-get.md) — slide.get 参考(拿 `block_id` / `revision_id`)
141
141
  - [lark-slides-xml-presentation-slide-replace.md](../cli/lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考(一般直接用 shortcut 即可)
142
142
  - [lark-slides-media-upload.md](../cli/lark-slides-media-upload.md) — 上传图片拿 file_token
@@ -1,6 +1,6 @@
1
1
  # Validation Checklist
2
2
 
3
- 创建、大幅改写演示文稿或每次通过 `slides +update-slide` 整页写回后,必须做一次显式验证。目标是发现空白页、XML 损坏、内容截断、明显溢出、弱视觉层级和未验证输出。
3
+ 创建、大幅改写演示文稿或整页写回后,必须做一次显式验证。目标是发现空白页、XML 损坏、内容截断、明显溢出、弱视觉层级和未验证输出。
4
4
 
5
5
  小型已有页编辑也要做对应范围的验证:至少读取被改页面或全文 XML,确认目标元素已更新且未破坏周边结构。
6
6
 
@@ -12,6 +12,18 @@ metadata:
12
12
 
13
13
  **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md),其中包含认证、权限处理**
14
14
 
15
+ ## 命令选择与渐进式发现(必读)
16
+
17
+ 执行任何 Task 命令前,必须先确认能力真实存在,禁止根据用户意图自行拼接或猜测 `+<verb>`:
18
+
19
+ 1. 先将用户意图与下方 Shortcut 表精确匹配。只有表中明确列出的 shortcut 才可直接选择;参数不确定时读取对应 reference 或运行该 shortcut 的 `--help`。
20
+ 2. 没有精确匹配、或无法确认当前版本是否支持时,先运行 `lark-cli task --help`,以当前 CLI 输出的命令列表为准。
21
+ 3. help 中存在匹配 shortcut 时,使用 help 列出的完整 shortcut token(例如 `+create`)运行 `lark-cli task <shortcut> --help`,再按真实 flag 执行。
22
+ 4. help 中没有匹配 shortcut 时,不得尝试相似的 `+<verb>`;从 help 中选择原生 resource,运行 `lark-cli task <resource> --help` 确认 method,再运行 `lark-cli schema task.<resource>.<method>` 获取参数结构,最后调用 `lark-cli task <resource> <method> ...`。
23
+ 5. 遇到 `unknown_subcommand` 时必须停止猜测或尝试变体,回到第 2 步重新发现能力。
24
+
25
+ shortcut 名称只能来自本 Skill 的 Shortcut 表或 `lark-cli task --help`;原生 resource/method 以逐级 help 为准,参数名、类型和嵌套结构以 method schema 为准。
26
+
15
27
  > **任务搜索技巧**:先区分用户是否**特地指定使用搜索 skill**,以及是否真的提供了**查询关键字**(例如任务名称、关键词、片段描述)。如果用户特地指定使用搜索 skill,或明确给出了任务查询关键字,则目标是**任务**时优先使用 `+search`。如果用户没有特地指定使用搜索 skill,且意图里没有查询关键字,只有范围条件(例如“今年以来”“已完成”“由我创建”“我关注的”),并且使用 `+search` 与 `+get-related-tasks` / `+get-my-tasks` 都能达到目的时,应优先使用列表型能力,而不是搜索型能力。其中,“与我相关 / 我关注的 / 由我创建”等优先考虑 `+get-related-tasks`;“我负责的 / 分配给我”的列表优先考虑 `+get-my-tasks`。不要把时间范围词(例如“今年以来”)本身误当成 `query` 去走搜索。
16
28
  > **任务搜索相关性提示**:`+search` 当前不会自动判断搜索结果与搜索发起人的相关性。如果用户明确要求搜索“与我相关”的任务,必须先识别具体关系,获取当前用户的 `open_id`,并显式传入对应的 `--assignee`(负责人)、`--creator`(创建人)或 `--follower`(关注人)过滤条件;不能只依赖 `query` 期待自动返回与当前用户相关的任务。
17
29
  > **任务清单搜索技巧**:任务清单也遵循同样的判断逻辑。先区分用户是否**特地指定使用搜索 skill**,以及是否真的提供了**清单查询关键字**(例如清单名称、关键词、片段描述)。如果用户特地指定使用搜索 skill,或明确给出了清单查询关键字,则优先使用 `+tasklist-search`。如果用户没有特地指定使用搜索 skill,且意图里没有查询关键字,只有范围条件(例如“由我创建的任务清单”“今年以来创建的清单”),并且使用搜索或原生列取清单都能达到目的时,应优先使用原生 `tasklists.list` 接口列取清单(先 `schema task.tasklists.list`,再 `lark-cli task tasklists list --as user ...`),再按 `creator`、`created_at` 等字段做本地筛选和分页控制。
@@ -48,7 +48,9 @@ lark-cli task +create --summary "Test Task" --dry-run
48
48
  | `--data <json>` | No | JSON object merged into the task create request for API fields without dedicated flags, such as `{"is_milestone":true}`. Explicit named flags override same-named fields in this object. |
49
49
  | `--dry-run` | No | Preview the API call (JSON payload) without actually creating the task. |
50
50
 
51
- Use `lark-cli schema task.tasks.create` to confirm that an extra field is supported before passing it through `--data`. Prefer this shortcut over the raw `tasks create` command when `--data` can express the request. Do not assume that other shortcuts support `--data`; check each shortcut's `--help` output first.
51
+ > **Required:** If `task +create` has no dedicated flag for a field requested by the user, first inspect `lark-cli schema task.tasks.create`, then add that field to `--data` using the exact field name, type, and nesting from the Meta API request-body schema. Do not omit requested fields or guess their JSON shape. Keep fields already supplied through dedicated flags out of `--data`.
52
+
53
+ Prefer this shortcut over the raw `tasks create` command when `--data` can express the request. Do not assume that other shortcuts support `--data`; check each shortcut's `--help` output first.
52
54
 
53
55
  ## Workflow
54
56
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lark-vc
3
3
  version: 1.0.0
4
- description: "飞书视频会议:搜索历史会议记录、查询会议纪要(总结/待办/章节/逐字稿)、查询参会人快照。当用户查询已结束的会议、获取会议产物(纪要/妙记)、查看参会人时使用;查询未来日程走 lark-calendar。不负责:Agent 真实入会/离会、会中实时事件(走 lark-vc-agent)。"
4
+ description: "飞书视频会议:查询进行中的会议列表(含会议 ID)、读取会中实时内容(发言、聊天、共享等)、发送会中消息,以及搜索历史会议、查询会议纪要(总结/待办/章节/逐字稿)和参会人快照。Agent 真实入会/离会走 lark-vc-agent;查询未来日程走 lark-calendar。"
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["lark-cli"]
@@ -20,7 +20,9 @@ metadata:
20
20
 
21
21
  ## 身份
22
22
 
23
- 所有 vc 命令默认使用 `--as user`。`+search` 和 `meeting get` 也支持 `--as bot`。
23
+ 身份是跨命令工作流的状态,不是单条命令的局部参数:一旦某个 ID(如 `note_id`、`minute_token`)由某个身份取得,后续消费它的命令(包括跨到 lark-minutes / lark-note / lark-doc)必须显式沿用相同 `--as`;不要依赖 profile 默认身份,也不要为绕过权限错误切换身份。完整规则见 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md) 的「身份延续」。
24
+
25
+ 本 skill 默认使用 `--as user`。`+detail`、`+recording`、`meeting get`、`+meeting-list-active`、`+meeting-events` 和 `+meeting-message-send` 也支持 `--as bot`;`+meeting-events` 和 `+meeting-message-send` 必须沿用 `meeting_id` 的来源身份。`+search` 仅支持 `--as user`。
24
26
 
25
27
  ```bash
26
28
  # BAD — 查昨天的会议用 calendar,会漏掉即时会议
@@ -37,6 +39,9 @@ lark-cli vc +search --query "站会" --start <start_time> --end <end_time>
37
39
  | [`+search`](references/lark-vc-search.md) | 搜索历史会议记录(需至关键词、时间范围、组织者、参与者、会议室少一个筛选条件) |
38
40
  | [`+detail`](references/lark-vc-detail.md) | 通过 meeting-ids 获取会议详情,包括 note_id 和 minute_token |
39
41
  | [`+recording`](references/lark-vc-recording.md) | 通过 meeting-ids 或 calendar-event-ids 查询 minute_token |
42
+ | [`+meeting-list-active`](references/lark-vc-meeting-list-active.md) | 查询当前身份可见的进行中会议并获取 `meeting_id` |
43
+ | [`+meeting-events`](references/lark-vc-meeting-events.md) | 读取当前身份可见的会中事件 |
44
+ | [`+meeting-message-send`](references/lark-vc-meeting-message-send.md) | 发送会中文本或 reaction |
40
45
 
41
46
  - 使用任何 Shortcut 前,必须先读其对应 reference 文档。
42
47
 
@@ -47,8 +52,10 @@ lark-cli vc +search --query "站会" --start <start_time> --end <end_time>
47
52
  | 查"昨天的会议""上周的会""已结束的会议" | 本 skill(`+search`,含即时会议) |
48
53
  | 查日历/日程或未来时间的会议 | [lark-calendar](../lark-calendar/SKILL.md) |
49
54
  | 查"今天有哪些会议" | `vc +search`(已结束)+ lark-calendar(未开始),合并展示 |
55
+ | 查询进行中的会议、会中事件或发送会中消息 | 本 skill 的 `+meeting-list-active` / `+meeting-events` / `+meeting-message-send`,也可由 [lark-vc-agent](../lark-vc-agent/SKILL.md) 编排 |
56
+ | 用户询问会议内容,但未提供 `meeting_id`,也未明确指向已结束会议 | 先用 `+meeting-list-active` 查询进行中的会议;无结果时,再用 `+search` 查询当天最近结束的会议;仍无结果时询问会议时间、主题或会议号,不自行扩大时间范围 |
50
57
  | 只按自然语言标题查"xx 纪要的逐字稿 / 原始记录 / 谁说了什么" | 先到 [lark-drive](../lark-drive/SKILL.md) / [lark-doc](../lark-doc/SKILL.md);仅在已拿到 `note_id` / `vc-node-id` 后再到 [lark-note](../lark-note/SKILL.md) |
51
- | Agent 真实入会/离会、会中实时事件 | [lark-vc-agent](../lark-vc-agent/SKILL.md) |
58
+ | Agent 真实入会/离会 | [lark-vc-agent](../lark-vc-agent/SKILL.md) |
52
59
  | 妙记信息/时长/封面/链接 | 先走 `vc +detail` 或 `vc +recording` 获取 `minute_token`,再用 [lark-minutes](../lark-minutes/SKILL.md) 的 `minutes get` |
53
60
  | 本地音视频文件转纪要/逐字稿 | 先走 [lark-minutes](../lark-minutes/SKILL.md) 上传,再用 `minutes +detail --minute-tokens` |
54
61
 
@@ -142,7 +149,7 @@ lark-cli vc meeting get --params '{"meeting_id":"<meeting_id>","with_participant
142
149
  |---------|---------|--------|
143
150
  | 参会人快照(谁参加过、何时入/离会,任意时点)| `vc meeting get --with-participants` | 本 skill |
144
151
  | 已结束会议的发言内容 | 优先:`vc +detail` 取 `note_id` 再 `note +detail` 取 `verbatim_doc_token` 后 `docs +fetch`;备选:`vc +detail` 取 `minute_token` 再 `minutes +detail --transcript` | [lark-note](../lark-note/SKILL.md) / [lark-minutes](../lark-minutes/SKILL.md) |
145
- | **进行中会议**的实时事件流(转写、聊天、共享、会中加入/离开)| `vc +meeting-events` | [`lark-vc-agent`](../lark-vc-agent/SKILL.md) |
152
+ | **进行中会议**的实时事件流(转写、聊天、共享、会中加入/离开)| `vc +meeting-events` | 本 skill / [`lark-vc-agent`](../lark-vc-agent/SKILL.md) |
146
153
  | **Agent 真实入会 / 离会** | `vc +meeting-join` / `vc +meeting-leave` | [`lark-vc-agent`](../lark-vc-agent/SKILL.md) |
147
154
 
148
155
  ## 资源关系
@@ -173,6 +180,7 @@ Meeting (视频会议)
173
180
  > - 已有 `doc_token` 且目标是读正文 → [lark-doc](../lark-doc/SKILL.md)。
174
181
  > - 只有自然语言纪要标题 → 文档搜索 / Docx 正文读取;有显式 `vc-node-id` 才进入 [lark-note](../lark-note/SKILL.md)。
175
182
  > - 从日程出发(只有 `event_id`)→ 先走 [`calendar +meeting`](../lark-calendar/references/lark-calendar-meeting.md) 拿到 `meeting_id` 或 `meeting_note`,再按上述路径继续。
183
+ > - **跨到 lark-minutes / lark-note / lark-doc 时必须沿用来源身份**:例如 `vc +detail --as bot` 拿到的 `note_id`,下一步 `note +detail --note-id <note_id>` 也要显式加 `--as bot`;不要省略 `--as` 让身份被 profile 默认值悄悄换成 user(或反过来)。`note +transcript` 目前仅支持 `--as user`——如果 `note +detail --as bot` 返回 `note_display_type=unified`,停在这一步向用户说明"该纪要的逐字稿只能以 user 身份读取",只有用户明确同意才切到 `--as user`,不要静默切换。
176
184
 
177
185
  ## API Resources
178
186
 
@@ -199,7 +207,7 @@ lark-cli vc meeting get --params '{"meeting_id": "<meeting_id>", "with_participa
199
207
  ## 不在本 skill 范围
200
208
 
201
209
  - 查询未来的会议日程 → [lark-calendar](../lark-calendar/SKILL.md)
202
- - Agent 真实入会/离会、会中实时事件 → [lark-vc-agent](../lark-vc-agent/SKILL.md)
210
+ - Agent 真实入会/离会 → [lark-vc-agent](../lark-vc-agent/SKILL.md)
203
211
  - 只有纪要文档标题的逐字稿查询 → 文档搜索 / Docx 正文读取;有显式 `vc-node-id` 才进入 [lark-note](../lark-note/SKILL.md)
204
212
  - 本地音视频文件转纪要/逐字稿、妙记搜索/下载/上传/重命名/替换说话人 → [lark-minutes](../lark-minutes/SKILL.md)
205
213
  - 通过 `note_id` 取纪要文档 Token → [lark-note](../lark-note/SKILL.md)
@@ -1,13 +1,16 @@
1
1
 
2
2
  # vc +detail
3
3
 
4
- 通过会议 ID 获取会议详情,包括基本信息、关联的纪要 ID(`note_id`)和妙记 Token(`minute_token`)。只读。
4
+ 通过会议 ID 获取会议详情,包括基本信息、关联的纪要 ID(`note_id`)和妙记 Token(`minute_token`)。只读,支持 `--as user` / `--as bot`。
5
5
 
6
6
  ## 命令
7
7
 
8
8
  ```bash
9
9
  # 单个 / 批量(逗号分隔,最多 50 个)
10
10
  lark-cli vc +detail --meeting-ids <meeting_id1>,<meeting_id2>
11
+
12
+ # bot 身份(只能查 bot 有权限的会议)
13
+ lark-cli vc +detail --meeting-ids <meeting_id1>,<meeting_id2> --as bot
11
14
  ```
12
15
 
13
16
  ## 输出字段
@@ -26,19 +29,21 @@ lark-cli vc +detail --meeting-ids <meeting_id1>,<meeting_id2>
26
29
 
27
30
  ### 场景 1:获取会议的纪要和妙记关联
28
31
 
29
- `vc +detail` 只能拿到 `note_id` 和 `minute_token`,不直接返回纪要文档 token 与妙记产物内容。要获取实际产物,需根据用户诉求继续调用 `note +detail` 或 `minutes +detail`:
32
+ `vc +detail` 只能拿到 `note_id` 和 `minute_token`,不直接返回纪要文档 token 与妙记产物内容。要获取实际产物,需根据用户诉求继续调用 `note +detail` 或 `minutes +detail`,**并沿用第 1 步同一个 `--as`**(完整规则见 [lark-shared](../../lark-shared/SKILL.md) 的「身份延续」):
30
33
 
31
34
  ```bash
32
35
  # 1. 获取会议详情,拿到 note_id 和 minute_token
33
- lark-cli vc +detail --meeting-ids <meeting_id>
36
+ lark-cli vc +detail --meeting-ids <meeting_id> --as bot
34
37
 
35
38
  # 2. 用 note_id 获取纪要文档 Token(note_doc_token / verbatim_doc_token / shared_doc_tokens)
36
- lark-cli note +detail --note-id <note_id>
39
+ # 显式沿用第 1 步的身份,不要省略 --as
40
+ lark-cli note +detail --note-id <note_id> --as bot
37
41
 
38
- # 3. 用 minute_token 获取妙记产物
42
+ # 3. 用 minute_token 获取妙记产物(同样沿用第 1 步的身份)
39
43
  # ⚠️ 必须显式指定 --summary / --todo / --chapter / --keyword / --transcript 中至少一个 flag,
40
44
  # 不传任何 flag 则不会返回任何产物内容。
41
- lark-cli minutes +detail --minute-tokens <minute_token> --todo --transcript
45
+ lark-cli minutes +detail --minute-tokens obcnxxxxxxxxxxxxxxxxxxxx --todo --transcript --as bot
42
46
  ```
43
47
 
44
48
  > **路由建议**:当用户未明确指定使用妙记时,**优先**走 `note +detail` 链路(纪要文档信息更完整、含逐字稿原文),仅在 `note_id` 为空或用户要求妙记产物时才走 `minutes +detail`。
49
+ > **身份边界**:`note +transcript` 目前仅支持 `--as user`。若上面第 2 步用 `--as bot` 拿到 `note_display_type=unified`,停下来向用户说明该纪要逐字稿只能以 user 身份读取,只有用户明确同意才切换身份重试。
@@ -65,7 +65,7 @@ lark-cli vc +meeting-events --as <same_identity> --meeting-id <id> --page-token
65
65
  lark-cli vc +meeting-join --as bot --meeting-number 123456789
66
66
 
67
67
  # 再查询事件
68
- lark-cli vc +meeting-events --as bot --meeting-id <id>
68
+ lark-cli vc +meeting-events --as bot --meeting-id <id> --page-all --format pretty
69
69
  ```
70
70
 
71
71
  如果应用机器人已经在会中,也可以先通过 active meeting 找会:
@@ -114,7 +114,9 @@ lark-cli vc +meeting-events --as user --meeting-id <id> --page-all --format pret
114
114
  - `--format pretty`:默认推荐格式,输出当前身份和逐条时间线,适合快速理解“发生了什么”。
115
115
  - `--format ndjson`:输出事件行,并带 metadata 行,适合流式消费。
116
116
 
117
- **选型原则**:只在 `pretty`、`json`、`ndjson` 之间选择。目标是告诉用户“发生了什么”时,用 `--page-all --format pretty`;需要稳定字段给 agent 做结构化消费、总结、转发或二次处理时用 `--format json`;需要流式消费时用 `--format ndjson`。
117
+ **选型原则**:默认先用 `--format pretty`;仅当 `pretty` 缺少完成任务所必需的结构化字段时,才改用 `--format json`。用户明确要求 JSON 或规则明确要求结构化字段时可直接用 `--format json`;需要流式消费时用 `--format ndjson`。
118
+
119
+ > **JSON 成本**:JSON 保留完整 payload,输出通常远大于 `pretty`;长会全量拉取时会显著占用上下文空间。
118
120
 
119
121
  > **注意**:pretty 输出中的正文文本会做单行转义,真实换行会显示为 `\n`,避免打乱时间线布局。
120
122
 
@@ -131,19 +133,117 @@ lark-cli vc +meeting-events --as user --meeting-id <id> --page-all --format pret
131
133
 
132
134
  执行准则:
133
135
 
134
- - 如果上下文已有明确 `meeting_id`,沿用该 `meeting_id` 的来源身份执行 `+meeting-events --page-all --format json`。
135
136
  - 如果上下文没有明确 `meeting_id`,先按用户当前意图选择身份:问“我/当前用户所在会议”用 `lark-cli vc +meeting-list-active --as user --format json`;问“应用机器人可见的目标用户会议”用 `lark-cli vc +meeting-list-active --as bot --user-id <user_open_id> --format json`。返回多个会议时先让用户选择。
136
137
  - 如果上下文只有 9 位会议号,先按当前身份执行 `+meeting-list-active` 并按 `meeting_no` 匹配;匹配到唯一会议后再查事件。不要为了总结会议而自动调用 `+meeting-join`。
137
- - 这类问题拿到 `meeting_id` 后,用同一身份执行 `lark-cli vc +meeting-events --as <same_identity> --meeting-id <id> --page-all --format json` 拉取最新事件流。
138
- - 如果事件中出现共享文档线索,例如:
139
- - `magic_share_started`
140
- - `share_doc.title`
141
- - `share_doc.url`
142
- - 必须继续读取共享文档内容,再生成总结,不能只根据“开始共享了某文档”这条事件和文档标题来概括会议内容。
143
- - 若存在多个共享文档,优先读取**最近一次共享**的文档。
138
+ - 确认 `meeting_id` 后,沿用其来源身份执行 `lark-cli vc +meeting-events --as <same_identity> --meeting-id <id> --page-all --format pretty` 拉取最新事件流。
139
+ - 如果事件流显示开始共享内容(JSON 事件类型为 `magic_share_started`,pretty 时间线显示“开始共享”),并包含文档标题或 URL 等线索,必须继续读取共享文档内容后再生成总结,不能只根据共享事件和文档标题概括会议内容。
140
+ - 若存在多个共享文档,按用户问题读取相关文档;处理某条文档上下文事件时必须按该 item 的 `share_id` 精确关联,不能用“最近一次共享”替代。
144
141
  - 若文档读取失败,必须明确说明“以下总结仅基于会中事件流,未成功读取共享文档内容”。
145
142
 
146
- ### 7. 关于 `page_token` 的返回与续拉
143
+ ### 7. 文档上下文事件消费
144
+
145
+ `document_context_changed` 是只读线索事件。需要根据该事件执行评论、章节或预览等后续处理时,必须用 `+meeting-events --page-all --format json` 读取 `share_id`、`comment_id`、`element_token` 等完整字段;仅向用户展示时间线时仍默认使用 pretty。`vc +meeting-events` 保留原始 payload,并按既有事件输出约定派生 actor 与 pretty timeline;它不会为单个事件类型扩张 JSON/NDJSON 公共 envelope,也不会查询评论、下载素材或写文件。后续 Drive/Docs 命令只能由 Agent 按下表显式选择。
146
+
147
+ #### 共享会话关联
148
+
149
+ `share_id` 标识一次共享会话。Agent 按事件时间顺序消费完整事件流,并维护共享会话状态:
150
+
151
+ 1. 从 `payload.magic_share_started_items[]` 读取 `share_id` 和 `share_doc`,建立 `share_id -> share_doc` 映射并标记会话开始。同一 `share_id` 重复携带相同文档时按幂等事件处理;若指向不同文档则停止解析,不覆盖旧映射。
152
+ 2. `document_context_changed_items[]` 通过自己的 `share_id` 精确查找该映射。当前契约中 item 自带的 `share_doc` 不提供文档信息;只保留它的原始值,不作为 URL/title 来源,也不做冲突判定。
153
+ 3. `payload.magic_share_ended_items[]` 使用相同 `share_id` 标记该会话结束。历史映射可保留用于解释本批次中结束前已发生的上下文事件,但不能再作为新的活动共享会话。
154
+ 4. 增量拉取从会话中途开始且本地没有对应映射时,重新拉取包含 `magic_share_started` 的完整事件流;仍无法命中则标记未解析。禁止回退到当前文档、最近一次共享或其他 `share_id`。
155
+
156
+ #### 字段合同
157
+
158
+ | 路径 | 含义与处理 |
159
+ | --- | --- |
160
+ | `payload.magic_share_started_items[].share_id/share_doc` | 建立一次共享会话与文档 URL/title 的映射。缺 `share_id` 时不建立映射。 |
161
+ | `payload.magic_share_ended_items[].share_id` | 结束同一 `share_id` 的共享会话;不得结束其他映射。 |
162
+ | `payload.document_context_changed_items[]` | 结构化消费按原序读取;pretty timeline 沿用统一时间排序。每项恰有一个已知 context 才生成 pretty 条目,未知/歧义项只保留 raw。 |
163
+ | `item.operator` | 当前 item 的 actor;缺 ID/name 时不猜共享发起人。 |
164
+ | `item.share_id` | 当前上下文所属共享会话;用它精确查找 `magic_share_started` 建立的 `share_doc` 映射。 |
165
+ | `item.share_doc.url/title` | 当前不作为文档元信息来源;保留在 raw payload 以兼容未来扩展。文档 URL/title 只从同 `share_id` 的 `magic_share_started` 映射取得。 |
166
+ | `item.time` | Unix 毫秒字符串;缺失或非法时 timeline 回退到事件时间。 |
167
+ | `item.comment_focus.comment_id/focused` | `focused=true` 才精确查询一个 comment ID;`false` 是清除焦点,零查询。 |
168
+ | `item.section_location.parent_titles/title/level` | `section_path` 按 parent 原序再追加 title,trim 后丢弃空段,以 ` > ` 连接;`level` 仅作诊断,不参与截断或补层。 |
169
+ | `item.element_preview.action/element_type/element_token/block_id` | 只有 `open + image + token`、`open + whiteboard + token` 可在明确预览意图下路由;其他组合零调用。 |
170
+ | 事件公共 envelope | JSON/NDJSON 只使用既有 `event_id/event_type/event_time/actors/payload`;不新增顶层 `summary/section_path`,也不发明 `derived.document_context`。 |
171
+ | 事件 `payload` | 原始恢复面;未知字段保留,顶层空数组沿用所有会议事件共用的压缩规则,派生字段不会写回 payload。 |
172
+
173
+ #### 评论聚焦:只查一个 ID
174
+
175
+ 先读取当前 item 的 `share_id` 和 `comment_focus.comment_id`,再按“共享会话关联”取得 `share_doc.url`。优先把完整 URL 传给现有 shortcut,由它解析实际 `file_token/file_type`(含 Wiki 解包);如果上游只留下裸 token,则必须同时提供已解析且受支持的 `file_type`。
176
+
177
+ ```bash
178
+ # 推荐:share_doc.url 完整可用
179
+ lark-cli drive +batch-query-comments \
180
+ --as <same_identity> \
181
+ --url "<share_doc.url>" \
182
+ --comment-ids "<comment_focus.comment_id>" \
183
+ --format json
184
+
185
+ # 只有已经可靠解析出裸 token/type 时使用
186
+ lark-cli drive +batch-query-comments \
187
+ --as <same_identity> \
188
+ --token "<file_token>" \
189
+ --type "<file_type>" \
190
+ --comment-ids "<comment_focus.comment_id>" \
191
+ --format json
192
+ ```
193
+
194
+ 该 shortcut 对应 `drive.file.comments.batch_query`,请求体必须只有 `comment_ids:["<当前comment_id>"]`。响应处理规则:
195
+
196
+ 1. 整个响应 `items` 长度必须恰为 1,且 `items[0].comment_id` 必须与请求 ID 完全相等。`items` 为空、多于 1 项或唯一项 ID 不同都停止;即使多项中恰有一项匹配,也不得挑选该项继续。失败时保留 `share_doc/comment_id`,禁止改用 `drive +list-comments` 扫描整篇文档。
197
+ 2. `item.quote` 是引用位置;评论正文和回复在 `item.reply_list.replies`,其中第一条是根评论。
198
+ 3. 完整性看命中评论卡片的 **`item.has_more`**,不是外层评论分页,也不是根据非空 `page_token` 猜测。`item.has_more=false` 时直接使用内嵌列表,零 `+list-replies` 调用。
199
+ 4. `item.has_more=true` 时忽略截断列表,从**不带 `--page-token` 的第一页**开始重建完整 replies:
200
+
201
+ ```bash
202
+ lark-cli drive +list-replies \
203
+ --as <same_identity> \
204
+ --url "<share_doc.url>" \
205
+ --comment-id "<comment_focus.comment_id>" \
206
+ --page-size 100 \
207
+ --format json
208
+
209
+ lark-cli drive +list-replies \
210
+ --as <same_identity> \
211
+ --url "<share_doc.url>" \
212
+ --comment-id "<comment_focus.comment_id>" \
213
+ --page-size 100 \
214
+ --page-token "<returned_page_token>" \
215
+ --format json
216
+ ```
217
+
218
+ 第一页 `items[0]` 才是根评论;后续页的 `items[0]` 是普通回复。按页原序累积,直到页级 `has_more=false`。如果 `has_more=true` 但 `page_token` 为空、与已用 token 重复、API/权限失败或 comment ID 改变,立即停止并标记为 `partial`;保留已经取得的内容和原始标识,不循环、不重复根评论、不声称完整。
219
+
220
+ #### 章节定位
221
+
222
+ 结构化消费直接读取当前 `section_location` item。pretty timeline 会按 `parent_titles` 原序追加 `title`,trim 后丢弃空段,并以 ` > ` 连接;多个 section item 分别展示,不选择其中一个覆盖事件级标量;标题全空时不生成 pretty 条目,只保留 raw。该路径是本地展示派生,不写回 JSON/NDJSON,也不需要或允许为它新增 API 查询。
223
+
224
+ #### 元素预览:显式白名单
225
+
226
+ 只有用户或上层 Agent 明确要求预览,并且 item 命中下表时才执行。两个命令都会写入 `--output`,因此输出路径必须由本次调用显式选择;不得默认覆盖已有文件。
227
+
228
+ | action | element_type | token 条件 | 精确命令 |
229
+ | --- | --- | --- | --- |
230
+ | `open` | `image` | `element_token` 非空 | `lark-cli docs +media-preview --as <same_identity> --token "<element_token>" --output "<explicit-path>"` |
231
+ | `open` | `whiteboard` | `element_token` 非空 | `lark-cli docs +media-download --as <same_identity> --type whiteboard --token "<element_token>" --output "<explicit-path>"` |
232
+ | `close` | `image`/`whiteboard` | 任意 | 零调用;pretty 只记录预览关闭 |
233
+ | 未知 | 任意 | 任意 | 零调用;不生成 pretty 条目,只保留 raw |
234
+ | `open` | 未知/空 | 任意 | 零调用;禁止把原值透传到 `--type` |
235
+ | `open` | `image`/`whiteboard` | token 为空 | 零调用;保留 `block_id/element_type/action` 并提示缺 token |
236
+
237
+ #### 失败恢复
238
+
239
+ - parser 遇到未知字段、歧义 one-of 或单 item 缺字段:保留整个事件 `payload`、`event_id/event_type/event_time` 和可用 sibling;该 item 不生成 pretty 条目,也不合成通用描述。
240
+ - `share_id` 缺失、映射未命中或 `share_doc` 冲突:回显 `share_id`、可用的 `share_doc.url/title` 与 `comment_id`;必要时重新拉取完整事件流,仍无法关联则停止,不用最近一次共享兜底。
241
+ - `share_doc` 无法解析:回显 `share_id`、`share_doc.url/title` 与 `comment_id`,提示需要有效文档 URL 或已确认的 `file_token/file_type`;不要猜 type。
242
+ - Drive API/权限失败:保留精确 batch-query 命令与 `comment_id`,根据 CLI 的 `missing_scopes/hint` 恢复权限后重试;不要扫描全部评论。
243
+ - Docs 预览失败:保留 `action/element_type/element_token/block_id` 和用户选择的输出路径,修复权限或 token 后重试同一白名单命令;不要让 `meeting-events` 自动下载兜底。
244
+ - 未知 context/type/action:保留 raw 并说明当前 CLI 没有安全路由;不得自动调用 overwrite、download 或任何猜测的 shortcut。
245
+
246
+ ### 8. 关于 `page_token` 的返回与续拉
147
247
 
148
248
  - 不管这次是只查 1 页,还是通过 `--page-all` 已经把当前可见事件都拿完,都应把最后拿到的 `page_token` 一并保留下来并返回给用户。
149
249
  - 只要响应里出现 `has_more=true`、pretty 里出现 `more available`,或返回了非空 `page_token`,就必须先判断当前结果是否完整;默认情况下,这意味着你还需要继续分页。
@@ -160,7 +260,7 @@ lark-cli vc +meeting-events --as user --meeting-id <id> --page-all --format pret
160
260
  |------|------|
161
261
  | `meeting` | 会议身份与时间状态,包含 `id/topic/meeting_no/start_time/end_time/status` |
162
262
  | `identity` | 当前读取身份,包含 `id/name/participant_type/label` |
163
- | `events` | 结构化事件列表;每条事件含参与者 `actors` 和事件细节 `payload` |
263
+ | `events` | 结构化事件列表;每条事件沿用 `event_id/event_type/event_time/actors/payload` 公共 envelope,事件专属数据保留在 `payload` |
164
264
  | `warnings` | 非阻断告警列表;事件列表本身仍可使用 |
165
265
  | `has_more` | 是否还有下一页 |
166
266
  | `page_token` | 下一页游标 |
@@ -175,6 +275,7 @@ lark-cli vc +meeting-events --as user --meeting-id <id> --page-all --format pret
175
275
  | `transcript_received` | 收到转写文本 |
176
276
  | `magic_share_started` | 开始共享内容 / 文档 |
177
277
  | `magic_share_ended` | 结束共享 |
278
+ | `document_context_changed` | 评论聚焦、章节定位或元素预览上下文变化 |
178
279
 
179
280
  ### Forwarding meeting chat and reactions to IM
180
281
 
@@ -304,12 +405,12 @@ lark-cli vc +meeting-events \
304
405
 
305
406
  ## 参考
306
407
 
307
- - [lark-vc-agent-meeting-join](lark-vc-agent-meeting-join.md) — 先真实入会
308
- - [lark-vc-agent-meeting-list-active](lark-vc-agent-meeting-list-active.md) — 发现当前可读事件的进行中会议 ID
309
- - [lark-vc-agent-meeting-leave](lark-vc-agent-meeting-leave.md) — 用户明确要求时离会
310
- - [lark-vc-search](../../lark-vc/references/lark-vc-search.md) — 搜索历史会议(获取 meeting_id)
311
- - [lark-vc-recording](../../lark-vc/references/lark-vc-recording.md) — 查询 minute_token
312
- - [lark-vc-detail](../../lark-vc/references/lark-vc-detail.md) — 获取会议详情
313
- - [lark-vc-agent](../SKILL.md) — Agent 参会能力(本 skill)
314
- - [lark-vc](../../lark-vc/SKILL.md) — 视频会议原子域(Meeting / Note 等核心概念)
408
+ - [lark-vc-agent-meeting-join](../../lark-vc-agent/references/lark-vc-agent-meeting-join.md) — 先真实入会
409
+ - [lark-vc-meeting-list-active](lark-vc-meeting-list-active.md) — 发现当前可读事件的进行中会议 ID
410
+ - [lark-vc-agent-meeting-leave](../../lark-vc-agent/references/lark-vc-agent-meeting-leave.md) — 用户明确要求时离会
411
+ - [lark-vc-search](lark-vc-search.md) — 搜索历史会议(获取 meeting_id)
412
+ - [lark-vc-recording](lark-vc-recording.md) — 查询 minute_token
413
+ - [lark-vc-detail](lark-vc-detail.md) — 获取会议详情
414
+ - [lark-vc-agent](../../lark-vc-agent/SKILL.md) — Agent 参会能力
415
+ - [lark-vc](../SKILL.md) — 视频会议原子域(Meeting / Note 等核心概念)
315
416
  - [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数