weaver-work-cli 0.1.5 → 0.1.7

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 (225) hide show
  1. package/README.md +14 -9
  2. package/dist/cmd/skills/index.js +60 -0
  3. package/dist/internal/e10/auth/commands.js +48 -32
  4. package/dist/internal/e10/auth/session.js +44 -3
  5. package/dist/internal/e10/auth/xiaoe.js +363 -11
  6. package/dist/internal/e10/context.js +4 -2
  7. package/dist/internal/skills/detector.js +42 -0
  8. package/dist/internal/skills/install.js +50 -3
  9. package/dist/shortcuts/archive/render/search-format.js +12 -3
  10. package/dist/shortcuts/ebuilder-form/continuation.js +70 -0
  11. package/dist/shortcuts/ebuilder-form/errors.js +54 -0
  12. package/dist/shortcuts/ebuilder-form/host.js +1238 -0
  13. package/dist/shortcuts/ebuilder-form/index.js +108 -0
  14. package/dist/shortcuts/ebuilder-form/manifest.js +347 -0
  15. package/dist/shortcuts/ebuilder-form/operations/read.js +157 -0
  16. package/dist/shortcuts/ebuilder-form/operations/registry.js +56 -0
  17. package/dist/shortcuts/ebuilder-form/operations/shared.js +132 -0
  18. package/dist/shortcuts/ebuilder-form/operations/types.js +19 -0
  19. package/dist/shortcuts/ebuilder-form/operations/write.js +277 -0
  20. package/dist/shortcuts/ebuilder-form/operations.js +8 -0
  21. package/dist/shortcuts/ehr/operations/salary.js +2 -140
  22. package/dist/shortcuts/im/continuation.js +70 -0
  23. package/dist/shortcuts/{yimiaoban → im}/errors.js +14 -14
  24. package/dist/shortcuts/{yimiaoban → im}/host.js +26 -26
  25. package/dist/shortcuts/{yimiaoban → im}/index.js +42 -42
  26. package/dist/shortcuts/{yimiaoban → im}/manifest.js +7 -6
  27. package/dist/shortcuts/{yimiaoban → im}/operations/file-user.js +54 -41
  28. package/dist/shortcuts/{yimiaoban → im}/operations/group-read.js +46 -44
  29. package/dist/shortcuts/{yimiaoban → im}/operations/group-write.js +113 -66
  30. package/dist/shortcuts/{yimiaoban → im}/operations/msg-sync.js +164 -141
  31. package/dist/shortcuts/{yimiaoban → im}/operations/msg-write.js +47 -47
  32. package/dist/shortcuts/{yimiaoban → im}/operations/person.js +10 -10
  33. package/dist/shortcuts/{yimiaoban → im}/operations/registry.js +10 -8
  34. package/dist/shortcuts/{yimiaoban → im}/operations/session.js +82 -83
  35. package/dist/shortcuts/im/operations/shared.js +442 -0
  36. package/dist/shortcuts/{yimiaoban → im}/operations/types.js +1 -1
  37. package/dist/shortcuts/im/operations/user-remind.js +201 -0
  38. package/dist/shortcuts/{yimiaoban → im}/operations/write-util.js +7 -7
  39. package/dist/shortcuts/{yimiaoban → im}/operations.js +3 -3
  40. package/dist/shortcuts/index.js +10 -2
  41. package/dist/shortcuts/invoice/manifest.js +113 -10
  42. package/dist/shortcuts/invoice/operations/import.js +39 -14
  43. package/dist/shortcuts/invoice/operations/reim.js +38 -18
  44. package/dist/shortcuts/invoice/operations/shared.js +35 -6
  45. package/dist/shortcuts/jiuchuanhui/manifest.js +3 -3
  46. package/dist/shortcuts/jiuchuanhui/operations/registry.js +2 -2
  47. package/dist/shortcuts/{yimiaoban → okr}/continuation.js +10 -10
  48. package/dist/shortcuts/okr/errors.js +70 -0
  49. package/dist/shortcuts/okr/host.js +169 -0
  50. package/dist/shortcuts/okr/index.js +155 -0
  51. package/dist/shortcuts/okr/manifest.js +70 -0
  52. package/dist/shortcuts/okr/operations/link.js +305 -0
  53. package/dist/shortcuts/okr/operations/read.js +481 -0
  54. package/dist/shortcuts/okr/operations/registry.js +31 -0
  55. package/dist/shortcuts/okr/operations/shared.js +381 -0
  56. package/dist/shortcuts/okr/operations/types.js +88 -0
  57. package/dist/shortcuts/okr/operations/write.js +838 -0
  58. package/dist/shortcuts/okr/operations.js +8 -0
  59. package/dist/shortcuts/project/continuation.js +70 -0
  60. package/dist/shortcuts/project/errors.js +53 -0
  61. package/dist/shortcuts/project/host.js +160 -0
  62. package/dist/shortcuts/project/index.js +106 -0
  63. package/dist/shortcuts/project/manifest.js +36 -0
  64. package/dist/shortcuts/project/operations/read.js +551 -0
  65. package/dist/shortcuts/project/operations/registry.js +31 -0
  66. package/dist/shortcuts/project/operations/shared.js +68 -0
  67. package/dist/shortcuts/project/operations/types.js +39 -0
  68. package/dist/shortcuts/project/operations/write.js +266 -0
  69. package/dist/shortcuts/project/operations.js +8 -0
  70. package/dist/shortcuts/workflow/continuation.js +508 -0
  71. package/dist/shortcuts/workflow/endpoints.js +149 -0
  72. package/dist/shortcuts/workflow/errors.js +112 -0
  73. package/dist/shortcuts/workflow/host.js +224 -0
  74. package/dist/shortcuts/workflow/index.js +116 -0
  75. package/dist/shortcuts/workflow/manifest.js +30 -0
  76. package/dist/shortcuts/workflow/operations/form.js +4159 -0
  77. package/dist/shortcuts/workflow/operations/read.js +3778 -0
  78. package/dist/shortcuts/workflow/operations/registry.js +33 -0
  79. package/dist/shortcuts/workflow/operations/shared.js +167 -0
  80. package/dist/shortcuts/workflow/operations/types.js +44 -0
  81. package/dist/shortcuts/workflow/operations/write.js +1991 -0
  82. package/dist/shortcuts/workflow/operations.js +119 -0
  83. package/dist/shortcuts/workflow/state.js +182 -0
  84. package/docs/SKILL.md +5 -3
  85. package/docs/_catalog.md +10 -1
  86. package/docs/agent-invoice.md +2 -2
  87. package/docs/agent-skill-install.md +2 -2
  88. package/docs/e10-auth.md +3 -1
  89. package/docs/ebuilder-form.md +38 -0
  90. package/docs/im.md +104 -0
  91. package/docs/invoice.md +5 -5
  92. package/docs/okr.md +122 -0
  93. package/docs/operation-manual.md +10 -7
  94. package/docs/project.md +69 -0
  95. package/docs/skill-review-2026-09-19.md +68 -0
  96. package/package.json +3 -2
  97. package/scripts/package-skill.mjs +38 -11
  98. package/scripts/sync-connector-skills.mjs +172 -0
  99. package/skill-template/business-info.json +357 -16
  100. package/skill-template/domains/ebuilder-form.md +5 -0
  101. package/skill-template/domains/okr.md +18 -0
  102. package/skill-template/domains/shijingran.md +3 -0
  103. package/skill-template/domains/skill-maker.md +4 -4
  104. package/skill-template/domains/workflow.md +22 -0
  105. package/skill-template/domains/yepiaotong.md +4 -2
  106. package/skill-template/domains/yimiaoban.md +13 -10
  107. package/skill-template/product.json +5 -0
  108. package/skill-template/skill-template.md +1 -0
  109. package/skills/weaver-e10-calendar/SKILL.md +5 -1
  110. package/skills/weaver-e10-calendar/references/calendar-query.md +7 -0
  111. package/skills/weaver-e10-calendar/references/source-manifest.json +314 -32
  112. package/skills/weaver-e10-ebuilder-form/SKILL.md +123 -0
  113. package/skills/weaver-e10-ebuilder-form/references/context-routing.md +90 -0
  114. package/skills/weaver-e10-ebuilder-form/references/custom-api.md +86 -0
  115. package/skills/weaver-e10-ebuilder-form/references/disabled-capabilities.md +50 -0
  116. package/skills/weaver-e10-ebuilder-form/references/fields-browser.md +100 -0
  117. package/skills/weaver-e10-ebuilder-form/references/list-nlist.md +91 -0
  118. package/skills/weaver-e10-ebuilder-form/references/openapi-read.md +74 -0
  119. package/skills/weaver-e10-ebuilder-form/references/openapi-write.md +86 -0
  120. package/skills/weaver-e10-ebuilder-form/references/source-manifest.json +107 -0
  121. package/skills/weaver-e10-esb/SKILL.md +1 -1
  122. package/skills/weaver-e10-esb/references/source-manifest.json +15 -14
  123. package/skills/weaver-e10-hrm/SKILL.md +1 -1
  124. package/skills/weaver-e10-hrm/references/source-manifest.json +357 -38
  125. package/skills/weaver-e10-jiuchuanhui/SKILL.md +22 -4
  126. package/skills/weaver-e10-jiuchuanhui/references/clue.md +4 -2
  127. package/skills/weaver-e10-jiuchuanhui/references/contact.md +1 -1
  128. package/skills/weaver-e10-jiuchuanhui/references/customer.md +3 -3
  129. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +1 -1
  130. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +10 -10
  131. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +3 -3
  132. package/skills/weaver-e10-jiuchuanhui/references/sale.md +7 -7
  133. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +3 -3
  134. package/skills/weaver-e10-jucailin/SKILL.md +2 -2
  135. package/skills/weaver-e10-mail/SKILL.md +22 -6
  136. package/skills/weaver-e10-meeting/SKILL.md +22 -1
  137. package/skills/weaver-e10-okr/SKILL.md +139 -0
  138. package/skills/weaver-e10-okr/references/okr-align.md +59 -0
  139. package/skills/weaver-e10-okr/references/okr-keyresult.md +68 -0
  140. package/skills/weaver-e10-okr/references/okr-link-routing.md +67 -0
  141. package/skills/weaver-e10-okr/references/okr-query.md +105 -0
  142. package/skills/weaver-e10-okr/references/okr-write.md +94 -0
  143. package/skills/weaver-e10-okr/references/source-manifest.json +672 -0
  144. package/skills/weaver-e10-plan/SKILL.md +3 -3
  145. package/skills/weaver-e10-plan/references/plan-report-write.md +1 -1
  146. package/skills/weaver-e10-plan/references/source-manifest.json +20 -20
  147. package/skills/weaver-e10-qiyecheng/SKILL.md +21 -1
  148. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +17 -17
  149. package/skills/weaver-e10-shared/SKILL.md +79 -11
  150. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +41 -8
  151. package/skills/weaver-e10-shared/references/non-interactive-environment.md +78 -0
  152. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +39 -0
  153. package/skills/weaver-e10-shijingran/SKILL.md +83 -0
  154. package/skills/weaver-e10-shijingran/references/field-resolution.md +105 -0
  155. package/skills/weaver-e10-shijingran/references/operations.md +154 -0
  156. package/skills/weaver-e10-shijingran/references/source-manifest.json +1380 -0
  157. package/skills/weaver-e10-shijingran/references/write-operations.md +90 -0
  158. package/skills/weaver-e10-skill-maker/SKILL.md +26 -9
  159. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +39 -8
  160. package/skills/weaver-e10-skill-maker/references/detector-validation.md +25 -8
  161. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +66 -5
  162. package/skills/weaver-e10-skill-maker/references/module-gap-audit-and-repair.md +86 -0
  163. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +59 -5
  164. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +16 -8
  165. package/skills/weaver-e10-wenshuding/SKILL.md +28 -4
  166. package/skills/weaver-e10-wenshuding/references/archive-search.md +14 -0
  167. package/skills/weaver-e10-wenshuding/references/source-manifest.json +27 -26
  168. package/skills/weaver-e10-workflow/SKILL.md +250 -0
  169. package/skills/weaver-e10-workflow/references/source-manifest.json +1062 -0
  170. package/skills/weaver-e10-workflow/references/workflow-agent-entry.md +96 -0
  171. package/skills/weaver-e10-workflow/references/workflow-batch.md +275 -0
  172. package/skills/weaver-e10-workflow/references/workflow-create.md +182 -0
  173. package/skills/weaver-e10-workflow/references/workflow-edit.md +106 -0
  174. package/skills/weaver-e10-workflow/references/workflow-memory.md +165 -0
  175. package/skills/weaver-e10-workflow/references/workflow-operate.md +153 -0
  176. package/skills/weaver-e10-workflow/references/workflow-query.md +821 -0
  177. package/skills/weaver-e10-workflow/references/workflow-share.md +117 -0
  178. package/skills/weaver-e10-workflow/references/workflow-view.md +189 -0
  179. package/skills/weaver-e10-yepiaotong/SKILL.md +28 -28
  180. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +11 -5
  181. package/skills/weaver-e10-yepiaotong/references/invoice-import.md +14 -8
  182. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +9 -43
  183. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +8 -0
  184. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +13 -17
  185. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +6 -7
  186. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +2 -2
  187. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1155 -553
  188. package/skills/weaver-e10-yimiaoban/SKILL.md +56 -38
  189. package/skills/weaver-e10-yimiaoban/references/ding-write.md +8 -8
  190. package/skills/weaver-e10-yimiaoban/references/error-codes.md +16 -0
  191. package/skills/weaver-e10-yimiaoban/references/field-resolution.md +10 -10
  192. package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +12 -12
  193. package/skills/weaver-e10-yimiaoban/references/group-read.md +16 -16
  194. package/skills/weaver-e10-yimiaoban/references/group-write.md +17 -15
  195. package/skills/weaver-e10-yimiaoban/references/msg-read.md +21 -17
  196. package/skills/weaver-e10-yimiaoban/references/msg-write.md +10 -10
  197. package/skills/weaver-e10-yimiaoban/references/person.md +6 -6
  198. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +15 -11
  199. package/skills/weaver-e10-yimiaoban/references/session-sysmsg.md +11 -10
  200. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +2164 -154
  201. package/skills/weaver-e10-yimiaoban/references/user-remind.md +75 -0
  202. package/skills/weaver-e10-ziguanjia/SKILL.md +4 -2
  203. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +99 -29
  204. package/tools/weaver-skill-detector-1.0.13/SKILL.md +253 -0
  205. package/tools/weaver-skill-detector-1.0.13/_meta.json +6 -0
  206. package/tools/weaver-skill-detector-1.0.13/references/checklist.md +298 -0
  207. package/tools/weaver-skill-detector-1.0.13/scripts/validate_skill.py +4190 -0
  208. package/dist/shortcuts/yimiaoban/operations/shared.js +0 -236
  209. package/docs/yimiaoban.md +0 -86
  210. package/skills/weaver-e10-calendar/product.json +0 -8
  211. package/skills/weaver-e10-esb/product.json +0 -8
  212. package/skills/weaver-e10-hrm/product.json +0 -8
  213. package/skills/weaver-e10-jiuchuanhui/product.json +0 -8
  214. package/skills/weaver-e10-jucailin/product.json +0 -8
  215. package/skills/weaver-e10-mail/product.json +0 -8
  216. package/skills/weaver-e10-meeting/product.json +0 -8
  217. package/skills/weaver-e10-plan/product.json +0 -8
  218. package/skills/weaver-e10-qiyecheng/product.json +0 -8
  219. package/skills/weaver-e10-skill-maker/product.json +0 -8
  220. package/skills/weaver-e10-wenshuding/product.json +0 -8
  221. package/skills/weaver-e10-yepiaotong/product.json +0 -8
  222. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +0 -261
  223. package/skills/weaver-e10-yimiaoban/product.json +0 -8
  224. package/skills/weaver-e10-ziguanjia/product.json +0 -8
  225. /package/dist/shortcuts/{yimiaoban → im}/operations/msg-parse.js +0 -0
@@ -2,38 +2,53 @@
2
2
  name: weaver-e10-yimiaoban
3
3
  display_name: 泛微易秒办
4
4
  display_name_en: Weaver E10 Yimiaoban IM
5
- description: 泛微 E10 易秒办即时通讯能力(单聊/群聊消息、发消息与必达、群组管理、会话与系统消息),通过 weaver-work-cli yimiaoban 命令执行。
6
- description_zh: 泛微 E10 易秒办即时通讯能力(单聊/群聊消息拉取、发送/撤回/置顶/必达、群组管理、会话与系统消息),通过 weaver-work-cli yimiaoban 命令执行。
7
- description_en: Weaver E10 Yimiaoban IM capabilities (single/group chat messages, sending/withdraw/pin/ding, group management, sessions and system messages), delivered through the weaver-work-cli yimiaoban command.
8
- version: 1.0.0
5
+ description: 泛微 E10 易秒办即时通讯能力(单聊/群聊消息、发送与必达、群组管理、会话与系统消息),通过 weaver-work-cli im 命令执行。
6
+ description_zh: 泛微 E10 易秒办即时通讯能力:拉取单聊/群聊/系统消息、发送与撤回消息、发必达、群组管理(建群/邀人/踢人/退群/解散/公告)、会话列表、文件上传下载与人员解析,全部通过 weaver-work-cli im 命令执行,写操作走 prepare→apply 确认链。
7
+ description_en: Weaver E10 Yimiaoban (IM) capabilities - fetching single/group/system messages, sending, withdrawing and ding messages, group management, sessions, file upload/download and people resolution, executed through the weaver-work-cli im command with a prepare-then-apply confirmation chain for writes.
8
+ version: 1.1.0
9
9
  author: 泛微网络科技股份有限公司
10
10
  agent_created: true
11
11
  requires:
12
12
  bins: ["weaver-work-cli"]
13
- cliHelp: "weaver-work-cli yimiaoban --help"
13
+ dependencies:
14
+ - weaver-e10-login
15
+ - weaver-e10-shared
16
+ cliHelp: "weaver-work-cli im --help"
14
17
  ---
15
18
 
16
- # 泛微易秒办
19
+ # 泛微易秒办(im)
17
20
 
18
- **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md),其中包含安装、E10 认证、JSON 输出和高风险写入规则。若不存在则必须先执行 `weaver-work-cli skills install shared --skills-dir <当前Agent的Skills目录>`,若 CLI 未安装则先执行 `npm install -g weaver-work-cli`,安装或读取失败时必须停止执行。**
21
+ **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md),其中包含安装、E10 认证、JSON 输出和高风险写入规则。若不存在则必须先执行 `weaver-work-cli skills install shared --target-dir <当前Agent的Skills目录>`,若 CLI 未安装则先执行 `npm install -g weaver-work-cli`,安装或读取失败时必须停止执行。**
19
22
 
20
23
  共享规则覆盖命令可用性检查、E10 认证、JSON 输出契约、大结果渲染和高风险写入确认链,本技能不再重复。
21
24
 
22
- 本技能覆盖易秒办(E10 即时通讯)业务域:**消息(msg)**、**必达(ding)**、**群组(group)**、**会话(session)**、**系统消息(sysmsg)**,以及支撑能力**人员解析(person)**、**文件上传/预览/下载(file)**、**用户状态(user)**、**i18n 标签(i18n)**。所有写操作走 prepare→apply 确认协议。
25
+ 本技能覆盖易秒办(E10 即时通讯)业务域:**消息(msg)**、**必达(ding)**、**群组(group)**、**会话(session)**、**系统消息(sysmsg)**,以及支撑能力**人员解析(person)**、**文件上传/预览/下载(file)**、**用户状态与免打扰设置(user)**、**i18n 标签(i18n)**。所有写操作走 prepare→apply 确认协议。
23
26
 
24
- ## 命令入口
27
+ ## 认证与请求头契约
28
+
29
+ **登录与会话一律由 `weaver-e10-login` 技能提供**(小 E 宿主环境优先 `weaver-work-cli auth xiaoe`,其它环境由用户提供自有域名后走 `weaver-work-cli auth login`)。本技能**不自建登录**:禁止扫码/账号密码/自建 OAuth 取 token,禁止使用浏览器自动化登录,也不接触、打印、转存任何认证文件。
30
+
31
+ `weaver-work-cli im` 发往 E10 的每个请求(`/api/em/msg/executeIm/...`、`/api/em/msg/createDing`、`/api/hrm/common/getEmployeeByIds`、`/api/file/...` 等)都由 CLI 统一携带以下三项用户信息参数,缺一不可(业务入参里不要传、也不要手工拼装请求头):
25
32
 
26
33
  ```text
27
- weaver-work-cli yimiaoban --help
28
- weaver-work-cli yimiaoban schema
29
- weaver-work-cli --json yimiaoban run <operation> --input -
34
+ Cookie: <weaver-e10-login 返回的完整原始 Cookie 串,原样透传,禁止裁剪/去重/改写>
35
+ eteamsid: <weaver-e10-login 返回的 ETEAMSID>
36
+ User-Agent: AgentType=<agentType>,IsAgent=true
30
37
  ```
31
38
 
32
- `schema` 是可用能力的唯一事实来源(含每个 operation 的 `inputSchema`、`risk`、`requiresConfirmation`)。禁止把本技能或源文档里的接口路径当成可直接调用的地址,也禁止把未出现在 `schema` 中的能力当作可用 operation。
39
+ 三项若缺任一,服务端无法识别操作者或会判定登录失效;`weaver-work-cli im` 的每个 operation 都已在请求头中带齐。
40
+
41
+ 业务输入只描述业务对象与意图,凭证与请求头由 CLI 托管;需要诊断登录态时只用 `weaver-work-cli auth` / `doctor --e10` 与业务命令返回的 JSON 错误。
33
42
 
34
- ## 认证
43
+ ## 命令入口
44
+
45
+ ```text
46
+ weaver-work-cli im --help
47
+ weaver-work-cli im schema
48
+ weaver-work-cli --json im run <operation> --input-json '{"key":"value"}'
49
+ ```
35
50
 
36
- 所有请求复用 `weaver-work-cli` 托管的 E10 会话(含 `eteamsid` 请求头),业务输入只描述业务对象和意图。禁止读取、列出、打印或解析 `.e10-cli` 等认证目录和文件;认证诊断只能通过 `weaver-work-cli auth` 系列命令、`weaver-work-cli doctor --e10` 和业务命令返回的 JSON 错误完成。登录失效时按共享规则引导用户执行 `weaver-work-cli auth login`,禁止猜域名或手工拼凭证。
51
+ `schema` 是可用能力的唯一事实来源(含每个 operation `inputSchema`、`risk`、`requiresConfirmation`、`deprecatedInputAliases`)。禁止把本技能或源文档里的接口路径当成可直接调用的地址,也禁止把未出现在 `schema` 中的能力当作可用 operation。
37
52
 
38
53
  ## Reference 路由表
39
54
 
@@ -41,31 +56,33 @@ weaver-work-cli --json yimiaoban run <operation> --input -
41
56
 
42
57
  | 触发条件 | Reference |
43
58
  | --- | --- |
44
- | 按姓名/工号/手机/邮箱解析人员,uid/cid 批量解析 | [`references/person.md`](references/person.md) |
45
- | 名称 → ID 解析规则、同名消歧、接口间上下文传递契约 | [`references/field-resolution.md`](references/field-resolution.md) |
46
- | 拉取单聊/群聊消息、群置顶消息、消息阅读状态(读) | [`references/msg-read.md`](references/msg-read.md) |
59
+ | 按姓名/工号/手机/邮箱解析人员,uid 批量解析 | [`references/person.md`](references/person.md) |
60
+ | 名称 → ID 解析规则、同名消歧、未匹配处理、接口间上下文传递契约 | [`references/field-resolution.md`](references/field-resolution.md) |
61
+ | 拉单聊/群聊消息、群置顶消息、消息阅读状态(只读) | [`references/msg-read.md`](references/msg-read.md) |
47
62
  | 发送单聊/群聊消息(文本/图片/文件)、撤回、群消息置顶(写) | [`references/msg-write.md`](references/msg-write.md) |
48
63
  | 必达消息:普通必达、已有消息转必达、仅未读/指定接收人(写) | [`references/ding-write.md`](references/ding-write.md) |
49
- | 搜索群、群信息、群成员、群主/管理员、群存在性、群公告(读) | [`references/group-read.md`](references/group-read.md) |
64
+ | 搜群、群信息、群成员、群主/管理员、群存在性、群公告(读) | [`references/group-read.md`](references/group-read.md) |
50
65
  | 建群、邀请、踢人、退群、解散、申请入群、改群属性/群名、群公告增改删(写) | [`references/group-write.md`](references/group-write.md) |
51
66
  | 会话列表、系统消息分组/类型/消息查询 | [`references/session-sysmsg.md`](references/session-sysmsg.md) |
52
67
  | 文件上传/预览/下载到本地、用户在线状态、i18n 标签翻译 | [`references/file-user-i18n.md`](references/file-user-i18n.md) |
53
- | 易秒办红线(操作人字段、人名解析、id 边界、分页、展示完整)、写链停止条件 | [`references/safety-boundaries.md`](references/safety-boundaries.md) |
54
- | 业务错误码含义与处理建议(群 12xx / 消息 15xx / 数据 13xx) | [`references/error-codes.md`](references/error-codes.md) |
55
- | 源资料清单与 sha256(源 skill 更新检测用) | [`references/source-manifest.json`](references/source-manifest.json) |
68
+ | 把某个群/某个人/某个系统会话设为免打扰或恢复提醒 | [`references/user-remind.md`](references/user-remind.md) |
69
+ | 易秒办红线(操作人字段、本人身份取用、人名解析、id 边界、分页与全量、展示完整)、写链停止条件、已知禁用边界 | [`references/safety-boundaries.md`](references/safety-boundaries.md) |
70
+ | 业务错误码含义与处理建议(群 12xx / 消息 15xx / 数据 13xx + CLI 校验错误) | [`references/error-codes.md`](references/error-codes.md) |
71
+ | 源资料清单、chunk 与 operation 影响索引、产物基线(源资料更新检测用) | [`references/source-manifest.json`](references/source-manifest.json) |
56
72
 
57
73
  ## 关键差异(必须先知道)
58
74
 
59
- - **消息对象以 `msg` JSON 字符串 + `datas[].data[]` 行结构返回**:CLI 的 `msg.sync.*`/`msg.top.sync` 已把每条消息解析成结构化行(`sender/time/typeName/content/media/...`),`content` 为可读文本(@ 提及已替换、媒体显示为 `[图片]名称`/`[视频]名称`/`[文件]名称`、必达内容带 `[必达]` 前缀)。解析结果直接使用,不需要再本地拼装。
60
- - **发送者「我」由 CLI 判定**:`sender` 与当前登录 uid(CLI 会话 `userId`)比对,自己发的消息返回「我」;他人优先消息内 `sname`、其次 hrm 姓名、最后回退 uid。
61
- - **人名一律由 CLI hrm 接口解析**(`/api/hrm/common/getEmployeeByIds`),本技能不展示也不依赖 IM 群成员 `name` 字段。群成员接口返回的 `name` 字段不可信且默认不请求。
62
- - **uid/cid/群 id 都是 uint64**:JSON 中必须按字符串传(`"1788334281700000004"`),CLI 会把数字/逗号串统一归一,`0` 一律拒绝。
63
- - **分页不自动翻页**:`msg.sync.*`/`session.list`/`sysmsg.*`/公告列表等每页默认 20(群搜索默认 100),单页最大 50(群搜索 200);Agent 只取单页,需要更多数据时用返回的 `nextStart`(消息类)/`nextMsgid`(会话类)显式请求下一页,绝不静默全量循环。消息类下一页会把边界那条重复返回,必须按 `msgid` 去重。
64
- - **时间范围不是过滤条件**:单聊/群聊历史消息按**消息 id 区间**定位,`from/to` 时间会被 CLI 换算成 `[minId,maxId]` 区间;默认取当天。要"拉全部历史"必须显式给出 `from/to` 或 `latest:true`(仅最新一页)。`actionMsg.code=1303`(无聊天记录)按**成功空列表**返回,不报错,具体口径看返回的 `emptyReason`。
65
- - **展示完整不截断**:消息文本有多长就展示多长,不得自行省略;正文换行/`|` 等原始字符在结构化字段中原样保留。渲染为表格/卡片时按既有消息展示红线转义 `|`、保留必达 `[必达]` 前缀与媒体可点击链接。
66
- - **媒体需要登录态**:消息行里的 `media[].previewUrl/downloadUrl` 需登录态访问,直接嵌 Markdown 401;要真正查看图片/视频或取回附件,用 `yimiaoban.file.download` 落地到本地(`output` 为明确本地路径、父目录须存在、已存在则拒绝覆盖,图片会按文件头纠正扩展名)。
67
- - **单页数量、超时与空白消息**:`num` 默认 20、单页上限 50;普通请求 15 秒超时即失败且不重试(上传 15/60 秒);全空白文本不算内容,禁止发送空白消息(返回 `content_required`)。
68
- - 写操作一律 `prepare` 向用户摘要 用户确认 `apply`;`apply` 不接受手工构造的 continuation。
75
+ - **消息以 `msg` JSON 字符串 + `datas[].datas[]` 行结构返回**:CLI 的 `msg.sync.*`/`msg.top.sync` 已把每条消息解析成结构化行(`msgid/sender/time/typeName/content/media/must/fileName/...`),`content` 是可读文本(@ 提及已还原、媒体显示为 `[图片]名称`/`[视频]名称`/`[文件]名称`、必达内容带 `[必达]` 前缀)。解析结果直接使用,不要再本地拼装。
76
+ - **分页口径(与源 skill 一致)**:消息类每页默认 **50** 条、单页上限 **50**;**有界区间(指定了时间范围、默认当天、或显式 `end`/`endId`)自动循环翻页把区间拉完再返回**(最多 100 页,触及上限时返回 `hasMore:true` + `nextStart`);**无界区间(`latest:true`)只拉一页**,需要更早数据时用 `nextStart` 继续。**会话列表(`session.list`)不参与自动翻页**(默认 20、上限 50,用 `msgid`/`nextMsgid` 翻页)。
77
+ - **时间范围强制收敛到 7 天**:单聊/群聊/系统消息的 `from`/`to` 跨度 > 7 天时,CLI 自动缩短为该范围**最后 7 个自然日**,并在 `data.rangeShrink` 返回 `notice`。**展示结果时必须把这条收敛提示原样转述给用户**,不要静默省略,也不要替用户改小范围。
78
+ - **展示顺序**:消息按消息 id 从新到旧(最新在前)返回;`content` 完整不截断,表格化时自行转义 `|`、保留换行与 `[必达]` 前缀、媒体保持可点击链接。
79
+ - **发送者「我」由 CLI 判定**:`sender` 与当前登录人 IM uid 比对,自己发的消息返回「我」;他人优先消息内 `sname`、其次 hrm 姓名、最后回退 uid。
80
+ - **人名一律由 CLI 走 hrm 解析**(`/api/hrm/common/getEmployeeByIds`),本技能不展示也不依赖 IM 群成员 `name` 字段;群成员接口返回的 `name` 不可信。
81
+ - **本人 IM 身份(cid/uid)只用于本机组装**:`group.search` `members/owner/creator` 条件、撤回消息体、必达消息体、建群自检、消息展示「我」都用 CLI 通过 `teamsCheck` 取得的本人 `imCid`/`imUid`;**它绝不作为请求体操作人字段,也不接受调用方传入**(传 `user`/`sender`/`operator` 会被拒绝:`forbidden_key`)。
82
+ - **uid/cid/群 id 都是 uint64**:JSON 中必须按字符串传(`"1788334281700000004"`),`0` 一律拒绝;`num` 超过 50 会被截断为 50。
83
+ - **时间范围不是服务端过滤条件**:单聊/群聊历史按**消息 id 区间**定位,CLI `from/to` 换算成 `[minId,maxId]`;缺省取当天。`actionMsg.code=1303`(无聊天记录)按**成功空列表**返回(`empty:true` + `emptyReason`),不报错。
84
+ - **媒体需要登录态**:`media[].previewUrl/downloadUrl` 需登录态访问,直接嵌 Markdown 401;要真正查看图片/视频或取回附件,用 `im.file.download` 落地到本地(`output` 为明确本地路径、父目录须存在、已存在则拒绝覆盖,图片会按文件头纠正扩展名)。
85
+ - **超时与空白消息**:普通请求 15 秒超时即失败且不重试(上传 15/60 秒);全空白文本不算内容,禁止发送空白消息(`content_required`)。
69
86
 
70
87
  ## 写操作决策树(prepare → apply)
71
88
 
@@ -76,14 +93,15 @@ weaver-work-cli --json yimiaoban run <operation> --input -
76
93
  3. 用户确认后调用 `<op>.apply`,传 `{"confirm":true,"continuation":"<prepare 返回的 token>"}`。
77
94
  4. `apply` 返回 `partial` / `write_uncertain` 或网络中断时**立即停止,不自动重试**,先做一次只读回查(如群成员、消息是否已存在)再决定。
78
95
 
79
- 任何一步出现登录失效/上下文变化(`context_mismatch`/`continuation_expired`)都回到第一步重新 prepare。
96
+ 任何一步出现登录失效/上下文变化(`context_mismatch`/`continuation_expired`/`target_changed`)都回到第一步重新 prepare。
80
97
 
81
98
  ## 失败处理
82
99
 
83
100
  - 业务失败看 stderr JSON 的 `error.type` / `error.subtype` / `error.message`,不要用退出码 `0` 判断成功。
84
- - `code=302` 或认证类错误:引导用户执行 `weaver-work-cli auth login`。
101
+ - `code=302` 或认证类错误(`session_expired`):按共享规则引导用户重新登录,禁止猜域名或手工拼凭证。
85
102
  - 业务语义错误码:`1303` 表示无聊天记录(成功空列表,看 `emptyReason`);群不存在 `1209`;`members_resolve_failed`/`members_empty` 说明成员解析失败,向用户说明后请其决定是否 `removeFailed:true` 继续;其余码值对照 [`references/error-codes.md`](references/error-codes.md)。
86
- - 展示给用户时保持"完整不截断"红线,参考 [`references/safety-boundaries.md`](references/safety-boundaries.md)。
103
+ - `alias_conflict`:旧字段(如 `filePath`/`shareGroups`)与新字段同时出现且取值不一致,请只保留一个。
104
+ - 展示给用户时保持「完整不截断」红线,参考 [`references/safety-boundaries.md`](references/safety-boundaries.md)。
87
105
 
88
106
  ## 平台兼容
89
107
 
@@ -92,13 +110,13 @@ weaver-work-cli --json yimiaoban run <operation> --input -
92
110
  Windows PowerShell:
93
111
 
94
112
  ```powershell
95
- weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":20,"latest":true}'
113
+ weaver-work-cli --json im run im.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":50,"latest":true}'
96
114
  ```
97
115
 
98
116
  macOS/Linux(bash/zsh):
99
117
 
100
118
  ```bash
101
- weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":20,"latest":true}'
119
+ weaver-work-cli --json im run im.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":50,"latest":true}'
102
120
  ```
103
121
 
104
- 复杂 JSON 建议保存为 UTF-8 文件后按平台传给 `--input <file>`。
122
+ 复杂 JSON 建议保存为 UTF-8 文件后按平台传给 `--input <file>`;Windows PowerShell 下不要使用 `printf`、`~/` 路径或反斜杠续行。
@@ -6,7 +6,7 @@
6
6
 
7
7
  | operation 对 | 动作 |
8
8
  | --- | --- |
9
- | `yimiaoban.ding.send.prepare` / `.apply` | 发普通必达 或 已有消息转必达(走 `/api/em/msg/createDing`,非 executeIm) |
9
+ | `im.ding.send.prepare` / `.apply` | 发普通必达 或 已有消息转必达(走 `/api/em/msg/createDing`,非 executeIm) |
10
10
 
11
11
  ## 场景与输入要点
12
12
 
@@ -30,15 +30,15 @@
30
30
  Windows PowerShell:
31
31
 
32
32
  ```powershell
33
- weaver-work-cli --json yimiaoban run yimiaoban.ding.send.prepare --input-json '{"groupId":"1788334281700000004","txt":"请今天下班前确认三季度预算"}'
34
- weaver-work-cli --json yimiaoban run yimiaoban.ding.send.prepare --input-json '{"groupId":"1788334281700000004","convertMsgid":"9000000000000000001","unreadOnly":true}'
33
+ weaver-work-cli --json im run im.ding.send.prepare --input-json '{"groupId":"1788334281700000004","txt":"请今天下班前确认三季度预算"}'
34
+ weaver-work-cli --json im run im.ding.send.prepare --input-json '{"groupId":"1788334281700000004","convertMsgid":"9000000000000000001","unreadOnly":true}'
35
35
  ```
36
36
 
37
37
  macOS/Linux(bash/zsh):
38
38
 
39
39
  ```bash
40
- weaver-work-cli --json yimiaoban run yimiaoban.ding.send.prepare --input-json '{"groupId":"1788334281700000004","txt":"请今天下班前确认三季度预算"}'
41
- weaver-work-cli --json yimiaoban run yimiaoban.ding.send.prepare --input-json '{"groupId":"1788334281700000004","convertMsgid":"9000000000000000001","unreadOnly":true}'
40
+ weaver-work-cli --json im run im.ding.send.prepare --input-json '{"groupId":"1788334281700000004","txt":"请今天下班前确认三季度预算"}'
41
+ weaver-work-cli --json im run im.ding.send.prepare --input-json '{"groupId":"1788334281700000004","convertMsgid":"9000000000000000001","unreadOnly":true}'
42
42
  ```
43
43
 
44
44
  向用户展示 prepare 的 `summary`(动作=发送必达/转必达、目标=群/单聊、是否全体/未读/指定人、是否发短信),确认后:
@@ -46,20 +46,20 @@ weaver-work-cli --json yimiaoban run yimiaoban.ding.send.prepare --input-json '{
46
46
  Windows PowerShell:
47
47
 
48
48
  ```powershell
49
- weaver-work-cli --json yimiaoban run yimiaoban.ding.send.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
49
+ weaver-work-cli --json im run im.ding.send.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
50
50
  ```
51
51
 
52
52
  macOS/Linux(bash/zsh):
53
53
 
54
54
  ```bash
55
- weaver-work-cli --json yimiaoban run yimiaoban.ding.send.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
55
+ weaver-work-cli --json im run im.ding.send.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
56
56
  ```
57
57
 
58
58
  ## 注意
59
59
 
60
60
  - 必达是**高打扰**动作:默认全体成员 + 发短信,必须向用户明确说明接收范围和短信费用,经确认后才 apply。
61
61
  - `unreadOnly:true` 转必达依赖目标消息存在且群内有未读人员;源消息找不到(`source_not_found`)或全员已读(`unread_empty`)都会失败,按错误向用户说明,不自动回退全员。
62
- - apply 不确定(网络/超时)时停止,用 `yimiaoban.msg.top.sync`/拉群消息或系统消息只读回查必达是否已发出,**不自动重试**(避免重复必达)。
62
+ - apply 不确定(网络/超时)时停止,用 `im.msg.top.sync`/拉群消息或系统消息只读回查必达是否已发出,**不自动重试**(避免重复必达)。
63
63
 
64
64
  ## 失败处理
65
65
 
@@ -41,6 +41,7 @@
41
41
  | 1233 / 1237 / 1246 | 部门群/全员群/事项群已存在 | 普通群建群不涉及;如需其他类型请在客户端操作 |
42
42
  | 1269 / 1270 | 创建群聊功能关闭 / 超过每日建群上限 | 联系管理员或改日再试 |
43
43
  | 1271 | 加入群需要对方同意 | 属于审批流程,等待管理员/群主处理 |
44
+ | 1210(退群后) | 退出群聊后再对同一群执行 `join` / `destroy` 会被拒绝 | 群主或最后一人退群会让群变成无主空群,只能由客户端或管理员处理;`group.exit.prepare` 已内置该风险护栏 |
44
45
 
45
46
  ## 消息相关
46
47
 
@@ -72,6 +73,7 @@
72
73
  | subtype | 含义与处理 |
73
74
  |---|---|
74
75
  | `forbidden_key` | 输入含操作人字段(`user`/`sender`/`creator` 等),去掉后重试 |
76
+ | `alias_conflict` | 旧字段(`filePath`/`shareGroups`)与新字段(`file`/`shareGroup`)同时出现且取值不一致,只保留一个 |
75
77
  | `id_invalid` / `id_required` | uid/cid/群 id 缺失、为 0 或非数字 |
76
78
  | `content_required` | 发送内容为空(含全空白文本)或必达既无 `txt` 也无 `convertMsgid` |
77
79
  | `content_conflict` | 一次只允许一种媒体(`img` 与 `file` 不能同时传) |
@@ -81,5 +83,19 @@
81
83
  | `unread_only_group_only` | `unreadOnly` 仅支持群聊转必达 |
82
84
  | `source_not_found` / `source_invalid` / `unread_empty` | 转必达源消息缺失/无法解析、群内无未读人员(不自动回退全员) |
83
85
  | `self_not_included` | 建群成员必须包含操作者自己 |
86
+ | `owner_exit_ack_required` | 群主或最后一个成员退群未传 `acknowledgeOrphanRisk:true`(退群后群会变成无主空群,无法再 join/destroy) |
84
87
  | `output_required` / `output_parent_missing` / `output_exists` | `file.download` 输出路径缺失、父目录不存在、目标已存在(拒绝覆盖) |
85
88
  | `context_mismatch` / `continuation_expired` / `target_changed` | 确认上下文变化/过期/目标变化,重新 `prepare` |
89
+ | `self_identity_missing` / `self_identity_incomplete` | 当前登录态解析不到本人 `imCid`/`imUid`(`group.search` 的 members/owner/creator、撤回、必达、建群自检需要),按共享规则重新登录后重试;**不要用 0 兜底** |
90
+ | `num_invalid` / `time_invalid` | `num` 非正整数,或时间参数无法解析(支持 unix 秒 / `YYYY-MM-DD` / `YYYY-MM-DD HH:mm:ss`) |
91
+ | `session_type_invalid` / `reminder_invalid` | 会话提醒设置(`im.user.setRemind`)的 `sessionType` 不是 `1` 单聊会话 / `2` 群聊会话 / `4` 系统会话,或 `reminder` 不是 `0` 接收提醒 / `1` 免打扰 |
92
+ | `target_required` 补充 | 会话免打扰目标缺失:单聊会话缺 `toUid`/`toCid`、群聊会话缺 `groupId`、系统会话缺 `group` |
93
+
94
+ ## 拉取口径相关的成功语义(非错误)
95
+
96
+ | 现象 | 说明 |
97
+ | --- | --- |
98
+ | `data.empty=true` + `emptyReason` | `actionMsg.code=1303`(无聊天记录)按成功空列表返回,用 `emptyReason` 说明是"当天无消息/时间范围无消息/会话无历史" |
99
+ | `data.rangeShrink.notice` | 时间范围跨度 > 7 天时自动收敛为该范围最后 7 天,**必须把 notice 转述给用户** |
100
+ | `data.pages` / `data.autoPaged` / `data.hasMore` / `data.nextStart` | 本次实际拉了几页、是否自动翻页、是否还有更早数据、续拉锚点(有界区间自动翻页最多 100 页) |
101
+ | `data.hasMore=true` 且 `cappedAtMaxPages=true` | 已达单次自动翻页上限,用 `nextStart` 显式续拉 |
@@ -12,10 +12,10 @@
12
12
 
13
13
  | 对象 | 解析方式 | 产出 |
14
14
  | --- | --- | --- |
15
- | 人员 | `yimiaoban.person.resolve`(姓名/工号/手机/邮箱模糊,走 hrm) | `uid`、`cid`(**成对使用**,对方 cid 可能与本人不同) |
16
- | 人员(批量) | `yimiaoban.person.resolveByIds`(uid 列表 → 姓名/部门/cid) | 姓名、`cid`、部门、岗位 |
17
- | 群聊 | `yimiaoban.group.search`(`name` + `precise:true` 精确匹配) | `id`(群 id) |
18
- | 系统消息分组 | `yimiaoban.sysmsg.groupSearch`(名称模糊) | `groupId`、`typesIds` |
15
+ | 人员 | `im.person.resolve`(姓名/工号/手机/邮箱模糊,走 hrm) | `uid`、`cid`(**成对使用**,对方 cid 可能与本人不同) |
16
+ | 人员(批量) | `im.person.resolveByIds`(uid 列表 → 姓名/部门/cid) | 姓名、`cid`、部门、岗位 |
17
+ | 群聊 | `im.group.search`(`name` + `precise:true` 精确匹配) | `id`(群 id) |
18
+ | 系统消息分组 | `im.sysmsg.groupSearch`(名称模糊) | `groupId`、`typesIds` |
19
19
 
20
20
  解析优先级:① 本对话已出现的实体直接复用(已解析的 uid/cid、已拉取会话里的群 id);② 精确匹配;③ 模糊搜索 + 消歧。**禁止跳过前两步直接全量模糊搜索。**
21
21
 
@@ -38,9 +38,9 @@
38
38
 
39
39
  | 上游操作(产出) | 提取字段 | 下游操作(消费) |
40
40
  | --- | --- | --- |
41
- | `yimiaoban.person.resolve` | `uid`、`cid` | `msg.send.single`(`toUid`/`toCid`)、`msg.sync.single`(`fromUid`/`fromCid`)、`ding.send`(单聊 `toUid`/`toCid`)、`group.invite`/`group.kick`/`group.create`(`users`) |
42
- | `yimiaoban.group.search` / `group.info` | `groupId` | `msg.sync.group`、`msg.send.group`、`ding.send`(群)、`group.users`/`group.admins`/`group.invite`/`group.kick`/`group.exit`/`group.destroy`/`group.modify`/`group.rename`/`group.announce.*` |
43
- | `yimiaoban.session.list` | 会话类型、`fuser.uid/cid`(单聊)、`lastMsgid`(翻页锚点)、系统会话 `group` | `msg.sync.single` / `msg.sync.group` / `sysmsg.query`;翻页传 `msgid` |
44
- | `yimiaoban.msg.sync.*` / `msg.top.sync` | `messages[].msgid`(`ser_msgid`)、`media[].fileId`、`nextStart` | `msg.withdraw`(`msgid`)、`msg.top.set`(`msgid`)、`ding.send`(`convertMsgid`)、`file.download`(`fileId`+`msgid`)、下一页 `start`/`startId` |
45
- | `yimiaoban.sysmsg.groupSearch` / `sysmsg.typeSync` | `groupId`、`typeId` | `sysmsg.query`(`group`/`type`) |
46
- | `yimiaoban.file.upload` | `fileObj.id` | 发消息的 `img`/`file`(或直接用本地路径让 CLI 内部上传) |
41
+ | `im.person.resolve` | `uid`、`cid` | `msg.send.single`(`toUid`/`toCid`)、`msg.sync.single`(`fromUid`/`fromCid`)、`ding.send`(单聊 `toUid`/`toCid`)、`group.invite`/`group.kick`/`group.create`(`users`) |
42
+ | `im.group.search` / `group.info` | `groupId` | `msg.sync.group`、`msg.send.group`、`ding.send`(群)、`group.users`/`group.admins`/`group.invite`/`group.kick`/`group.exit`/`group.destroy`/`group.modify`/`group.rename`/`group.announce.*` |
43
+ | `im.session.list` | 会话类型、`fuser.uid/cid`(单聊)、`lastMsgid`(翻页锚点)、系统会话 `group` | `msg.sync.single` / `msg.sync.group` / `sysmsg.query`;翻页传 `msgid` |
44
+ | `im.msg.sync.*` / `msg.top.sync` | `messages[].msgid`(`ser_msgid`)、`media[].fileId`、`nextStart` | `msg.withdraw`(`msgid`)、`msg.top.set`(`msgid`)、`ding.send`(`convertMsgid`)、`file.download`(`fileId`+`msgid`)、下一页 `start`/`startId` |
45
+ | `im.sysmsg.groupSearch` / `sysmsg.typeSync` | `groupId`、`typeId` | `sysmsg.query`(`group`/`type`) |
46
+ | `im.file.upload` | `fileObj.id` | 发消息的 `img`/`file`(或直接用本地路径让 CLI 内部上传) |
@@ -6,15 +6,15 @@
6
6
 
7
7
  | operation | 用途 |
8
8
  | --- | --- |
9
- | `yimiaoban.file.upload` | 上传本地文件(module=im),返回 fileObj + 消息对象形态(供 `img`/`file` 引用) |
10
- | `yimiaoban.file.preview` | 生成图片/视频预览与下载 URL(需登录态访问;图片支持 small/large/original) |
11
- | `yimiaoban.file.download` | 把消息里的图片/视频/文件**下载到本地**(需登录态;父目录须存在、拒绝覆盖) |
12
- | `yimiaoban.user.state` | 查指定人员各在线设备状态(sub_state 强制 0 不订阅) |
13
- | `yimiaoban.i18n.labels` | 批量翻译国际化标签 id → 当前语言文案 |
9
+ | `im.file.upload` | 上传本地文件(module=im),返回 fileObj + 消息对象形态(供 `img`/`file` 引用) |
10
+ | `im.file.preview` | 生成图片/视频预览与下载 URL(需登录态访问;图片支持 small/large/original) |
11
+ | `im.file.download` | 把消息里的图片/视频/文件**下载到本地**(需登录态;父目录须存在、拒绝覆盖) |
12
+ | `im.user.state` | 查指定人员各在线设备状态(sub_state 强制 0 不订阅) |
13
+ | `im.i18n.labels` | 批量翻译国际化标签 id → 当前语言文案 |
14
14
 
15
15
  ## 输入要点
16
16
 
17
- - `file.upload`:`file` 本地路径(兼容旧名 `filePath`)+ 可选 `name`/`shareGroup`(发群消息用,兼容 `shareGroups`)/`shareUsers`(uid 数组,发单聊用)/`permission`。返回 `fileObj`、`img`、`file` 两种消息对象形态;发消息也可以直接传本地路径让 CLI 内部上传。
17
+ - `file.upload`:`file` 本地路径 + 可选 `name`/`shareGroup`(发群消息用)/`shareUsers`(uid 数组,发单聊用)/`permission`。旧名 `filePath`(= `file`)与 `shareGroups`(= `shareGroup`)仍兼容,但**与新名同时出现且取值不一致会返回 `alias_conflict`**(不要依赖静默覆盖)。返回 `fileObj`、`img`、`file` 两种消息对象形态;发消息也可以直接传本地路径让 CLI 内部上传。
18
18
  - `file.preview`:需要 `fileId` + `msgid` + `kind`(img/video) + 场景(`groupId` 或 `toUid`+`toCid`);`imgFormat` small/large/original。返回的是**绝对地址**(含 baseUrl),但需要登录态才能访问,直接嵌 Markdown 会 401。
19
19
  - `file.download`:`fileId` + `msgid` + `output`(明确的本地文件路径)+ 场景(`groupId` 或 `toUid`+`toCid`);可选 `kind`(img/video/file,默认 img)、`imgFormat`(默认 small,要原图传 original)。父目录必须存在,目标文件已存在会拒绝覆盖;下载内容若是图片且扩展名与文件头不符会自动纠正(如实际为 PNG 时 `.jpg` → `.png`,返回 `renamedFrom`)。
20
20
  - 用户状态:`users` uid 数组(不要写成 `uids`)+ 可选 `devType` 过滤;`mask` 控制返回字段(默认 7)。解析失败的 uid 需确认后传 `removeFailed:true` 跳过。
@@ -26,17 +26,17 @@
26
26
  Windows PowerShell:
27
27
 
28
28
  ```powershell
29
- weaver-work-cli --json yimiaoban run yimiaoban.file.upload --input-json '{"file":"C:\\tmp\\方案.docx","name":"方案.docx"}'
30
- weaver-work-cli --json yimiaoban run yimiaoban.file.download --input-json '{"fileId":"FILE1","msgid":"1788334281700000004","kind":"img","groupId":"1788334281700000004","output":"C:\\tmp\\photo.png"}'
31
- weaver-work-cli --json yimiaoban run yimiaoban.i18n.labels --input-json '{"ids":["1001","1002"]}'
29
+ weaver-work-cli --json im run im.file.upload --input-json '{"file":"C:\\tmp\\方案.docx","name":"方案.docx"}'
30
+ weaver-work-cli --json im run im.file.download --input-json '{"fileId":"FILE1","msgid":"1788334281700000004","kind":"img","groupId":"1788334281700000004","output":"C:\\tmp\\photo.png"}'
31
+ weaver-work-cli --json im run im.i18n.labels --input-json '{"ids":["1001","1002"]}'
32
32
  ```
33
33
 
34
34
  macOS/Linux(bash/zsh):
35
35
 
36
36
  ```bash
37
- weaver-work-cli --json yimiaoban run yimiaoban.file.upload --input-json '{"file":"/tmp/方案.docx","name":"方案.docx"}'
38
- weaver-work-cli --json yimiaoban run yimiaoban.file.download --input-json '{"fileId":"FILE1","msgid":"1788334281700000004","kind":"img","groupId":"1788334281700000004","output":"/tmp/photo.png"}'
39
- weaver-work-cli --json yimiaoban run yimiaoban.i18n.labels --input-json '{"ids":["1001","1002"]}'
37
+ weaver-work-cli --json im run im.file.upload --input-json '{"file":"/tmp/方案.docx","name":"方案.docx"}'
38
+ weaver-work-cli --json im run im.file.download --input-json '{"fileId":"FILE1","msgid":"1788334281700000004","kind":"img","groupId":"1788334281700000004","output":"/tmp/photo.png"}'
39
+ weaver-work-cli --json im run im.i18n.labels --input-json '{"ids":["1001","1002"]}'
40
40
  ```
41
41
 
42
42
  ## 输出处理
@@ -6,14 +6,14 @@
6
6
 
7
7
  | operation | 用途 |
8
8
  | --- | --- |
9
- | `yimiaoban.group.search` | 按条件搜群(`name`/`type`/`members`/`owner`/`creator`/`today`/`yesterday`/`createBegin`/`createEnd`,服务端过滤) |
10
- | `yimiaoban.group.info` | 群基础信息(`groupIds` 数组或 `groupId`,支持批量) |
11
- | `yimiaoban.group.users` | 群成员列表(`groupId`;`syncType` 0 全量/1 增量 + `clientUc` 游标) |
12
- | `yimiaoban.group.admins` | 群主/管理员批量获取(`mask` 位 1=群主/负责人、2=管理员,默认 3) |
13
- | `yimiaoban.group.exist` | 群是否存在(ret=0 存在;1209 不存在) |
14
- | `yimiaoban.group.userExist` | 某用户是否在群内 |
15
- | `yimiaoban.group.announce.get` | 群公告(`aid` 不传/0 = 最新) |
16
- | `yimiaoban.group.announce.list` | 公告列表(id 降序,`end_flag` 表示是否还有下一页) |
9
+ | `im.group.search` | 按条件搜群(`name`/`type`/`members`/`owner`/`creator`/`today`/`yesterday`/`createBegin`/`createEnd`,服务端过滤) |
10
+ | `im.group.info` | 群基础信息(`groupIds` 数组或 `groupId`,支持批量) |
11
+ | `im.group.users` | 群成员列表(`groupId`;`syncType` 0 全量/1 增量 + `clientUc` 游标) |
12
+ | `im.group.admins` | 群主/管理员批量获取(`mask` 位 1=群主/负责人、2=管理员,默认 3) |
13
+ | `im.group.exist` | 群是否存在(ret=0 存在;1209 不存在) |
14
+ | `im.group.userExist` | 某用户是否在群内 |
15
+ | `im.group.announce.get` | 群公告(`aid` 不传/0 = 最新) |
16
+ | `im.group.announce.list` | 公告列表(id 降序,`end_flag` 表示是否还有下一页) |
17
17
 
18
18
  ## 输入要点
19
19
 
@@ -28,23 +28,23 @@
28
28
  Windows PowerShell:
29
29
 
30
30
  ```powershell
31
- weaver-work-cli --json yimiaoban run yimiaoban.group.search --input-json '{"members":true,"pageSize":100}'
32
- weaver-work-cli --json yimiaoban run yimiaoban.group.users --input-json '{"groupId":"1788334281700000004"}'
33
- weaver-work-cli --json yimiaoban run yimiaoban.group.info --input-json '{"groupIds":["1788334281700000004"]}'
31
+ weaver-work-cli --json im run im.group.search --input-json '{"members":true,"pageSize":100}'
32
+ weaver-work-cli --json im run im.group.users --input-json '{"groupId":"1788334281700000004"}'
33
+ weaver-work-cli --json im run im.group.info --input-json '{"groupIds":["1788334281700000004"]}'
34
34
  ```
35
35
 
36
36
  macOS/Linux(bash/zsh):
37
37
 
38
38
  ```bash
39
- weaver-work-cli --json yimiaoban run yimiaoban.group.search --input-json '{"members":true,"pageSize":100}'
40
- weaver-work-cli --json yimiaoban run yimiaoban.group.users --input-json '{"groupId":"1788334281700000004"}'
41
- weaver-work-cli --json yimiaoban run yimiaoban.group.info --input-json '{"groupIds":["1788334281700000004"]}'
39
+ weaver-work-cli --json im run im.group.search --input-json '{"members":true,"pageSize":100}'
40
+ weaver-work-cli --json im run im.group.users --input-json '{"groupId":"1788334281700000004"}'
41
+ weaver-work-cli --json im run im.group.info --input-json '{"groupIds":["1788334281700000004"]}'
42
42
  ```
43
43
 
44
44
  ## 输出处理
45
45
 
46
- - 群搜索结果量大时按共享规则汇总渲染(列群名/id/人数/类型),不要整表倾倒。
47
- - 成员列表渲染姓名走 `data.members[].name`(hrm 解析结果),角色取 `roleName`、入群时间取 `addTime`。展示大群成员时按需分页输出。
46
+ - 群搜索结果:`data.groups[]` 每行是 `id`(群 id)/`name`/`type`/`num`(群人数)/`createTime`;结果量大时按共享规则汇总渲染(列群名/id/人数/类型),不要整表倾倒。
47
+ - 成员列表:`data.members[].name` 是 hrm 解析结果,角色取 `roleName`、入群时间取 `addTime`;响应还带 `totalNum`(成员总数)、`endFlag`、`serverUc`(增量同步游标)。展示大群成员时按需分页输出。
48
48
  - 「谁在群里」用 `group.userExist`:返回 `users[].inGroup` 布尔,便于区分在群/不在群。
49
49
  - 群公告内容同样"完整展示不截断"。
50
50
 
@@ -6,15 +6,15 @@
6
6
 
7
7
  | operation 对 | 动作 |
8
8
  | --- | --- |
9
- | `yimiaoban.group.create.prepare` / `.apply` | 创建普通群 |
10
- | `yimiaoban.group.invite.prepare` / `.apply` | 邀请成员入群 |
11
- | `yimiaoban.group.kick.prepare` / `.apply` | 踢出群成员 |
12
- | `yimiaoban.group.exit.prepare` / `.apply` | 退出群聊 |
13
- | `yimiaoban.group.destroy.prepare` / `.apply` | **解散群聊**(仅群主,不可恢复) |
14
- | `yimiaoban.group.join.prepare` / `.apply` | 申请加入群聊(`groupId` 或 `token`) |
15
- | `yimiaoban.group.modify.prepare` / `.apply` | 批量改群属性(人数/开关/管理员/转让群主等,batModGroupInfo) |
16
- | `yimiaoban.group.rename.prepare` / `.apply` | 单字段改群信息(群名/历史/群主/显示/打扰/标记/gtid) |
17
- | `yimiaoban.group.announce.modify.prepare` / `.apply` | 新增/修改/删除群公告 |
9
+ | `im.group.create.prepare` / `.apply` | 创建普通群 |
10
+ | `im.group.invite.prepare` / `.apply` | 邀请成员入群 |
11
+ | `im.group.kick.prepare` / `.apply` | 踢出群成员 |
12
+ | `im.group.exit.prepare` / `.apply` | 退出群聊 |
13
+ | `im.group.destroy.prepare` / `.apply` | **解散群聊**(仅群主,不可恢复) |
14
+ | `im.group.join.prepare` / `.apply` | 申请加入群聊(`groupId` 或 `token`) |
15
+ | `im.group.modify.prepare` / `.apply` | 批量改群属性(人数/开关/管理员/转让群主等,batModGroupInfo) |
16
+ | `im.group.rename.prepare` / `.apply` | 单字段改群信息(群名/历史/群主/显示/打扰/标记/gtid) |
17
+ | `im.group.announce.modify.prepare` / `.apply` | 新增/修改/删除群公告 |
18
18
 
19
19
  ## 输入要点
20
20
 
@@ -26,21 +26,22 @@
26
26
  - 建群成功返回新建群 `groupId`(服务端字段 `group_id`)与 `rawData`;`group.announce.modify` 新增/修改返回 `aid`,删除返回被删除的 `aid` 且 `deleted:true`。
27
27
  - 公告:`annouce` 内容;`aid` 缺省/0=新增、非 0=修改、`del:true`+`aid`=删除。`notice` 0 发通知(默认)/1 不发/2 发并@全体;`fmark` 新人必看。
28
28
  - 群 id 一律字符串非 0。
29
+ - **加入群(`group.join`)是"提交申请"而不是"立即进群"**(联机实测):`apply` 成功会返回 `flag:0` + `note:"需管理员/群主审批"`,真正入群要等群主/管理员审批;若该群已无成员或不允许申请,会直接业务失败 `1210 没有权限`。申请后不要反复重试,也不要自行猜测是否已入群,用 `group.userExist` 复核。
29
30
 
30
31
  ## 命令
31
32
 
32
33
  Windows PowerShell:
33
34
 
34
35
  ```powershell
35
- weaver-work-cli --json yimiaoban run yimiaoban.group.invite.prepare --input-json '{"groupId":"1788334281700000004","users":["100234","100235"]}'
36
- weaver-work-cli --json yimiaoban run yimiaoban.group.rename.prepare --input-json '{"groupId":"1788334281700000004","name":"季度评审群"}'
36
+ weaver-work-cli --json im run im.group.invite.prepare --input-json '{"groupId":"1788334281700000004","users":["100234","100235"]}'
37
+ weaver-work-cli --json im run im.group.rename.prepare --input-json '{"groupId":"1788334281700000004","name":"季度评审群"}'
37
38
  ```
38
39
 
39
40
  macOS/Linux(bash/zsh):
40
41
 
41
42
  ```bash
42
- weaver-work-cli --json yimiaoban run yimiaoban.group.invite.prepare --input-json '{"groupId":"1788334281700000004","users":["100234","100235"]}'
43
- weaver-work-cli --json yimiaoban run yimiaoban.group.rename.prepare --input-json '{"groupId":"1788334281700000004","name":"季度评审群"}'
43
+ weaver-work-cli --json im run im.group.invite.prepare --input-json '{"groupId":"1788334281700000004","users":["100234","100235"]}'
44
+ weaver-work-cli --json im run im.group.rename.prepare --input-json '{"groupId":"1788334281700000004","name":"季度评审群"}'
44
45
  ```
45
46
 
46
47
  向用户展示 `summary`(动作/群/人数/变更字段),确认后:
@@ -48,18 +49,19 @@ weaver-work-cli --json yimiaoban run yimiaoban.group.rename.prepare --input-json
48
49
  Windows PowerShell:
49
50
 
50
51
  ```powershell
51
- weaver-work-cli --json yimiaoban run yimiaoban.group.invite.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
52
+ weaver-work-cli --json im run im.group.invite.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
52
53
  ```
53
54
 
54
55
  macOS/Linux(bash/zsh):
55
56
 
56
57
  ```bash
57
- weaver-work-cli --json yimiaoban run yimiaoban.group.invite.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
58
+ weaver-work-cli --json im run im.group.invite.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
58
59
  ```
59
60
 
60
61
  ## 注意
61
62
 
62
63
  - 踢人、解散、转让群主都是不可逆/高影响动作,summary 必须讲清对象与后果,等用户明确确认。
64
+ - **退群(`group.exit`)有护栏**:`prepare` 会只读回查群人数与群主;当你**是群主**或**是群里最后一个成员**时,必须显式传 `acknowledgeOrphanRisk:true` 才会签发 continuation,否则返回 `owner_exit_ack_required`。原因(联机实测):这两种情形退群后群会变成**无主空群**,之后 `group.join` / `group.destroy` 都会被服务端拒绝(`1210 没有权限`),只能由客户端或管理员处理——不要为了"演练"随意退掉自己建的群。
63
65
  - 退群/解散/踢人前可先 `group.users` 只读回查当前成员与身份,避免误操作。
64
66
  - apply 阶段只传 `confirm:true` + continuation;业务参数以 prepare 快照为准。
65
67
  - 不确定结果(partial/超时)时**不自动重试**,先 `group.info`/`group.users` 回查实际状态。
@@ -6,18 +6,19 @@
6
6
 
7
7
  | operation | 用途 |
8
8
  | --- | --- |
9
- | `yimiaoban.msg.sync.single` | 拉单聊消息(必填 `fromUid`+`fromCid`,为**对方**身份) |
10
- | `yimiaoban.msg.sync.group` | 拉群聊消息(必填 `groupId`;type=0 由 CLI 固定,无需传) |
11
- | `yimiaoban.msg.top.sync` | 群置顶消息摘要 + 内容(必填 `groupId`) |
12
- | `yimiaoban.msg.read.single` | 单聊消息阅读状态(`msgids`=自己发出 / `recvMsgids`=自己接收) |
13
- | `yimiaoban.msg.read.group` | 群消息阅读汇总(每条已读/未读情况) |
14
- | `yimiaoban.msg.read.group.detail` | 群阅读详情(unread/read 数 + 每人状态,支持分页) |
9
+ | `im.msg.sync.single` | 拉单聊消息(必填 `fromUid`+`fromCid`,为**对方**身份) |
10
+ | `im.msg.sync.group` | 拉群聊消息(必填 `groupId`;type=0 由 CLI 固定,无需传) |
11
+ | `im.msg.top.sync` | 群置顶消息摘要 + 内容(必填 `groupId`) |
12
+ | `im.msg.read.single` | 单聊消息阅读状态(`msgids`=自己发出 / `recvMsgids`=自己接收) |
13
+ | `im.msg.read.group` | 群消息阅读汇总(每条已读/未读情况) |
14
+ | `im.msg.read.group.detail` | 群阅读详情(unread/read 数 + 每人状态,支持分页) |
15
15
 
16
16
  ## 输入要点
17
17
 
18
- - `fromUid`/`fromCid`/`groupId` 必须是**字符串数字**,禁止 `0`。对方 uid/cid 用 `yimiaoban.person.resolve`(按姓名/工号/手机/邮箱)先拿到,不要猜。
19
- - 单页 `num` 默认 20、上限 50。**CLI 只返回一页**,不自动翻页。
20
- - 时间范围:`from`/`to` 支持 `YYYY-MM-DD`、`YYYY-MM-DD HH:mm:ss`、unix 秒。默认当天。要跨天拉取必须显式给 `from`/`to`(内部换算成消息 id 区间);给 `latest:true` 则忽略日期拉最新一页。
18
+ - `fromUid`/`fromCid`/`groupId` 必须是**字符串数字**,禁止 `0`。对方 uid/cid 用 `im.person.resolve`(按姓名/工号/手机/邮箱)先拿到,不要猜。
19
+ - 每页 `num` 默认 **50**、单页上限 **50**(超过会被截断为 50)。
20
+ - **翻页口径**:**有界区间**(给了 `from`/`to`、缺省当天、或显式 `end`/`endId`)→ CLI 在该区间内**自动循环翻页拉完再返回**(最多 100 页;触及上限时 `hasMore:true` + `nextStart`);**无界区间**(`latest:true`)→ **只拉一页**,需要更早数据时把 `nextStart` 作为下一次的 `start`/`startId` 再请求。
21
+ - 时间范围:`from`/`to` 支持 `YYYY-MM-DD`、`YYYY-MM-DD HH:mm:ss`、unix 秒;缺省为当天。**跨度 > 7 天时 CLI 自动收敛为该范围最后 7 个自然日**,并在 `data.rangeShrink.notice` 给出提示——**必须把这条提示转述给用户**(例如"拉上个月"→实际只拉最后 7 天)。要覆盖更早历史时按 ≤ 7 天分段多次调用。
21
22
  - 显式 id 区间优先级最高:单聊用 `start`/`end`,群聊用 `startId`/`endId`(消息 id 即 `ser_msgid`,取自上页首/尾行)。
22
23
  - `imgFormat`:`small`(默认)`large`/`original`,决定图片预览 URL 规格。
23
24
 
@@ -26,30 +27,33 @@
26
27
  Windows PowerShell:
27
28
 
28
29
  ```powershell
29
- weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":20,"latest":true}'
30
- weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.single --input-json '{"fromUid":"100234","fromCid":"102","from":"2026-08-01","to":"2026-08-31"}'
31
- weaver-work-cli --json yimiaoban run yimiaoban.msg.top.sync --input-json '{"groupId":"1788334281700000004"}'
30
+ weaver-work-cli --json im run im.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":50,"latest":true}'
31
+ weaver-work-cli --json im run im.msg.sync.single --input-json '{"fromUid":"100234","fromCid":"102","from":"2026-08-01","to":"2026-08-31"}'
32
+ weaver-work-cli --json im run im.msg.top.sync --input-json '{"groupId":"1788334281700000004"}'
32
33
  ```
33
34
 
34
35
  macOS/Linux(bash/zsh):
35
36
 
36
37
  ```bash
37
- weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":20,"latest":true}'
38
- weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.single --input-json '{"fromUid":"100234","fromCid":"102","from":"2026-08-01","to":"2026-08-31"}'
39
- weaver-work-cli --json yimiaoban run yimiaoban.msg.top.sync --input-json '{"groupId":"1788334281700000004"}'
38
+ weaver-work-cli --json im run im.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":50,"latest":true}'
39
+ weaver-work-cli --json im run im.msg.sync.single --input-json '{"fromUid":"100234","fromCid":"102","from":"2026-08-01","to":"2026-08-31"}'
40
+ weaver-work-cli --json im run im.msg.top.sync --input-json '{"groupId":"1788334281700000004"}'
40
41
  ```
41
42
 
42
43
  ## 输出处理
43
44
 
44
45
  - `data.messages[]` 是已解析的结构化行:`sender`(姓名,走 hrm)、`time`、`typeName`(文本/图片/视频/文件…)、`content`(完整文本,不截断)、`media`(图片/视频/文件的预览与下载 URL,需登录态访问)、`must`(必达标记,`true` 展示加 `[必达]` 前缀)等。
46
+ - 顺序:消息按消息 id **从新到旧**(最新在最前)返回。
47
+ - 分页字段:`pages`(本次实际拉了几页)、`autoPaged`(是否走了自动翻页)、`pageSize`、`exhausted`、`hasMore`、`nextStart`(还有更早数据时的续拉锚点)、`range.scope`(`today`/`range`/`latest`/`explicit-id`)、`rangeShrink`(7 天收敛提示)。
45
48
  - `sender` 为自己时显示「我」(CLI 用会话 uid 判定);媒体消息的 `content` 形如 `[图片]a.png` / `[视频]b.mp4` / `[文件]c.pdf`,同时单列 `fileName` 便于渲染。
46
49
  - 展示整段消息**不自行截断**;若将多行渲染进表格,保留换行提示、把 `|` 转义,媒体链接保留为可点击的 Markdown 链接。
47
- - `data.hasMore` 为 `true` 时用返回的 `data.nextStart`(本页最小 `ser_msgid`)作为下页 `start`/`startId` 再请求;**服务端会重复返回该边界消息,务必按 `msgid` 去重**。除非用户明确要连续翻页,否则只交付当前页并告知还有更早内容。
50
+ - `data.hasMore=true` 时用 `data.nextStart`(本次最小 `ser_msgid`)作为下页 `start`/`startId` 再请求(保持同一时间范围);CLI 已按 `msgid` 去重服务端重复返回的边界消息。**不要**为了"统计总数"而反复续拉(见 [`safety-boundaries.md`](safety-boundaries.md) 红线)。
48
51
  - `data.empty=true` 表示本次为空页(`actionMsg.code=1303`):按成功处理,用 `data.emptyReason` 向用户说明口径(当天无消息 / 该时间范围无消息 / 该会话暂无任何消息记录),不要当报错重试。
52
+ - 展示口径必须写明本次实际范围(如"默认拉了今天,共 N 条"或"已自动收敛为 2026-09-09~2026-09-15,自动翻页拉完共 N 条")。
49
53
 
50
54
  ## 注意
51
55
 
52
- - 消息内容可能较长(含敏感业务信息),返回内容会进入大模型上下文;拉取范围默认当天,跨天/全量必须经用户确认。
56
+ - 消息内容可能较长(含敏感业务信息),返回内容会进入大模型上下文;缺省范围是当天,跨天大量拉取前先和用户确认口径("拉全部历史"要分段,不要指望一次拉完)。
53
57
  - 群聊必须给 `type=0` 是内部固定行为,接口文档要求,无需业务传入。
54
58
 
55
59
  ## 失败处理